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:"; } }))); } }