From 6ef43fb5d905a281a3dfad7320b381179a72284d Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 20 Feb 2013 14:26:28 +0100 Subject: [PATCH] check erased types for first param applicability if method substitutor is raw --- .../src/com/intellij/psi/util/PsiUtil.java | 16 ++++++++++++---- .../WildcardsOnRawTypes.java | 15 +++++++++++++++ .../daemon/GenericsHighlightingTest.java | 1 + 3 files changed, 28 insertions(+), 4 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/WildcardsOnRawTypes.java diff --git a/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java b/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java index 9831a32dddb4..3494b083efbe 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java @@ -465,14 +465,16 @@ public final class PsiUtil extends PsiUtilCore { final PsiParameter[] parms = method.getParameterList().getParameters(); if (args.length < parms.length - 1) return ApplicabilityLevel.NOT_APPLICABLE; - if (!areFirstArgumentsApplicable(args, parms, languageLevel, substitutorForMethod)) return ApplicabilityLevel.NOT_APPLICABLE; + final boolean isRaw = isRawSubstitutor(method, substitutorForMethod); + if (!areFirstArgumentsApplicable(args, parms, languageLevel, substitutorForMethod, isRaw)) return ApplicabilityLevel.NOT_APPLICABLE; if (args.length == parms.length) { if (parms.length == 0) return ApplicabilityLevel.FIXED_ARITY; PsiType parmType = getParameterType(parms[parms.length - 1], languageLevel, substitutorForMethod); PsiType argType = args[args.length - 1]; if (argType == null) return ApplicabilityLevel.NOT_APPLICABLE; if (TypeConversionUtil.isAssignable(parmType, argType)) return ApplicabilityLevel.FIXED_ARITY; - if (isRawSubstitutor(method, substitutorForMethod)) { + + if (isRaw) { final PsiType erasedParamType = TypeConversionUtil.erasure(parmType); final PsiType erasedArgType = TypeConversionUtil.erasure(argType); if (erasedArgType != null && erasedParamType != null && @@ -507,13 +509,19 @@ public final class PsiUtil extends PsiUtilCore { private static boolean areFirstArgumentsApplicable(@NotNull PsiType[] args, @NotNull final PsiParameter[] parms, @NotNull LanguageLevel languageLevel, - @NotNull final PsiSubstitutor substitutorForMethod) { + @NotNull final PsiSubstitutor substitutorForMethod, boolean isRaw) { for (int i = 0; i < parms.length - 1; i++) { final PsiType type = args[i]; if (type == null) return false; final PsiParameter parameter = parms[i]; final PsiType substitutedParmType = getParameterType(parameter, languageLevel, substitutorForMethod); - if (!TypeConversionUtil.isAssignable(substitutedParmType, type)) { + if (isRaw) { + final PsiType substErasure = TypeConversionUtil.erasure(substitutedParmType); + final PsiType typeErasure = TypeConversionUtil.erasure(type); + if (substErasure != null && typeErasure != null && !TypeConversionUtil.isAssignable(substErasure, typeErasure)) { + return false; + } + } else if (!TypeConversionUtil.isAssignable(substitutedParmType, type)) { return false; } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/WildcardsOnRawTypes.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/WildcardsOnRawTypes.java new file mode 100644 index 000000000000..10099b254065 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/WildcardsOnRawTypes.java @@ -0,0 +1,15 @@ +import java.util.List; + +public class Main { + Object get(List> nodes, A a) { + return null; + } +} +class DiagramNode {} + +class A { + static void f(Main m, List> nodes){ + final Object data = m.get(nodes, new A()); + final List n = nodes; + } +} \ 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 a7ead1667167..b238fc0e6915 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java @@ -204,6 +204,7 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase { public void testIDEA99061() { doTest5(false); } public void testIDEA99347() { doTest5(false); } public void testIDEA86875() { doTest5(false); } + public void testWildcardsOnRawTypes() { doTest5(false); } public void testDisableWithinBoundsCheckForSuperWildcards() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); }