From b69a53f01bdd2c10ab154a87452d246056666a8c Mon Sep 17 00:00:00 2001 From: Eric Milles Date: Fri, 16 Feb 2018 16:31:19 -0600 Subject: [PATCH] Fix for issue #482: do not propose non-static members for static imports --- .../tests/ImportCompletionTests.groovy | 11 +++++++++++ ...ementAndExpressionCompletionProcessor.java | 14 ++++++++++++-- .../proposals/AbstractGroovyProposal.java | 19 ++++++++++++++++++- .../GroovyCompletionProposalComputer.java | 2 +- 4 files changed, 42 insertions(+), 4 deletions(-) diff --git a/ide-test/org.codehaus.groovy.eclipse.codeassist.completion.test/src/org/codehaus/groovy/eclipse/codeassist/tests/ImportCompletionTests.groovy b/ide-test/org.codehaus.groovy.eclipse.codeassist.completion.test/src/org/codehaus/groovy/eclipse/codeassist/tests/ImportCompletionTests.groovy index fefb060a0d..40e7b866e1 100644 --- a/ide-test/org.codehaus.groovy.eclipse.codeassist.completion.test/src/org/codehaus/groovy/eclipse/codeassist/tests/ImportCompletionTests.groovy +++ b/ide-test/org.codehaus.groovy.eclipse.codeassist.completion.test/src/org/codehaus/groovy/eclipse/codeassist/tests/ImportCompletionTests.groovy @@ -166,6 +166,17 @@ final class ImportCompletionTests extends CompletionTestSuite { proposalExists(proposals, '_closure2', 0) } + @Test + void testExtraMembers() { + String contents = '''\ + import static org. + '''.stripIndent() + def proposals = createProposalsAtOffset(contents, getLastIndexOf(contents, '.')) + proposalExists(proposals, 'clone()', 0) + proposalExists(proposals, 'notify()', 0) + proposalExists(proposals, 'registerNatives()', 0) + } + @Test void testStaticField1() { String contents = '''\ diff --git a/ide/org.codehaus.groovy.eclipse.codeassist.completion/src/org/codehaus/groovy/eclipse/codeassist/processors/StatementAndExpressionCompletionProcessor.java b/ide/org.codehaus.groovy.eclipse.codeassist.completion/src/org/codehaus/groovy/eclipse/codeassist/processors/StatementAndExpressionCompletionProcessor.java index 38f0328718..02562eba7d 100644 --- a/ide/org.codehaus.groovy.eclipse.codeassist.completion/src/org/codehaus/groovy/eclipse/codeassist/processors/StatementAndExpressionCompletionProcessor.java +++ b/ide/org.codehaus.groovy.eclipse.codeassist.completion/src/org/codehaus/groovy/eclipse/codeassist/processors/StatementAndExpressionCompletionProcessor.java @@ -47,12 +47,14 @@ import org.codehaus.groovy.eclipse.codeassist.creators.FieldProposalCreator; import org.codehaus.groovy.eclipse.codeassist.creators.IProposalCreator; import org.codehaus.groovy.eclipse.codeassist.creators.MethodProposalCreator; +import org.codehaus.groovy.eclipse.codeassist.proposals.AbstractGroovyProposal; import org.codehaus.groovy.eclipse.codeassist.proposals.GroovyFieldProposal; import org.codehaus.groovy.eclipse.codeassist.proposals.IGroovyProposal; import org.codehaus.groovy.eclipse.codeassist.requestor.ContentAssistContext; import org.codehaus.groovy.eclipse.codeassist.requestor.ContentAssistLocation; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.jdt.core.Flags; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.ISourceRange; import org.eclipse.jdt.core.ISourceReference; @@ -437,8 +439,16 @@ public List generateProposals(IProgressMonitor monitor) { ImportNode importNode = (ImportNode) node; if (importNode.isStatic()) { containingClass = importNode.getType(); - groovyProposals.addAll(new FieldProposalCreator().findAllProposals(containingClass, VariableScope.ALL_DEFAULT_CATEGORIES, context.getPerceivedCompletionExpression(), true, isPrimary)); - groovyProposals.addAll(new MethodProposalCreator().findAllProposals(containingClass, VariableScope.ALL_DEFAULT_CATEGORIES, context.getPerceivedCompletionExpression(), true, isPrimary)); + groovyProposals.addAll(new FieldProposalCreator().findAllProposals(containingClass, Collections.EMPTY_SET, context.getPerceivedCompletionExpression(), true, isPrimary)); + groovyProposals.addAll(new MethodProposalCreator().findAllProposals(containingClass, Collections.EMPTY_SET, context.getPerceivedCompletionExpression(), true, isPrimary)); + + groovyProposals.removeIf(proposal -> { + if (proposal instanceof AbstractGroovyProposal) { + int flags = ((AbstractGroovyProposal) proposal).getAssociatedNodeFlags(); + return (!Flags.isStatic(flags) || Flags.isPrivate(flags) || Flags.isSynthetic(flags)); + } + return false; + }); } } } diff --git a/ide/org.codehaus.groovy.eclipse.codeassist.completion/src/org/codehaus/groovy/eclipse/codeassist/proposals/AbstractGroovyProposal.java b/ide/org.codehaus.groovy.eclipse.codeassist.completion/src/org/codehaus/groovy/eclipse/codeassist/proposals/AbstractGroovyProposal.java index 49c4dfb419..5a90515bf7 100644 --- a/ide/org.codehaus.groovy.eclipse.codeassist.completion/src/org/codehaus/groovy/eclipse/codeassist/proposals/AbstractGroovyProposal.java +++ b/ide/org.codehaus.groovy.eclipse.codeassist.completion/src/org/codehaus/groovy/eclipse/codeassist/proposals/AbstractGroovyProposal.java @@ -1,5 +1,5 @@ /* - * Copyright 2009-2017 the original author or authors. + * Copyright 2009-2018 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -38,6 +38,23 @@ public AnnotatedNode getAssociatedNode() { return null; } + public int getAssociatedNodeFlags() { + AnnotatedNode node = getAssociatedNode(); + if (node instanceof ClassNode) { + return ((ClassNode) node).getModifiers(); + } + if (node instanceof FieldNode) { + return ((FieldNode) node).getModifiers(); + } + if (node instanceof MethodNode) { + return ((MethodNode) node).getModifiers(); + } + if (node instanceof PropertyNode) { + return ((PropertyNode) node).getModifiers(); + } + return 0; + } + private float relevanceMultiplier = 1; public final float getRelevanceMultiplier() { diff --git a/ide/org.codehaus.groovy.eclipse.codeassist.completion/src/org/codehaus/groovy/eclipse/codeassist/requestor/GroovyCompletionProposalComputer.java b/ide/org.codehaus.groovy.eclipse.codeassist.completion/src/org/codehaus/groovy/eclipse/codeassist/requestor/GroovyCompletionProposalComputer.java index e6a9a35cd1..52ae8755fe 100644 --- a/ide/org.codehaus.groovy.eclipse.codeassist.completion/src/org/codehaus/groovy/eclipse/codeassist/requestor/GroovyCompletionProposalComputer.java +++ b/ide/org.codehaus.groovy.eclipse.codeassist.completion/src/org/codehaus/groovy/eclipse/codeassist/requestor/GroovyCompletionProposalComputer.java @@ -119,7 +119,7 @@ public class GroovyCompletionProposalComputer implements IJavaCompletionProposal locationFactories.put(ContentAssistLocation.IMPORT, Collections.unmodifiableList(Arrays.asList( new TypeCompletionProcessorFactory(), new PackageCompletionProcessorFactory(), - new ExpressionCompletionProcessorFactory() + new ExpressionCompletionProcessorFactory() // for static members ))); locationFactories.put(ContentAssistLocation.METHOD_CONTEXT, Collections.unmodifiableList(Arrays.asList(