From a04504dddc824345277e2644a1eea4f18b6c1c05 Mon Sep 17 00:00:00 2001 From: peter Date: Mon, 22 Jul 2019 15:20:58 +0200 Subject: [PATCH] don't suggest inaccessible qualifiers when chain-completing a java method reference (IDEA-217955) GitOrigin-RevId: 78fc63c40948e6873279d6fe4c923bf3113a8b2e --- .../codeInsight/completion/JavaNoVariantsDelegator.java | 9 +++++++-- .../OnlyAccessibleClassesInChainedMethodReference.java | 8 ++++++++ .../codeInsight/completion/Normal8CompletionTest.groovy | 7 +++++++ 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/completion/normal/OnlyAccessibleClassesInChainedMethodReference.java diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java index faebdf75e87c..7121e95db2f1 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaNoVariantsDelegator.java @@ -20,6 +20,7 @@ import com.intellij.codeInsight.completion.impl.BetterPrefixMatcher; import com.intellij.codeInsight.completion.impl.CamelHumpMatcher; import com.intellij.codeInsight.lookup.AutoCompletionPolicy; import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.openapi.project.Project; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; import com.intellij.psi.filters.ElementFilter; @@ -154,8 +155,12 @@ public class JavaNoVariantsDelegator extends CompletionContributor { Set plainVariants = JavaSmartCompletionContributor.completeReference(qualifier, qualifier, filter, true, true, parameters, qMatcher); - for (PsiClass aClass : PsiShortNamesCache.getInstance(qualifier.getProject()).getClassesByName(referenceName, qualifier.getResolveScope())) { - plainVariants.add(JavaClassNameCompletionContributor.createClassLookupItem(aClass, true)); + Project project = qualifier.getProject(); + PsiResolveHelper helper = JavaPsiFacade.getInstance(project).getResolveHelper(); + for (PsiClass aClass : PsiShortNamesCache.getInstance(project).getClassesByName(referenceName, qualifier.getResolveScope())) { + if (helper.isAccessible(aClass, qualifier, null)) { + plainVariants.add(JavaClassNameCompletionContributor.createClassLookupItem(aClass, true)); + } } if (!plainVariants.isEmpty()) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/completion/normal/OnlyAccessibleClassesInChainedMethodReference.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/completion/normal/OnlyAccessibleClassesInChainedMethodReference.java new file mode 100644 index 000000000000..0159025c54f4 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/completion/normal/OnlyAccessibleClassesInChainedMethodReference.java @@ -0,0 +1,8 @@ +import java.util.Map; +import java.util.function.Function; +class Test2 { + void test() { + Function, String> fn = Entry::getKex + } +} + diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/Normal8CompletionTest.groovy b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/Normal8CompletionTest.groovy index d2192fefa834..b809e2e1a82e 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/Normal8CompletionTest.groovy +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/completion/Normal8CompletionTest.groovy @@ -350,6 +350,13 @@ class Test88 { myFixture.assertPreferredCompletionItems 0, 'Strings::goo' } + void testOnlyAccessibleClassesInChainedMethodReference() { + configureByTestName() + def p = LookupElementPresentation.renderElement(assertOneElement(myFixture.lookupElements)) + assert p.itemText == 'Entry::getKey' + assert p.tailText.contains(' java.util.Map') + } + void testPreferVariableToLambda() { configureByTestName() myFixture.assertPreferredCompletionItems 0, 'output', 'out -> '