jaroslav@717: /** jaroslav@717: * Back 2 Browser Bytecode Translator jaroslav@717: * Copyright (C) 2012 Jaroslav Tulach jaroslav@717: * jaroslav@717: * This program is free software: you can redistribute it and/or modify jaroslav@717: * it under the terms of the GNU General Public License as published by jaroslav@717: * the Free Software Foundation, version 2 of the License. jaroslav@717: * jaroslav@717: * This program is distributed in the hope that it will be useful, jaroslav@717: * but WITHOUT ANY WARRANTY; without even the implied warranty of jaroslav@717: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the jaroslav@717: * GNU General Public License for more details. jaroslav@717: * jaroslav@717: * You should have received a copy of the GNU General Public License jaroslav@717: * along with this program. Look for COPYING file in the top folder. jaroslav@717: * If not, see http://opensource.org/licenses/GPL-2.0. jaroslav@717: */ jaroslav@717: package org.apidesign.bck2brwsr.ide.editor; jaroslav@717: jaroslav@717: /** jaroslav@717: * An implementation of {@linkplain JsniCommentTokenizer.Sink} that generates B2B jaroslav@717: */ jaroslav@717: class ManglingSink implements JsniCommentTokenizer.Sink { jaroslav@717: jaroslav@717: final StringBuilder out = new StringBuilder(); jaroslav@717: jaroslav@717: public void javascript(String s) { jaroslav@717: out.append(s); jaroslav@717: } jaroslav@717: jaroslav@717: public void method(String clazz, String method, String signature) { jaroslav@717: out.append(mangle(clazz, method, signature)); jaroslav@717: } jaroslav@717: jaroslav@717: public void field(String clazz, String field) { jaroslav@717: // out.append(field); jaroslav@717: out.append('_').append(field).append('(').append(')'); jaroslav@717: } jaroslav@717: jaroslav@717: jaroslav@717: @Override jaroslav@717: public String toString() { jaroslav@717: return out.toString(); jaroslav@717: } jaroslav@717: jaroslav@717: jaroslav@717: static String mangle(String clazz, String method, String signature) { jaroslav@717: final StringBuilder builder = new StringBuilder(); jaroslav@717: builder.append(method); jaroslav@717: builder.append("__"); jaroslav@717: builder.append(mangle(JNIHelper.signature(JNIHelper.method(clazz, method, signature).getReturnType()))); jaroslav@717: builder.append(mangle(signature)); jaroslav@717: return builder.toString(); jaroslav@717: } jaroslav@717: jaroslav@717: jaroslav@717: static String mangle(String txt) { jaroslav@717: final StringBuilder sb = new StringBuilder(); jaroslav@717: for (int i = 0; i < txt.length(); i++) { jaroslav@717: final char ch = txt.charAt(i); jaroslav@717: switch (ch) { jaroslav@717: case '/': sb.append('_'); break; jaroslav@717: case '_': sb.append("_1"); break; jaroslav@717: case ';': sb.append("_2"); break; jaroslav@717: case '[': sb.append("_3"); break; jaroslav@717: default: sb.append(ch); break; jaroslav@717: } jaroslav@717: } jaroslav@717: return sb.toString(); jaroslav@717: } jaroslav@717: }