package st.gravel.support.compiler.ast;
/*
This file is automatically generated from typed smalltalk source. Do not edit by hand.
(C) AG5.com
*/
import java.math.BigInteger;
import st.gravel.support.jvm.NonLocalReturn;
import java.util.Map;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.*;
public class SelectorConverter extends Object implements Cloneable {
public static SelectorConverter_Factory factory = new SelectorConverter_Factory();
Map<st.gravel.core.Symbol, String> _map;
Map<String, st.gravel.core.Symbol> _reverseMap;
Map<Character, String> _specialCharacters;
Map<String, Character> _specialCharactersReverse;
public static class SelectorConverter_Factory extends st.gravel.support.jvm.SmalltalkFactory {
public SelectorConverter basicNew() {
SelectorConverter newInstance = new SelectorConverter();
newInstance.initialize();
return newInstance;
}
public String selectorAsFunctionName_(final String _aSymbolOrString) {
return this.basicNew().selectorAsFunctionName_(st.gravel.core.Symbol.value(_aSymbolOrString));
}
}
static public String _selectorAsFunctionName_(Object receiver, final String _aSymbolOrString) {
return factory.selectorAsFunctionName_(_aSymbolOrString);
}
public SelectorConverter addSelector_functionName_(final st.gravel.core.Symbol _sel, final String _fn) {
_map.put(_sel, _fn);
_reverseMap.put(_fn, _sel);
return this;
}
public SelectorConverter copy() {
try {
SelectorConverter _temp1 = (SelectorConverter) this.clone();
_temp1.postCopy();
return _temp1;
} catch (CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
public st.gravel.core.Symbol decodeSelector_(final String _aString) {
final java.nio.CharBuffer _str;
String _directive;
final StringBuilder _wstr;
_wstr = st.gravel.support.jvm.WriteStreamFactory.on_(new String());
_str = st.gravel.support.jvm.ReadStreamFactory.on_(_aString);
boolean _temp1 = false;
while (!_temp1) {
_temp1 = st.gravel.support.jvm.ReadStreamExtensions.atEnd(_str);
if (!_temp1) {
final char _ch;
_ch = st.gravel.support.jvm.ReadStreamExtensions.next(_str);
if (st.gravel.support.jvm.CharacterExtensions.equals_(_ch, '_')) {
_wstr.append(':');
} else {
if (st.gravel.support.jvm.CharacterExtensions.equals_(_ch, '$')) {
_directive = st.gravel.support.jvm.ReadStreamExtensions.upTo_(_str, '$');
_wstr.append(_specialCharactersReverse.get(_directive));
} else {
_wstr.append(_ch);
}
}
}
}
return st.gravel.core.Symbol.value(_wstr.toString());
}
public String encodeSelector_(final st.gravel.core.Symbol _aSymbol) {
final StringBuilder _wStr;
final String _str;
final java.nio.CharBuffer _rstr;
_str = _aSymbol.asString();
if (_str.length() == 0) {
return "$empty";
}
_wStr = st.gravel.support.jvm.WriteStreamFactory.on_(new String());
_rstr = st.gravel.support.jvm.ReadStreamFactory.on_(_str);
boolean _temp1 = false;
while (!_temp1) {
_temp1 = st.gravel.support.jvm.ReadStreamExtensions.atEnd(_rstr);
if (!_temp1) {
String _sc;
final Character _ch;
_ch = st.gravel.support.jvm.ReadStreamExtensions.next(_rstr);
if (st.gravel.support.jvm.CharacterExtensions.equals_(_ch, ':')) {
_wStr.append('_');
} else {
String _temp2 = _specialCharacters.get(_ch);
_sc = ((String) _temp2);
if (_sc == null) {
_wStr.append(_ch);
} else {
_wStr.append('$');
_wStr.append(_sc);
_wStr.append('$');
}
}
}
}
return _wStr.toString();
}
public SelectorConverter_Factory factory() {
return factory;
}
public st.gravel.core.Symbol functionNameAsSelector_(final String _aString) {
st.gravel.core.Symbol _temp1 = _reverseMap.get(_aString);
if (_temp1 == null) {
_temp1 = this.decodeSelector_(_aString);
}
return ((st.gravel.core.Symbol) _temp1);
}
public String functionNameForNumArgs_(final int _numArgs) {
if (st.gravel.support.jvm.IntegerExtensions.equals_(_numArgs, 0)) {
return "value";
}
return new st.gravel.core.Interval(1, _numArgs).join_(((st.gravel.support.jvm.Block1<String, Integer>) (new st.gravel.support.jvm.Block1<String, Integer>() {
@Override
public String value_(final Integer _i) {
return (String) "value_";
}
})));
}
public SelectorConverter initialize() {
this.initializeForStaticLinking_(false);
return this;
}
public SelectorConverter initializeForStaticLinking_(final boolean _aBoolean) {
this.initializeSpecialCharacters();
_map = new java.util.HashMap<st.gravel.core.Symbol, String>();
_reverseMap = new java.util.HashMap<String, st.gravel.core.Symbol>();
_reverseMap.put("$empty", st.gravel.core.Symbol.value(""));
if (_aBoolean) {
SelectorConverter.this.mapForStaticLinking();
}
for (final st.gravel.core.Symbol _sym : this.javaReservedKeywords()) {
SelectorConverter.this.addSelector_functionName_(_sym, "r_" + _sym.asString());
}
for (final String _v : st.gravel.support.jvm.SetExtensions.copy(_map.values())) {
SelectorConverter.this.addSelector_functionName_(st.gravel.core.Symbol.value(_v), "_lit_" + _v);
}
return this;
}
public SelectorConverter initializeSpecialCharacters() {
_specialCharacters = new java.util.HashMap<Character, String>();
_specialCharactersReverse = new java.util.HashMap<String, Character>();
_specialCharacters.put('~', "tilde");
_specialCharacters.put('!', "exclamation");
_specialCharacters.put('@', "at");
_specialCharacters.put('%', "percent");
_specialCharacters.put('&', "and");
_specialCharacters.put('*', "times");
_specialCharacters.put('-', "minus");
_specialCharacters.put('+', "plus");
_specialCharacters.put('=', "equals");
_specialCharacters.put('|', "pipe");
_specialCharacters.put('/', "slash");
_specialCharacters.put('\\', "backslash");
_specialCharacters.put('<', "less");
_specialCharacters.put('>', "more");
_specialCharacters.put(',', "comma");
_specialCharacters.put('?', "wat");
_specialCharacters.put('_', "underscore");
_specialCharacters.put('$', "dollar");
_specialCharacters.put(':', "_");
for (final Map.Entry<Character, String> _temp1 : st.gravel.support.jvm.DictionaryExtensions.copy(_specialCharacters).entrySet()) {
char _k = _temp1.getKey();
String _v = _temp1.getValue();
_specialCharactersReverse.put(_v, _k);
}
return this;
}
public st.gravel.core.Symbol[] javaReservedKeywords() {
return new st.gravel.core.Symbol[] { st.gravel.core.Symbol.value("abstract"), st.gravel.core.Symbol.value("assert"), st.gravel.core.Symbol.value("boolean"), st.gravel.core.Symbol.value("break"), st.gravel.core.Symbol.value("byte"), st.gravel.core.Symbol.value("case"), st.gravel.core.Symbol.value("catch"), st.gravel.core.Symbol.value("char"), st.gravel.core.Symbol.value("class"), st.gravel.core.Symbol.value("const"), st.gravel.core.Symbol.value("continue"), st.gravel.core.Symbol.value("default"), st.gravel.core.Symbol.value("do"), st.gravel.core.Symbol.value("double"), st.gravel.core.Symbol.value("else"), st.gravel.core.Symbol.value("enum"), st.gravel.core.Symbol.value("extends"), st.gravel.core.Symbol.value("false"), st.gravel.core.Symbol.value("final"), st.gravel.core.Symbol.value("finally"), st.gravel.core.Symbol.value("float"), st.gravel.core.Symbol.value("for"), st.gravel.core.Symbol.value("goto"), st.gravel.core.Symbol.value("if"), st.gravel.core.Symbol.value("implements"), st.gravel.core.Symbol.value("import"), st.gravel.core.Symbol.value("instanceof"), st.gravel.core.Symbol.value("int"), st.gravel.core.Symbol.value("interface"), st.gravel.core.Symbol.value("long"), st.gravel.core.Symbol.value("native"), st.gravel.core.Symbol.value("new"), st.gravel.core.Symbol.value("package"), st.gravel.core.Symbol.value("private"), st.gravel.core.Symbol.value("protected"), st.gravel.core.Symbol.value("public"), st.gravel.core.Symbol.value("return"), st.gravel.core.Symbol.value("short"), st.gravel.core.Symbol.value("static"), st.gravel.core.Symbol.value("strictfp"), st.gravel.core.Symbol.value("super"), st.gravel.core.Symbol.value("switch"), st.gravel.core.Symbol.value("synchronized"), st.gravel.core.Symbol.value("this"), st.gravel.core.Symbol.value("throw"), st.gravel.core.Symbol.value("throws"), st.gravel.core.Symbol.value("transient"), st.gravel.core.Symbol.value("true"), st.gravel.core.Symbol.value("try"), st.gravel.core.Symbol.value("void"), st.gravel.core.Symbol.value("volatile"), st.gravel.core.Symbol.value("wait"), st.gravel.core.Symbol.value("while") };
}
public st.gravel.core.Symbol keywordFunctionNameAsSelector_(final String _aString) {
return st.gravel.core.Symbol.value(st.gravel.support.jvm.ArrayExtensions.joinWith_(st.gravel.support.jvm.StringExtensions.tokensBasedOn_(_aString, '_'), ":"));
}
public SelectorConverter mapForStaticLinking() {
this.addSelector_functionName_(st.gravel.core.Symbol.value("="), "equals");
this.addSelector_functionName_(st.gravel.core.Symbol.value("hash"), "hashCode");
this.addSelector_functionName_(st.gravel.core.Symbol.value("copy"), "clone");
this.addSelector_functionName_(st.gravel.core.Symbol.value("printString"), "toString");
return this;
}
public SelectorConverter postCopy() {
return this;
}
public String selectorAsFunctionName_(final st.gravel.core.Symbol _aSymbol) {
String _temp1 = _map.get(_aSymbol);
if (_temp1 == null) {
_temp1 = this.encodeSelector_(_aSymbol);
}
return ((String) _temp1);
}
public String selectorForNumArgs_(final int _numArgs) {
if (st.gravel.support.jvm.IntegerExtensions.equals_(_numArgs, 0)) {
return "value";
}
return new st.gravel.core.Interval(1, _numArgs).join_(((st.gravel.support.jvm.Block1<String, Integer>) (new st.gravel.support.jvm.Block1<String, Integer>() {
@Override
public String value_(final Integer _i) {
return (String) "value:";
}
})));
}
}