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

Reply via email to