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