From 4b5d4875a3c01b6b9370792cbe860e9789c9e802 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Fri, 13 May 2022 11:01:17 +0200 Subject: [PATCH] [java] inferred type accessibility (IDEA-293838) ensure only inferred types (from method type parameters) are affected GitOrigin-RevId: 8eea25ebd9956b4b405c08a4396c6a4b79a3c952 --- .../daemon/impl/analysis/HighlightMethodUtil.java | 5 +++-- .../advFixture/ProtectedInnerClass1.java | 7 +++++++ .../daemon/LightAdvHighlightingFixtureTest.java | 12 ++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advFixture/ProtectedInnerClass1.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java index 5a8d714c9270..3ab65343b609 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightMethodUtil.java @@ -1852,8 +1852,9 @@ public final class HighlightMethodUtil { } private static HighlightInfo checkInferredReturnTypeAccessible(@NotNull MethodCandidateInfo info, @NotNull PsiMethodCallExpression methodCall) { - PsiClass targetClass = PsiUtil.resolveClassInClassTypeOnly(info.getElement().getReturnType()); - if (targetClass instanceof PsiTypeParameter) { + PsiMethod method = info.getElement(); + PsiClass targetClass = PsiUtil.resolveClassInClassTypeOnly(method.getReturnType()); + if (targetClass instanceof PsiTypeParameter && ((PsiTypeParameter)targetClass).getOwner() == method) { PsiClass inferred = PsiUtil.resolveClassInClassTypeOnly(info.getSubstitutor().substitute((PsiTypeParameter)targetClass)); if (inferred != null && !PsiUtil.isAccessible(inferred, methodCall, null)) { return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR) diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advFixture/ProtectedInnerClass1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advFixture/ProtectedInnerClass1.java new file mode 100644 index 000000000000..ddaa5f97d024 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advFixture/ProtectedInnerClass1.java @@ -0,0 +1,7 @@ +package a.b; +import a.*; +class Foo { + void m(Outer o){ + Object obj = o.getData(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingFixtureTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingFixtureTest.java index 848a80cc4d80..06735d8902c6 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingFixtureTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/LightAdvHighlightingFixtureTest.java @@ -266,6 +266,18 @@ public class LightAdvHighlightingFixtureTest extends LightJavaCodeInsightFixture "}"); doTest(); } + + public void testProtectedInnerClass1() { + myFixture.addClass("package a;\n" + + "public class A {\n" + + " public T getData() {return null;}\n" + + "}"); + myFixture.addClass("package a;\n" + + "public class Outer extends A {\n" + + " protected class Inner {}\n" + + "}"); + doTest(); + } private void doTest() { myFixture.configureByFile(getTestName(false) + ".java");