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