From 55d26d0c2753539d61bfe4b83d22a2626d9c095a Mon Sep 17 00:00:00 2001 From: "Anna.Kozlova" Date: Wed, 7 Feb 2018 18:23:02 +0100 Subject: [PATCH] inherit with different parameterization: fix for raw types (IDEA-186271) --- .../impl/analysis/GenericsHighlightUtil.java | 4 +++- .../InheritFromDifferentParameterizations.java | 14 ++++++++++++++ .../daemon/GenericsHighlightingTest.java | 1 + 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/InheritFromDifferentParameterizations.java diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java index 3996a772cfd0..31e754232416 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java @@ -354,7 +354,9 @@ public class GenericsHighlightUtil { final PsiClass superClass = result.getElement(); if (superClass == null || visited.contains(superClass)) continue; PsiSubstitutor superTypeSubstitutor = result.getSubstitutor(); - superTypeSubstitutor = MethodSignatureUtil.combineSubstitutors(superTypeSubstitutor, derivedSubstitutor); + //JLS 4.8 The superclasses (respectively, superinterfaces) of a raw type are the erasures of the superclasses (superinterfaces) of any of the parameterizations of the generic type. + superTypeSubstitutor = PsiUtil.isRawSubstitutor(aClass, derivedSubstitutor) ? JavaPsiFacade.getElementFactory(aClass.getProject()).createRawSubstitutor(superClass) + : MethodSignatureUtil.combineSubstitutors(superTypeSubstitutor, derivedSubstitutor); final PsiSubstitutor inheritedSubstitutor = inheritedClasses.get(superClass); if (inheritedSubstitutor != null) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/InheritFromDifferentParameterizations.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/InheritFromDifferentParameterizations.java new file mode 100644 index 000000000000..df81bc4ac29d --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/InheritFromDifferentParameterizations.java @@ -0,0 +1,14 @@ + +interface A {} + +interface X1 extends A {} +interface Y1 extends A {} +interface Z1 extends X1, Y1 { } + +interface X2 extends A {} +interface Y2 extends A {} +interface Z2 extends X2, Y2 { } + +interface X3 extends A {} +interface Y3 extends A {} +interface Z3 extends X3, Y3 { } \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/GenericsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/GenericsHighlightingTest.java index cdbecd1f8f5e..89a5dec80b6b 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/GenericsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/daemon/GenericsHighlightingTest.java @@ -430,4 +430,5 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase { public void testRecursiveParamBoundsWhenSuperSubstitution() { doTest6(false); } public void testCaptureForBoundCheck() { doTest6(false); } public void testGetClassInAnonymous() { doTest6(false); } + public void testInheritFromDifferentParameterizations() { doTest6(false); } } \ No newline at end of file