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/03/29 05:33:37 UTC
[incubator-netbeans] branch master updated: [NETBEANS-335] Not
importing fields for unresolveable identifiers that are in position where
only types can appears.
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 <jl...@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
jlahoda@apache.org.
---------------------------------------------------------------------
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