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


The following commit(s) were added to refs/heads/master by this push:
     new b0b6e90  [NETBEANS-335] Not importing fields for unresolveable 
identifiers that are in position where only types can appears.
b0b6e90 is described below

commit b0b6e9038d6c2097541b08451cf5f59691ab298f
Author: Jan Lahoda <jlah...@netbeans.org>
AuthorDate: Mon Mar 12 07:14:16 2018 +0100

    [NETBEANS-335] Not importing fields for unresolveable identifiers that are 
in position where only types can appears.
---
 .../java/editor/imports/ComputeImports.java        | 101 ++++++++++++++++-----
 .../1.8/testNotImportFieldAsClass-filtered.pass    |   5 +
 .../1.8/testNotImportFieldAsClass-unfiltered.pass  |   5 +
 .../imports/data/TestNotImportFieldAsClass.java    |  24 +++++
 .../java/editor/imports/ComputeImportsTest.java    |   7 ++
 5 files changed, 118 insertions(+), 24 deletions(-)

diff --git 
a/java.editor/src/org/netbeans/modules/java/editor/imports/ComputeImports.java 
b/java.editor/src/org/netbeans/modules/java/editor/imports/ComputeImports.java
index 953e9c7..d0ec54a 100644
--- 
a/java.editor/src/org/netbeans/modules/java/editor/imports/ComputeImports.java
+++ 
b/java.editor/src/org/netbeans/modules/java/editor/imports/ComputeImports.java
@@ -26,6 +26,7 @@ import com.sun.source.tree.ExpressionTree;
 import com.sun.source.tree.IdentifierTree;
 import com.sun.source.tree.MemberSelectTree;
 import com.sun.source.tree.MethodInvocationTree;
+import com.sun.source.tree.MethodTree;
 import com.sun.source.tree.NewArrayTree;
 import com.sun.source.tree.NewClassTree;
 import com.sun.source.tree.ParameterizedTypeTree;
