Java tutorial
/* * Copyright 2014 TWO SIGMA OPEN SOURCE, LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.twosigma.beaker.javash.autocomplete; import java.util.ArrayList; import java.util.List; import org.antlr.v4.runtime.ANTLRInputStream; import org.antlr.v4.runtime.CommonTokenStream; import org.antlr.v4.runtime.Lexer; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.tree.ParseTreeWalker; import com.twosigma.beaker.autocomplete.AutocompleteCandidate; import com.twosigma.beaker.autocomplete.AutocompleteRegistry; import com.twosigma.beaker.autocomplete.ClassUtils; import com.twosigma.beaker.autocomplete.ClasspathScanner; import com.twosigma.beaker.javash.autocomplete.JavaLexer; import com.twosigma.beaker.javash.autocomplete.JavaParser; public class JavaAutocomplete { AutocompleteRegistry registry; private ClasspathScanner cps; private List<String> imports; public JavaAutocomplete(ClasspathScanner _cps) { this(_cps, JavaCompletionTypes.NUM_TYPES); } public JavaAutocomplete(ClasspathScanner _cps, int num) { registry = new AutocompleteRegistry(num); setup(registry); cps = _cps; for (String pkg : cps.getPackages()) { String[] pkgv = pkg.split("\\."); AutocompleteCandidate c = new AutocompleteCandidate(JavaCompletionTypes.PACKAGE_NAME, pkgv); registry.addCandidate(c); List<String> cls = cps.getClasses(pkg); if (cls != null && !cls.isEmpty()) { c = new AutocompleteCandidate(JavaCompletionTypes.FQ_TYPE, pkgv); AutocompleteCandidate l = c; while (l.hasChildren()) { l = l.getChildrens().get(0); } for (String cl : cls) { l.addChildren(new AutocompleteCandidate(JavaCompletionTypes.FQ_TYPE, cl)); } registry.addCandidate(c); } } imports = new ArrayList<String>(); } /* * These are meant to be extended by personalized plugin versions. */ protected void moreSetup(AutocompleteRegistry r) { } protected void moreSetup(ClassUtils cu) { } public void addImport(String imp) { imports.add(imp); } private void addDefaultImports(ClassUtils cu) { for (String imp : imports) { // this imports using '*' if (imp.endsWith(".*")) { String st = imp.substring(0, imp.length() - 2); String[] txtv = st.split("\\."); AutocompleteCandidate c = new AutocompleteCandidate(JavaCompletionTypes.PACKAGE_NAME, txtv); registry.addCandidate(c); List<String> cls = cps.getClasses(st); if (cls != null) { c = new AutocompleteCandidate(JavaCompletionTypes.FQ_TYPE, txtv); AutocompleteCandidate l = c.findLeaf(); for (String s : cls) { l.addChildren(new AutocompleteCandidate(JavaCompletionTypes.CUSTOM_TYPE, s)); registry.addCandidate(new AutocompleteCandidate(JavaCompletionTypes.CUSTOM_TYPE, s)); cu.defineClassShortName(s, st + "." + s); } registry.addCandidate(c); } } else { String[] txtv = imp.split("\\."); AutocompleteCandidate c = new AutocompleteCandidate(JavaCompletionTypes.PACKAGE_NAME, txtv, txtv.length - 1); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.FQ_TYPE, txtv); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.CUSTOM_TYPE, txtv[txtv.length - 1]); registry.addCandidate(c); cu.defineClassShortName(txtv[txtv.length - 1], imp); } } } private void setup(AutocompleteRegistry r) { AutocompleteCandidate c; c = new AutocompleteCandidate(JavaCompletionTypes.INITIAL, "package"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TOPLEVEL, "import"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TOPLEVEL, "public"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TOPLEVEL, "class"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TOPLEVEL, "abstract"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TOPLEVEL, "enum"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TOPLEVEL, "final"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TOPLEVEL, "interface"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TOPLEVEL, "private"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TOPLEVEL, "protected"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TOPLEVEL, "static"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.CLASSLEVEL, "extends"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.CLASSLEVEL, "implements"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.BLOCKLEVEL, "if"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.BLOCKLEVEL, "for"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.BLOCKLEVEL, "while"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.BLOCKLEVEL, "do"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.BLOCKLEVEL, "else"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.BLOCKLEVEL, "try"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.BLOCKLEVEL, "catch"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.BLOCKLEVEL, "switch"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.BLOCKLEVEL, "return"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.BLOCKLEVEL, "throw"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.BLOCKLEVEL, "break"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.BLOCKLEVEL, "continue"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.BLOCKLEVEL, "synchronized"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.BLOCKLEVEL, "finally"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.BLOCKLEVEL, "default"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "int"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "float"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "char"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "byte"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "void"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "boolean"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "short"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "long"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "double"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "Boolean"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "Byte"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "Character"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "Double"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "Float"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "Integer"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "Long"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "Math"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "Number"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "Object"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "Package"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "Process"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "ProcessBuilder"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "Runtime"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "RuntimePermission"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "SecurityManager"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "Short"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "StackTraceElement"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "StrictMath"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "String"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "StringBuffer"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "StringBuilder"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "System"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "Thread"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "ThreadGroup"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "Throwable"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.TYPE, "Void"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.MEMBERDELC, "public"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.MEMBERDELC, "abstract"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.MEMBERDELC, "final"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.MEMBERDELC, "private"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.MEMBERDELC, "protected"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.MEMBERDELC, "static"); r.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NEW, "new"); r.addCandidate(c); } private void setup(ClassUtils cu, AutocompleteRegistry registry2) { cu.defineClassShortName("Boolean", "java.lang.Boolean"); cu.defineClassShortName("Byte", "java.lang.Byte"); cu.defineClassShortName("Character", "java.lang.Character"); cu.defineClassShortName("Double", "java.lang.Double"); cu.defineClassShortName("Float", "java.lang.Float"); cu.defineClassShortName("Integer", "java.lang.Integer"); cu.defineClassShortName("Long", "java.lang.Long"); cu.defineClassShortName("Math", "java.lang.Math"); cu.defineClassShortName("Number", "java.lang.Number"); cu.defineClassShortName("Object", "java.lang.Object"); cu.defineClassShortName("Package", "java.lang.Package"); cu.defineClassShortName("Process", "java.lang.Process"); cu.defineClassShortName("ProcessBuilder", "java.lang.ProcessBuilder"); cu.defineClassShortName("Runtime", "java.lang.Runtime"); cu.defineClassShortName("RuntimePermission", "java.lang.RuntimePermission"); cu.defineClassShortName("SecurityManager", "java.lang.SecurityManager"); cu.defineClassShortName("Short", "java.lang.Short"); cu.defineClassShortName("StackTraceElement", "java.lang.StackTraceElement"); cu.defineClassShortName("StrictMath", "java.lang.StrictMath"); cu.defineClassShortName("String", "java.lang.String"); cu.defineClassShortName("StringBuffer", "java.lang.StringBuffer"); cu.defineClassShortName("StringBuilder", "java.lang.StringBuilder"); cu.defineClassShortName("System", "java.lang.System"); cu.defineClassShortName("Thread", "java.lang.Thread"); cu.defineClassShortName("ThreadGroup", "java.lang.ThreadGroup"); cu.defineClassShortName("Throwable", "java.lang.Throwable"); cu.defineClassShortName("Void", "java.lang.Void"); AutocompleteCandidate c; c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "Boolean"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "Byte"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "Character"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "Double"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "Exception"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "Float"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "Integer"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "Long"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "Number"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "Object"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "Package"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "Process"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "ProcessBuilder"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "Runtime"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "RuntimePermission"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "SecurityManager"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "Short"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "StackTraceElement"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "StrictMath"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "String"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "StringBuffer"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "StringBuilder"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "System"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "Thread"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "ThreadGroup"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "Throwable"); registry.addCandidate(c); c = new AutocompleteCandidate(JavaCompletionTypes.NAME, "Void"); registry.addCandidate(c); } protected ClassUtils createClassUtils() { return new ClassUtils(); } public List<String> doAutocomplete(String txt, int cur) { ClassUtils cu = createClassUtils(); setup(cu, registry); registry.clearForType(JavaCompletionTypes.CUSTOM_TYPE); registry.clearForType(JavaCompletionTypes.FIELD); registry.clearForType(JavaCompletionTypes.NAME); addDefaultImports(cu); moreSetup(cu); moreSetup(registry); Lexer lexer = new JavaLexer(new ANTLRInputStream(txt)); CommonTokenStream tokens = new CommonTokenStream(lexer); // Create a parser that reads from the scanner JavaParser parser = new JavaParser(tokens); parser.removeErrorListeners(); // start parsing at the compilationUnit rule ParserRuleContext t = parser.compilationUnit(); ParseTreeWalker walker = new ParseTreeWalker(); List<AutocompleteCandidate> q = new ArrayList<AutocompleteCandidate>(); JavaImportDeclarationCompletion extractor = new JavaImportDeclarationCompletion(txt, cur, registry, cps, cu); JavaNameBuilder extractor2 = new JavaNameBuilder(registry, cu); JavaNodeCompletion extractor3 = new JavaNodeCompletion(txt, cur, registry, cu); walker.walk(extractor, t); if (extractor.getQuery() != null) q.addAll(extractor.getQuery()); walker.walk(extractor2, t); walker.walk(extractor3, t); if (extractor3.getQuery() != null) q.addAll(extractor3.getQuery()); List<String> ret = registry.searchCandidates(q); if (ret.isEmpty()) { q.clear(); for (int i = cur - 1; i >= 0; i--) { if (Character.isWhitespace(txt.charAt(i))) { String tx = txt.substring(i + 1, cur).trim(); if (!txt.isEmpty()) { if (tx.contains(".")) { q.add(cu.expandExpression(tx, registry, cu.DO_ALL)); } else { q.add(new AutocompleteCandidate(JavaCompletionTypes.NAME, tx)); } ret = registry.searchCandidates(q); } break; } } } if (txt.charAt(cur - 1) == '.') { for (int i = 0; i < ret.size(); i++) { String s = ret.get(i); if (s.startsWith(".")) ret.set(i, s.substring(1)); } } // this shows the GUI //t.inspect(parser); return ret; } }