You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@netbeans.apache.org by GitBox <gi...@apache.org> on 2018/03/29 05:33:37 UTC

[GitHub] jlahoda closed pull request #451: [NETBEANS-335] Not importing fields for unresolveable identifiers tha���

jlahoda closed pull request #451: [NETBEANS-335] Not importing fields for unresolveable identifiers tha…
URL: https://github.com/apache/incubator-netbeans/pull/451
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

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 953e9c744..d0ec54a5c 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.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 @@ private void doComputeCandidates(Set<String> forcedUnresolved) {
         
         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 @@ private void doComputeCandidates(Set<String> forcedUnresolved) {
                 }
             }
             
-            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 @@ private static boolean filter(Types types, List<Element> left, List<Element> rig
     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 Void visitVariable(VariableTree tree, Map<String, Object> p) {
                 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 Void visitIdentifier(IdentifierTree tree, Map<String, Object> p) {
                     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 Void visitIdentifier(IdentifierTree tree, Map<String, Object> p) {
         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 Void visitNewClass(NewClassTree node, Map<String, Object> p) {
 
         @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 Void visitMethodInvocation(MethodInvocationTree node, Map<String, Object>
 
         @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 Void visitClass(ClassTree node, Map<String, Object> p) {
                     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 000000000..97e3924ad
--- /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 000000000..97e3924ad
--- /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 000000000..caf588869
--- /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 426f8a33c..b68de314c 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 @@
 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 void testStaticImports233117() throws Exception {
         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());
         


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@netbeans.apache.org
For additional commands, e-mail: notifications-help@netbeans.apache.org

For further information about the NetBeans mailing lists, visit:
https://cwiki.apache.org/confluence/display/NETBEANS/Mailing+lists