This is an automated email from the ASF dual-hosted git repository. jlahoda pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-netbeans.git
commit 78a5e0a915dca39b9f5fdfc497f5527ae3c27583 Author: Jan Lahoda <jlah...@netbeans.org> AuthorDate: Mon Jun 25 22:51:42 2018 +0200 A few completion fixes. --- .../11/OverrideAbstractList.pass | 172 ++++++++++++++++++++ .../11/OverrideAbstractListAbstract.pass | 174 +++++++++++++++++++++ .../11/OverrideAbstractListWithPrefix.pass | 4 + .../netbeans/api/java/source/TreeUtilities.java | 40 ++++- lib.nbjavac/manifest.mf | 2 +- .../org/netbeans/lib/nbjavac/services/NBAttr.java | 38 +++++ .../lib/nbjavac/services/NBJavacTrees.java | 8 + 7 files changed, 431 insertions(+), 7 deletions(-) diff --git a/java.completion/test/unit/data/goldenfiles/org/netbeans/modules/java/completion/JavaCompletionTaskTest/11/OverrideAbstractList.pass b/java.completion/test/unit/data/goldenfiles/org/netbeans/modules/java/completion/JavaCompletionTaskTest/11/OverrideAbstractList.pass new file mode 100644 index 0000000..0636e28 --- /dev/null +++ b/java.completion/test/unit/data/goldenfiles/org/netbeans/modules/java/completion/JavaCompletionTaskTest/11/OverrideAbstractList.pass @@ -0,0 +1,172 @@ +public boolean add(Object arg0) - override +public void add(int arg0, Object arg1) - override +public boolean addAll(Collection arg0) - override +public boolean addAll(int arg0, Collection arg1) - override +public void clear() - override +protected native Object clone() - override +public boolean contains(Object arg0) - override +public boolean containsAll(Collection arg0) - override +public boolean equals(Object arg0) - override +protected void finalize() - override +public default void forEach(Consumer arg0) - override +public abstract Object get(int arg0) - implement +public int getModCount() - generate +public int hashCode() - override +public int indexOf(Object arg0) - override +public boolean isEmpty() - override +public Iterator iterator() - override +public int lastIndexOf(Object arg0) - override +public ListIterator listIterator() - override +public ListIterator listIterator(int arg0) - override +public default Stream parallelStream() - override +public boolean remove(Object arg0) - override +public Object remove(int arg0) - override +public boolean removeAll(Collection arg0) - override +public default boolean removeIf(Predicate arg0) - override +protected void removeRange(int arg0, int arg1) - override +public default void replaceAll(UnaryOperator arg0) - override +public boolean retainAll(Collection arg0) - override +public Object set(int arg0, Object arg1) - override +public void setModCount(int modCount) - generate +public abstract int size() - implement +public default void sort(Comparator arg0) - override +public default Spliterator spliterator() - override +public default Stream stream() - override +public List subList(int arg0, int arg1) - override +public Object[] toArray() - override +public default Object[] toArray(IntFunction arg0) - override +public Object[] toArray(Object[] arg0) - override +public String toString() - override +abstract +boolean +byte +char +class +double +enum +final +float +int +interface +long +native +private +protected +public +short +static +strictfp +synchronized +transient +void +volatile +AbstractList +AbstractMethodError +Appendable +ArithmeticException +ArrayIndexOutOfBoundsException +ArrayStoreException +AssertionError +AutoCloseable +Boolean +BootstrapMethodError +Byte +CharSequence +Character +Class +ClassCastException +ClassCircularityError +ClassFormatError +ClassLoader +ClassNotFoundException +ClassValue +CloneNotSupportedException +Cloneable +Comparable +Compiler +Deprecated +Double +Enum +EnumConstantNotPresentException +Error +Exception +ExceptionInInitializerError +Float +FunctionalInterface +IllegalAccessError +IllegalAccessException +IllegalArgumentException +IllegalCallerException +IllegalMonitorStateException +IllegalStateException +IllegalThreadStateException +IncompatibleClassChangeError +IndexOutOfBoundsException +InheritableThreadLocal +InstantiationError +InstantiationException +Integer +InternalError +InterruptedException +Iterable +LayerInstantiationException +LinkageError +Long +Math +Module +ModuleLayer +NegativeArraySizeException +NoClassDefFoundError +NoSuchFieldError +NoSuchFieldException +NoSuchMethodError +NoSuchMethodException +NullPointerException +Number +NumberFormatException +Object +OutOfMemoryError +Override +Package +Process +ProcessBuilder +ProcessHandle +Readable +ReflectiveOperationException +Runnable +Runtime +RuntimeException +RuntimePermission +SafeVarargs +SecurityException +SecurityManager +Short +StackOverflowError +StackTraceElement +StackWalker +StrictMath +String +StringBuffer +StringBuilder +StringIndexOutOfBoundsException +SuppressWarnings +System +Test +Thread +ThreadDeath +ThreadGroup +ThreadLocal +Throwable +TypeNotPresentException +UnknownError +UnsatisfiedLinkError +UnsupportedClassVersionError +UnsupportedOperationException +VerifyError +VirtualMachineError +Void +com +java +javax +org +sun diff --git a/java.completion/test/unit/data/goldenfiles/org/netbeans/modules/java/completion/JavaCompletionTaskTest/11/OverrideAbstractListAbstract.pass b/java.completion/test/unit/data/goldenfiles/org/netbeans/modules/java/completion/JavaCompletionTaskTest/11/OverrideAbstractListAbstract.pass new file mode 100644 index 0000000..a99f3ec --- /dev/null +++ b/java.completion/test/unit/data/goldenfiles/org/netbeans/modules/java/completion/JavaCompletionTaskTest/11/OverrideAbstractListAbstract.pass @@ -0,0 +1,174 @@ +public boolean add(Object arg0) - override +public void add(int arg0, Object arg1) - override +public boolean addAll(Collection arg0) - override +public boolean addAll(int arg0, Collection arg1) - override +public void clear() - override +protected native Object clone() - override +public boolean contains(Object arg0) - override +public boolean containsAll(Collection arg0) - override +public boolean equals(Object arg0) - override +protected void finalize() - override +public default void forEach(Consumer arg0) - override +public abstract Object get(int arg0) - implement +public abstract Object get(int arg0) - override +public int getModCount() - generate +public int hashCode() - override +public int indexOf(Object arg0) - override +public boolean isEmpty() - override +public Iterator iterator() - override +public int lastIndexOf(Object arg0) - override +public ListIterator listIterator() - override +public ListIterator listIterator(int arg0) - override +public default Stream parallelStream() - override +public boolean remove(Object arg0) - override +public Object remove(int arg0) - override +public boolean removeAll(Collection arg0) - override +public default boolean removeIf(Predicate arg0) - override +protected void removeRange(int arg0, int arg1) - override +public default void replaceAll(UnaryOperator arg0) - override +public boolean retainAll(Collection arg0) - override +public Object set(int arg0, Object arg1) - override +public void setModCount(int modCount) - generate +public abstract int size() - implement +public abstract int size() - override +public default void sort(Comparator arg0) - override +public default Spliterator spliterator() - override +public default Stream stream() - override +public List subList(int arg0, int arg1) - override +public Object[] toArray() - override +public default Object[] toArray(IntFunction arg0) - override +public Object[] toArray(Object[] arg0) - override +public String toString() - override +abstract +boolean +byte +char +class +double +enum +final +float +int +interface +long +native +private +protected +public +short +static +strictfp +synchronized +transient +void +volatile +AbstractList +AbstractMethodError +Appendable +ArithmeticException +ArrayIndexOutOfBoundsException +ArrayStoreException +AssertionError +AutoCloseable +Boolean +BootstrapMethodError +Byte +CharSequence +Character +Class +ClassCastException +ClassCircularityError +ClassFormatError +ClassLoader +ClassNotFoundException +ClassValue +CloneNotSupportedException +Cloneable +Comparable +Compiler +Deprecated +Double +Enum +EnumConstantNotPresentException +Error +Exception +ExceptionInInitializerError +Float +FunctionalInterface +IllegalAccessError +IllegalAccessException +IllegalArgumentException +IllegalCallerException +IllegalMonitorStateException +IllegalStateException +IllegalThreadStateException +IncompatibleClassChangeError +IndexOutOfBoundsException +InheritableThreadLocal +InstantiationError +InstantiationException +Integer +InternalError +InterruptedException +Iterable +LayerInstantiationException +LinkageError +Long +Math +Module +ModuleLayer +NegativeArraySizeException +NoClassDefFoundError +NoSuchFieldError +NoSuchFieldException +NoSuchMethodError +NoSuchMethodException +NullPointerException +Number +NumberFormatException +Object +OutOfMemoryError +Override +Package +Process +ProcessBuilder +ProcessHandle +Readable +ReflectiveOperationException +Runnable +Runtime +RuntimeException +RuntimePermission +SafeVarargs +SecurityException +SecurityManager +Short +StackOverflowError +StackTraceElement +StackWalker +StrictMath +String +StringBuffer +StringBuilder +StringIndexOutOfBoundsException +SuppressWarnings +System +Test +Thread +ThreadDeath +ThreadGroup +ThreadLocal +Throwable +TypeNotPresentException +UnknownError +UnsatisfiedLinkError +UnsupportedClassVersionError +UnsupportedOperationException +VerifyError +VirtualMachineError +Void +com +java +javax +org +sun diff --git a/java.completion/test/unit/data/goldenfiles/org/netbeans/modules/java/completion/JavaCompletionTaskTest/11/OverrideAbstractListWithPrefix.pass b/java.completion/test/unit/data/goldenfiles/org/netbeans/modules/java/completion/JavaCompletionTaskTest/11/OverrideAbstractListWithPrefix.pass new file mode 100644 index 0000000..777d50c --- /dev/null +++ b/java.completion/test/unit/data/goldenfiles/org/netbeans/modules/java/completion/JavaCompletionTaskTest/11/OverrideAbstractListWithPrefix.pass @@ -0,0 +1,4 @@ +public Object[] toArray() - override +public default Object[] toArray(IntFunction arg0) - override +public Object[] toArray(Object[] arg0) - override +public String toString() - override diff --git a/java.source.base/src/org/netbeans/api/java/source/TreeUtilities.java b/java.source.base/src/org/netbeans/api/java/source/TreeUtilities.java index b6b8d51..3fe8b71 100644 --- a/java.source.base/src/org/netbeans/api/java/source/TreeUtilities.java +++ b/java.source.base/src/org/netbeans/api/java/source/TreeUtilities.java @@ -92,6 +92,7 @@ import org.netbeans.api.java.lexer.JavadocTokenId; import org.netbeans.api.java.source.JavaSource.Phase; import org.netbeans.api.lexer.TokenSequence; import org.netbeans.lib.nbjavac.services.CancelService; +import org.netbeans.lib.nbjavac.services.NBAttr; import org.netbeans.lib.nbjavac.services.NBParserFactory; import org.netbeans.lib.nbjavac.services.NBResolve; import org.netbeans.lib.nbjavac.services.NBTreeMaker.IndexedClassDecl; @@ -377,6 +378,21 @@ public final class TreeUtilities { return super.visitMethod(node, p); } + @Override + public Void visitEnhancedForLoop(EnhancedForLoopTree node, Void p) { + int exprEndPos = (int) sourcePositions.getEndPosition(getCurrentPath().getCompilationUnit(), node.getExpression()); + TokenSequence<JavaTokenId> ts = info.getTokenHierarchy().tokenSequence(JavaTokenId.language()).subSequence(exprEndPos, pos); + boolean hasNonWhiteSpace; + while (hasNonWhiteSpace = ts.moveNext()) { + if (!IGNORE_TOKENS.contains(ts.token().id())) + break; + } + if (!hasNonWhiteSpace) { + pos = exprEndPos; + } + return super.visitEnhancedForLoop(node, p); + } + } try { @@ -388,7 +404,7 @@ public final class TreeUtilities { if (path.getLeaf() == path.getCompilationUnit()) return path; - TokenSequence<JavaTokenId> tokenList = tokensFor(path.getLeaf(), sourcePositions); + TokenSequence<JavaTokenId> tokenList = tokensFor(path.getLeaf(), sourcePositions, pos); tokenList.moveEnd(); if (tokenList.movePrevious() && tokenList.offset() < pos) { switch (tokenList.token().id()) { @@ -413,6 +429,11 @@ public final class TreeUtilities { (path.getLeaf().getKind() == Tree.Kind.FOR_LOOP && tokenList.offset() <= sourcePositions.getStartPosition(path.getCompilationUnit(), ((ForLoopTree)path.getLeaf()).getUpdate().get(0)))) break; + if (path.getParentPath().getLeaf().getKind() == Tree.Kind.TRY && + ((TryTree) path.getParentPath().getLeaf()).getResources().contains(path.getLeaf())) { + path = path.getParentPath(); + break; + } case RBRACE: path = path.getParentPath(); switch (path.getLeaf().getKind()) { @@ -438,6 +459,11 @@ public final class TreeUtilities { return path; } + private static final Set<JavaTokenId> IGNORE_TOKENS = EnumSet.of( + JavaTokenId.BLOCK_COMMENT, JavaTokenId.JAVADOC_COMMENT, + JavaTokenId.LINE_COMMENT, JavaTokenId.WHITESPACE + ); + /**Return the deepest DocTreePath at the given position. * * @param treepath for which the {@code doc} comment was determined @@ -872,11 +898,9 @@ public final class TreeUtilities { // ArgumentAttr argumentAttr = ArgumentAttr.instance(jti.getContext()); // ArgumentAttr.LocalCacheContext cacheContext = argumentAttr.withLocalCacheContext(); try { - Attr attr = Attr.instance(jti.getContext()); + NBAttr attr = (NBAttr) NBAttr.instance(jti.getContext()); Env<AttrContext> env = getEnv(scope); - Env<AttrContext> result = tree instanceof JCExpression ? - attr.attribExprToTree((JCExpression) tree, env, (JCTree) to) : - attr.attribStatToTree((JCTree) tree, env, (JCTree) to); + Env<AttrContext> result = attr.attributeAndCapture((JCTree) tree, env, (JCTree) to); try { Constructor<JavacScope> c = JavacScope.class.getDeclaredConstructor(Env.class); c.setAccessible(true); @@ -902,10 +926,14 @@ public final class TreeUtilities { /**Returns tokens for a given tree. Uses specified {@link SourcePositions}. */ public TokenSequence<JavaTokenId> tokensFor(Tree tree, SourcePositions sourcePositions) { + return tokensFor(tree, sourcePositions, -1); + } + + private TokenSequence<JavaTokenId> tokensFor(Tree tree, SourcePositions sourcePositions, int farEnd) { int start = (int)sourcePositions.getStartPosition(info.getCompilationUnit(), tree); int end = (int)sourcePositions.getEndPosition(info.getCompilationUnit(), tree); - return info.getTokenHierarchy().tokenSequence(JavaTokenId.language()).subSequence(start, end); + return info.getTokenHierarchy().tokenSequence(JavaTokenId.language()).subSequence(start, Math.max(end, farEnd)); } /** diff --git a/lib.nbjavac/manifest.mf b/lib.nbjavac/manifest.mf index 34b826a..2138359 100644 --- a/lib.nbjavac/manifest.mf +++ b/lib.nbjavac/manifest.mf @@ -1,5 +1,5 @@ Manifest-Version: 1.0 OpenIDE-Module: org.netbeans.lib.nbjavac -OpenIDE-Module-Implementation-Version: 2 +OpenIDE-Module-Implementation-Version: 3 OpenIDE-Module-Localizing-Bundle: org/netbeans/lib/nbjavac/Bundle.properties diff --git a/lib.nbjavac/src/org/netbeans/lib/nbjavac/services/NBAttr.java b/lib.nbjavac/src/org/netbeans/lib/nbjavac/services/NBAttr.java index fae511d..f693de8 100644 --- a/lib.nbjavac/src/org/netbeans/lib/nbjavac/services/NBAttr.java +++ b/lib.nbjavac/src/org/netbeans/lib/nbjavac/services/NBAttr.java @@ -21,11 +21,15 @@ package org.netbeans.lib.nbjavac.services; import com.sun.tools.javac.comp.Attr; import com.sun.tools.javac.comp.AttrContext; import com.sun.tools.javac.comp.Env; +import com.sun.tools.javac.tree.JCTree; import com.sun.tools.javac.tree.JCTree.JCBlock; import com.sun.tools.javac.tree.JCTree.JCClassDecl; +import com.sun.tools.javac.tree.JCTree.JCExpression; import com.sun.tools.javac.tree.JCTree.JCMethodDecl; import com.sun.tools.javac.tree.JCTree.JCNewClass; import com.sun.tools.javac.util.Context; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; import java.lang.reflect.Field; import java.util.logging.Level; import java.util.logging.Logger; @@ -85,4 +89,38 @@ public class NBAttr extends Attr { } } + private boolean fullyAttribute; + private Env<AttrContext> fullyAttributeResult; + + protected void breakTreeFound(Env<AttrContext> env) { + if (fullyAttribute) { + fullyAttributeResult = env; + } else { + try { + MethodHandles.lookup() + .findSpecial(Attr.class, "breakTreeFound", MethodType.methodType(void.class, Env.class), NBAttr.class) + .invokeExact(this, env); + } catch (Throwable ex) { + sneakyThrows(ex); + } + } + } + + private <T extends Throwable> void sneakyThrows(Throwable t) throws T { + throw (T) t; + } + + public Env<AttrContext> attributeAndCapture(JCTree tree, Env<AttrContext> env, JCTree to) { + try { + fullyAttribute = true; + + Env<AttrContext> result = tree instanceof JCExpression ? + attribExprToTree((JCExpression) tree, env, (JCTree) to) : + attribStatToTree((JCTree) tree, env, (JCTree) to); + + return fullyAttributeResult != null ? fullyAttributeResult : result; + } finally { + fullyAttribute = false; + } + } } diff --git a/lib.nbjavac/src/org/netbeans/lib/nbjavac/services/NBJavacTrees.java b/lib.nbjavac/src/org/netbeans/lib/nbjavac/services/NBJavacTrees.java index b13abc7..aa50942 100644 --- a/lib.nbjavac/src/org/netbeans/lib/nbjavac/services/NBJavacTrees.java +++ b/lib.nbjavac/src/org/netbeans/lib/nbjavac/services/NBJavacTrees.java @@ -22,7 +22,9 @@ import com.sun.source.doctree.DocCommentTree; import com.sun.source.tree.ClassTree; import com.sun.source.util.TreePath; import com.sun.tools.javac.api.JavacTrees; +import com.sun.tools.javac.code.Symbol; import com.sun.tools.javac.tree.JCTree; +import com.sun.tools.javac.tree.TreeInfo; import com.sun.tools.javac.tree.TreeMaker; import com.sun.tools.javac.util.Context; import java.util.HashMap; @@ -73,4 +75,10 @@ public class NBJavacTrees extends JavacTrees { void addPathForElement(Element elem, TreePath path) { element2paths.put(elem, path); } + + @Override + public Symbol getElement(TreePath path) { + return TreeInfo.symbolFor((JCTree) path.getLeaf()); + } + } --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@netbeans.apache.org For additional commands, e-mail: commits-h...@netbeans.apache.org For further information about the NetBeans mailing lists, visit: https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists