# HG changeset patch # User Jaroslav Tulach # Date 1360755902 -3600 # Node ID b93760cedf023a574a70125a9f21ec9348a2bfe9 # Parent 58ce0cd13d2688aeff6558e75c64c1e7d1259606 Using Igor's tokenizer in Lahvac's hint diff -r 58ce0cd13d26 -r b93760cedf02 ide/editor/src/main/java/org/apidesign/bck2brwsr/ide/editor/JNIHelper.java --- a/ide/editor/src/main/java/org/apidesign/bck2brwsr/ide/editor/JNIHelper.java Wed Feb 13 12:08:00 2013 +0100 +++ b/ide/editor/src/main/java/org/apidesign/bck2brwsr/ide/editor/JNIHelper.java Wed Feb 13 12:45:02 2013 +0100 @@ -26,7 +26,7 @@ * To facilitate lookup of methods by name and signature, instead of manually parsing signatures, * constructs the map of all methods and uses Class.getName() to generate almost-correct signatures. */ -public class JNIHelper { +class JNIHelper { static Method method(String clazz, String method, String signature) { final Map methods = methodMap(JNIHelper.clazz(clazz)); diff -r 58ce0cd13d26 -r b93760cedf02 ide/editor/src/main/java/org/apidesign/bck2brwsr/ide/editor/JSNI2JavaScriptBody.java --- a/ide/editor/src/main/java/org/apidesign/bck2brwsr/ide/editor/JSNI2JavaScriptBody.java Wed Feb 13 12:08:00 2013 +0100 +++ b/ide/editor/src/main/java/org/apidesign/bck2brwsr/ide/editor/JSNI2JavaScriptBody.java Wed Feb 13 12:45:02 2013 +0100 @@ -55,8 +55,6 @@ }) public class JSNI2JavaScriptBody { - private static final Pattern JSNIPattern = Pattern.compile("/\\*-\\{(.*)}-\\*/"); - @TriggerTreeKind(Kind.METHOD) @Messages("ERR_JSNI2JavaScriptBody=Can convert JSNI to @JavaScriptBody") public static ErrorDescription computeWarning(final HintContext ctx) { @@ -88,7 +86,12 @@ case LINE_COMMENT: break; case JAVADOC_COMMENT: break; case BLOCK_COMMENT: - if (JSNIPattern.matcher(ts.token().text()).matches()) { + final CharSequence tok = ts.token().text(); + final int l = tok.length(); + if (l > 4 + && tok.subSequence(0, 4).toString().equals("/*-{") // NOI18N + && tok.subSequence(l - 4, l).toString().equals("}-*/") // NOI18N + ) { return ts.offsetToken(); } break; @@ -120,25 +123,24 @@ //XXX: warn? return ; } - - Matcher m = JSNIPattern.matcher(jsniComment.text()); - - if (!m.matches()) return ; //XXX: warn? + + JsniCommentTokenizer tok = new JsniCommentTokenizer(); + ManglingSink ms = new ManglingSink(); + final CharSequence cmnt = jsniComment.text(); + tok.process(cmnt.subSequence(4, cmnt.length() - 4), ms); TreeMaker make = ctx.getWorkingCopy().getTreeMaker(); MethodTree mt = (MethodTree) ctx.getPath().getLeaf(); List params = new ArrayList(); - params.add(make.Literal("this")); - for (VariableTree p : mt.getParameters()) { params.add(make.Literal(p.getName().toString())); } AnnotationTree jsBody = make.Annotation(make.QualIdent("org.apidesign.bck2brwsr.core.JavaScriptBody"), Arrays.asList( - make.Assignment(make.Identifier("body"), make.Literal(m.group(1))), - make.Assignment(make.Identifier("args"), make.NewArray(null, Collections.emptyList(), params)) + make.Assignment(make.Identifier("args"), make.NewArray(null, Collections.emptyList(), params)), + make.Assignment(make.Identifier("body"), make.Literal(ms.out.toString())) ) ); diff -r 58ce0cd13d26 -r b93760cedf02 ide/editor/src/main/java/org/apidesign/bck2brwsr/ide/editor/JsniCommentTokenizer.java --- a/ide/editor/src/main/java/org/apidesign/bck2brwsr/ide/editor/JsniCommentTokenizer.java Wed Feb 13 12:08:00 2013 +0100 +++ b/ide/editor/src/main/java/org/apidesign/bck2brwsr/ide/editor/JsniCommentTokenizer.java Wed Feb 13 12:45:02 2013 +0100 @@ -20,14 +20,14 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -public class JsniCommentTokenizer { +final class JsniCommentTokenizer { /** * Tokenize the contents of JSNI comment into the provided {@linkplain Sink}. * @param in the contents of JSNI comment * @param out the sink that consumes parsed tokens */ - public void process(final String in, final Sink out) { + public void process(final CharSequence in, final Sink out) { final Matcher member = Pattern.compile("@([^:]+)::([a-zA-Z_$][a-zA-Z\\d_$]*)").matcher(in); final Matcher signature = Pattern.compile("\\(([^\\)]*)\\)").matcher(in); @@ -36,7 +36,7 @@ if (member.find(i)) { final int memberStart = member.start(); final int memberEnd = member.end(); - if (memberStart > i) out.javascript(in.substring(i, memberStart)); + if (memberStart > i) out.javascript(in.subSequence(i, memberStart).toString()); final String clazz = member.group(1); final String name = member.group(2); @@ -53,14 +53,14 @@ i = memberEnd; } } else { - out.javascript(in.substring(i, in.length())); + out.javascript(in.subSequence(i, in.length()).toString()); break; } } } - public static interface Sink { + static interface Sink { void javascript(String s); void method(String clazz, String method, String signature); diff -r 58ce0cd13d26 -r b93760cedf02 ide/editor/src/test/java/org/apidesign/bck2brwsr/ide/editor/DejsniReaderTest.java --- a/ide/editor/src/test/java/org/apidesign/bck2brwsr/ide/editor/DejsniReaderTest.java Wed Feb 13 12:08:00 2013 +0100 +++ b/ide/editor/src/test/java/org/apidesign/bck2brwsr/ide/editor/DejsniReaderTest.java Wed Feb 13 12:45:02 2013 +0100 @@ -33,10 +33,11 @@ " }-*/;\n" + "}\n"; - String expected = "class Test {\n" + + String expected = " import org.apidesign.bck2brwsr.core.JavaScriptBody;\n" + + "class Test {\n" + "\n" + " /** javadoc */\n" + - " @org.apidesign.bck2brwsr.core.JavaScriptBody(args = { }, body = \"\\n // body\\n \")\n" + + " @JavaScriptBody(args = {}, body = \"\\n // body\\n \")\n" + " public native void test();\n" + "}\n"; @@ -44,7 +45,7 @@ .input(s) .classpath(FileUtil.getArchiveRoot(JavaScriptBody.class.getProtectionDomain().getCodeSource().getLocation())) .run(JSNI2JavaScriptBody.class) - .findWarning("2:23-2:26:verifier:" + Bundle.ERR_JSNI2JavaScriptBody()) + .findWarning("2:23-2:27:verifier:" + Bundle.ERR_JSNI2JavaScriptBody()) .applyFix() .assertCompilable() .assertOutput(expected); @@ -62,18 +63,20 @@ " }-*/;\n" + "}\n"; - String expected = "class Test {\n" + + String expected = " import org.apidesign.bck2brwsr.core.JavaScriptBody;\n" + + "class Test {\n" + "\n" + " /** javadoc */\n" + " @SuppressWarnings(\"unused\")\n" + - " @org.apidesign.bck2brwsr.core.JavaScriptBody(args = { }, body = \"\\n // body\\n \")\n" + + " // comment\n" + + " @JavaScriptBody(args = {}, body = \"\\n // body\\n \")\n" + " public native void test();\n" + "}\n"; HintTest.create() .input(s) .classpath(FileUtil.getArchiveRoot(JavaScriptBody.class.getProtectionDomain().getCodeSource().getLocation())) .run(JSNI2JavaScriptBody.class) - .findWarning("2:23-2:26:verifier:" + Bundle.ERR_JSNI2JavaScriptBody()) + .findWarning("4:23-4:27:verifier:" + Bundle.ERR_JSNI2JavaScriptBody()) .applyFix() .assertCompilable() .assertOutput(expected);