From 8d97155040b591127469fff3900b7f2e4ef0601e Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 3 Jan 2013 14:42:31 +0100 Subject: [PATCH] erasure: use before subst for type param bound (IDEA-98092) --- .../src/com/intellij/psi/util/TypeConversionUtil.java | 11 ++++++++--- .../ErasureTypeParameterBound.java | 9 +++++++++ .../codeInsight/daemon/GenericsHighlightingTest.java | 1 + 3 files changed, 18 insertions(+), 3 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/ErasureTypeParameterBound.java diff --git a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java index 9f292394da56..c0d120fcf0d1 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/TypeConversionUtil.java @@ -1245,7 +1245,7 @@ public class TypeConversionUtil { if (beforeSubstitutor.getSubstitutionMap().containsKey(boundTypeParameter)) { return erasure(beforeSubstitutor.substitute(boundTypeParameter)); } - return typeParameterErasureInner(boundTypeParameter, visited); + return typeParameterErasureInner(boundTypeParameter, visited, beforeSubstitutor); } else if (psiClass != null) { return JavaPsiFacade.getInstance(typeParameter.getProject()).getElementFactory().createType(psiClass); @@ -1254,14 +1254,19 @@ public class TypeConversionUtil { return PsiType.getJavaLangObject(typeParameter.getManager(), typeParameter.getResolveScope()); } - private static PsiClassType typeParameterErasureInner(PsiTypeParameter typeParameter, Set visited) { + private static PsiClassType typeParameterErasureInner(PsiTypeParameter typeParameter, + Set visited, + PsiSubstitutor beforeSubstitutor) { final PsiClassType[] extendsList = typeParameter.getExtendsList().getReferencedTypes(); if (extendsList.length > 0) { final PsiClass psiClass = extendsList[0].resolve(); if (psiClass instanceof PsiTypeParameter) { if (!visited.contains(psiClass)) { visited.add(psiClass); - return typeParameterErasureInner((PsiTypeParameter)psiClass, visited); + if (beforeSubstitutor.getSubstitutionMap().containsKey(psiClass)) { + return (PsiClassType)erasure(beforeSubstitutor.substitute((PsiTypeParameter)psiClass)); + } + return typeParameterErasureInner((PsiTypeParameter)psiClass, visited, beforeSubstitutor); } } else if (psiClass != null) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/ErasureTypeParameterBound.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/ErasureTypeParameterBound.java new file mode 100644 index 000000000000..9e2a1ea84405 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/ErasureTypeParameterBound.java @@ -0,0 +1,9 @@ +interface Foo { + public void bar(Class key, B value); +} + +class FooImpl implements Foo{ + public void bar(Class key, B value) { + + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java index 8ffa83701b72..56ffbeaf4caa 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java @@ -193,6 +193,7 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase { public void testIDEA97888() { doTest7Incompatibility(false); } public void testMethodCallParamsOnRawType() { doTest5(false); } public void testIDEA98421() { doTest5(false); } + public void testErasureTypeParameterBound() { doTest5(false); } public void testJavaUtilCollections_NoVerify() throws Exception { PsiClass collectionsClass = getJavaFacade().findClass("java.util.Collections", GlobalSearchScope.moduleWithLibrariesScope(getModule()));