@@ -249,6 +250,10 @@ public final class ComputeImports {
         
         unresolvedNames.addAll(JavadocImports.computeUnresolvedImports(info));
         
+        Set<String> unresolvedNonTypes = new 
HashSet<String>(v.unresolvedNonTypes);
+
+        unresolvedNonTypes.addAll(forcedUnresolved);
+
         for (String unresolved : unresolvedNames) {
             if (isCancelled())
                 return;
@@ -276,24 +281,26 @@ public final class ComputeImports {
                 }
             }
             
-            Iterable<Symbols> simpleNames = 
cpInfo.getClassIndex().getDeclaredSymbols(unresolved, 
NameKind.SIMPLE_NAME,EnumSet.allOf(ClassIndex.SearchScope.class));
+            if (unresolvedNonTypes.contains(unresolved)) {
+                Iterable<Symbols> simpleNames = 
cpInfo.getClassIndex().getDeclaredSymbols(unresolved, 
NameKind.SIMPLE_NAME,EnumSet.allOf(ClassIndex.SearchScope.class));
 
-            if (simpleNames == null) {
-                //Canceled:
-                return;
-            }
-            
-            for (final Symbols p : simpleNames) {
-                if (isCancelled())
+                if (simpleNames == null) {
+                    //Canceled:
                     return;
+                }
+
+                for (final Symbols p : simpleNames) {
+                    if (isCancelled())
+                        return;
 
-                final TypeElement te = p.getEnclosingType().resolve(allInfo);
-                final Set<String> idents = p.getSymbols();
-                if (te != null) {
-                    for (Element ne : te.getEnclosedElements()) {
-                        if (!ne.getModifiers().contains(Modifier.STATIC)) 
continue;
-                        if (idents.contains(getSimpleName(ne, te))) {
-                            classes.add(ne);
+                    final TypeElement te = 
p.getEnclosingType().resolve(allInfo);
+                    final Set<String> idents = p.getSymbols();
+                    if (te != null) {
+                        for (Element ne : te.getEnclosedElements()) {
+                            if (!ne.getModifiers().contains(Modifier.STATIC)) 
continue;
+                            if (idents.contains(getSimpleName(ne, te))) {
+                                classes.add(ne);
+                            }
                         }
                     }
                 }
@@ -470,14 +477,17 @@ public final class ComputeImports {
     private static class TreeVisitorImpl extends 
CancellableTreePathScanner<Void, Map<String, Object>> {
         
         private final CompilationInfo info;
+        private boolean onlyTypes;
         private Set<String> unresolved;
+        private Set<String> unresolvedNonTypes;
         
         private List<Hint> hints;
         
         public TreeVisitorImpl(CompilationInfo info) {
             this.info = info;
-            unresolved = new HashSet<String>();
-            hints = new ArrayList<Hint>();
+            unresolved = new HashSet<>();
+            unresolvedNonTypes = new HashSet<>();
+            hints = new ArrayList<>();
         }
         
         @Override
@@ -516,7 +526,7 @@ public final class ComputeImports {
                 p.put("request", null);
             }
             
-            scan(tree.getType(), p);
+            scan(tree.getType(), p, true);
             
             Union2<String, DeclaredType> leftSide = (Union2<String, 
DeclaredType>) p.remove("result");
             
@@ -635,6 +645,10 @@ public final class ComputeImports {
                     if (simpleName != null) {
                         unresolved.add(simpleName);
 
+                        if (!onlyTypes) {
+                            unresolvedNonTypes.add(simpleName);
+                        }
+
                         Scope currentScope = getScope();
 
                         hints.add(new AccessibleHint(simpleName, 
currentScope));
@@ -659,8 +673,8 @@ public final class ComputeImports {
         public Void visitNewClass(NewClassTree node, Map<String, Object> p) {
             filterByNotAcceptedKind(node.getIdentifier(), ElementKind.ENUM);
             scan(node.getEnclosingExpression(), new HashMap<String, Object>());
-            scan(node.getIdentifier(), p);
-            scan(node.getTypeArguments(), new HashMap<String, Object>());
+            scan(node.getIdentifier(), p, true);
+            scan(node.getTypeArguments(), new HashMap<String, Object>(), true);
             scan(node.getArguments(), new HashMap<String, Object>());
             scan(node.getClassBody(), new HashMap<String, Object>());
             return null;
@@ -668,7 +682,7 @@ public final class ComputeImports {
 
         @Override
         public Void visitMethodInvocation(MethodInvocationTree node, 
Map<String, Object> p) {
-            scan(node.getTypeArguments(), new HashMap<String, Object>());
+            scan(node.getTypeArguments(), new HashMap<String, Object>(), true);
             scan(node.getMethodSelect(), p);
             scan(node.getArguments(), new HashMap<String, Object>());
             return null;
@@ -676,7 +690,7 @@ public final class ComputeImports {
 
         @Override
         public Void visitNewArray(NewArrayTree node, Map<String, Object> p) {
-            scan(node.getType(), p);
+            scan(node.getType(), p, true);
             scan(node.getDimensions(), new HashMap<String, Object>());
             scan(node.getInitializers(), new HashMap<String, Object>());
             return null;
@@ -697,13 +711,52 @@ public final class ComputeImports {
                     filterByAcceptedKind(intf, ElementKind.INTERFACE, 
ElementKind.ANNOTATION_TYPE);
                 }
             }
-            return super.visitClass(node, p);
+
+            scan(node.getModifiers(), p);
+            scan(node.getTypeParameters(), p, true);
+            scan(node.getExtendsClause(), p, true);
+            scan(node.getImplementsClause(), p, true);
+            scan(node.getMembers(), p);
+
+            return null;
         }
 
         @Override
         public Void visitAnnotation(AnnotationTree node, Map<String, Object> 
p) {
             filterByAcceptedKind(node.getAnnotationType(), 
ElementKind.ANNOTATION_TYPE);
-            return super.visitAnnotation(node, p);
+            scan(node.getAnnotationType(), p, true);
+            scan(node.getArguments(), p, false);
+            return null;
+        }
+
+        @Override
+        public Void visitMethod(MethodTree node, Map<String, Object> p) {
+            scan(node.getModifiers(), p);
+            scan(node.getTypeParameters(), p, true);
+            scan(node.getReturnType(), p, true);
+            scan(node.getReceiverParameter(), p);
+            scan(node.getParameters(), p);
+            scan(node.getThrows(), p, true);
+            scan(node.getDefaultValue(), p);
+            scan(node.getBody(), p);
+            return null;
+        }
+
+        private void scan(Iterable<? extends Tree> trees, Map<String, Object> 
p, boolean onlyTypes) {
+            for (Tree tree : trees) {
+                scan(tree, p, onlyTypes);
+            }
+        }
+
+        private void scan(Tree tree, Map<String, Object> p, boolean onlyTypes) 
{
+            boolean oldOnlyTypes = this.onlyTypes;
+
+            try {
+                this.onlyTypes = onlyTypes;
+                scan(tree, p);
+            } finally {
+                this.onlyTypes = oldOnlyTypes;
+            }
         }
         
         private Scope topLevelScope;
diff --git 
a/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/java/editor/imports/ComputeImportsTest/1.8/testNotImportFieldAsClass-filtered.pass
 
b/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/java/editor/imports/ComputeImportsTest/1.8/testNotImportFieldAsClass-filtered.pass
new file mode 100644
index 0000000..97e3924
--- /dev/null
+++ 
b/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/java/editor/imports/ComputeImportsTest/1.8/testNotImportFieldAsClass-filtered.pass
@@ -0,0 +1,5 @@
+CONSTANT_A:[org.netbeans.modules.java.editor.imports.data.TestNotImportFieldAsClass.CONSTANT_A]
+CONSTANT_B:[]
+SHOULD_IMPORT1:[org.netbeans.modules.java.editor.imports.data.TestNotImportFieldAsClass.SHOULD_IMPORT1]
+SHOULD_IMPORT2:[org.netbeans.modules.java.editor.imports.data.TestNotImportFieldAsClass.SHOULD_IMPORT2]
+SHOULD_NOT_IMPORT:[]
diff --git 
a/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/java/editor/imports/ComputeImportsTest/1.8/testNotImportFieldAsClass-unfiltered.pass
 
b/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/java/editor/imports/ComputeImportsTest/1.8/testNotImportFieldAsClass-unfiltered.pass
new file mode 100644
index 0000000..97e3924
--- /dev/null
+++ 
b/java.editor/test/unit/data/goldenfiles/org/netbeans/modules/java/editor/imports/ComputeImportsTest/1.8/testNotImportFieldAsClass-unfiltered.pass
@@ -0,0 +1,5 @@
+CONSTANT_A:[org.netbeans.modules.java.editor.imports.data.TestNotImportFieldAsClass.CONSTANT_A]
+CONSTANT_B:[]
+SHOULD_IMPORT1:[org.netbeans.modules.java.editor.imports.data.TestNotImportFieldAsClass.SHOULD_IMPORT1]
+SHOULD_IMPORT2:[org.netbeans.modules.java.editor.imports.data.TestNotImportFieldAsClass.SHOULD_IMPORT2]
+SHOULD_NOT_IMPORT:[]
diff --git 
a/java.editor/test/unit/data/org/netbeans/modules/java/editor/imports/data/TestNotImportFieldAsClass.java
 
b/java.editor/test/unit/data/org/netbeans/modules/java/editor/imports/data/TestNotImportFieldAsClass.java
new file mode 100644
index 0000000..caf5888
--- /dev/null
+++ 
b/java.editor/test/unit/data/org/netbeans/modules/java/editor/imports/data/TestNotImportFieldAsClass.java
@@ -0,0 +1,24 @@
+package org.netbeans.modules.java.editor.imports.data;
+
+public enum TestNotImportFieldAsClass {
+    /**
+     * {@link CONSTANT_B}
+     */
+    CONSTANT_A,
+    /**
+     * {@link CONSTANT_A}
+     */
+    CONSTANT_B,
+    SHOULD_NOT_IMPORT,
+    SHOULD_IMPORT1,
+    SHOULD_IMPORT2;
+}
+
+@SHOULD_NOT_IMPORT(SHOULD_IMPORT1)
+class Test<T extends SHOULD_NOT_IMPORT> extends SHOULD_NOT_IMPORT implements 
SHOULD_NOT_IMPORT<SHOULD_NOT_IMPORT> {
+    SHOULD_NOT_IMPORT f;
+    public <T extends SHOULD_NOT_IMPORT<SHOULD_NOT_IMPORT>> SHOULD_NOT_IMPORT 
m(SHOULD_NOT_IMPORT p) throws SHOULD_NOT_IMPORT {
+        int l = SHOULD_IMPORT2.name().length();
+    }
+    Object o = CONSTANT_A;
+}
diff --git 
a/java.editor/test/unit/src/org/netbeans/modules/java/editor/imports/ComputeImportsTest.java
 
b/java.editor/test/unit/src/org/netbeans/modules/java/editor/imports/ComputeImportsTest.java
index 426f8a3..b68de31 100644
--- 
a/java.editor/test/unit/src/org/netbeans/modules/java/editor/imports/ComputeImportsTest.java
+++ 
b/java.editor/test/unit/src/org/netbeans/modules/java/editor/imports/ComputeImportsTest.java
@@ -60,6 +60,9 @@ import org.openide.loaders.DataObject;
 public class ComputeImportsTest extends NbTestCase {
     
     private static final Set<String> IGNORE_CLASSES = new 
HashSet<String>(Arrays.asList(new String[] {
+        "com.sun.tools.javac.util.List",
+        "com.sun.tools.javac.code.Attribute.RetentionPolicy",
+        "com.sun.tools.classfile.Opcode.Set",
         "com.sun.xml.bind.v2.schemagen.xmlschema.List",
         "com.sun.xml.txw2.Document",
         "com.sun.xml.internal.txw2.Document",
@@ -210,6 +213,10 @@ public class ComputeImportsTest extends NbTestCase {
         doTest("StaticImports233117", "1.8");
     }
     
+    public void testNotImportFieldAsClass() throws Exception {
+        doTest("TestNotImportFieldAsClass");
+    }
+
     private void prepareTest(String capitalizedName, String sourceLevel) 
throws Exception {
         FileObject workFO = FileUtil.toFileObject(getWorkDir());
         

-- 
To stop receiving notification emails like this one, please contact
jlah...@apache.org.

---------------------------------------------------------------------
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