You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@netbeans.apache.org by jl...@apache.org on 2018/07/03 04:17:43 UTC
[incubator-netbeans] 03/05: A few completion fixes.
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 <jl...@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-unsubscribe@netbeans.apache.org
For additional commands, e-mail: commits-help@netbeans.apache.org
For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists