From 6065034a211ba475c4a4af944f2b25d25926c0ee Mon Sep 17 00:00:00 2001 From: anna Date: Wed, 8 May 2013 11:42:08 +0200 Subject: [PATCH] Type arguments of a raw method (IDEA-57277) --- .../impl/analysis/GenericsHighlightUtil.java | 21 +++++++++ .../TypeArgumentsOnRawType.java | 43 +++++++++++++++++++ .../TypeArgumentsOnRawType17.java | 43 +++++++++++++++++++ .../daemon/GenericsHighlightingTest.java | 2 + 4 files changed, 109 insertions(+) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/TypeArgumentsOnRawType.java create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/TypeArgumentsOnRawType17.java diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java index a44d932a50dc..2c81cd071545 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/GenericsHighlightUtil.java @@ -1400,6 +1400,27 @@ public class GenericsHighlightUtil { if ((parent instanceof PsiCallExpression || parent instanceof PsiMethodReferenceExpression) && PsiUtil.isLanguageLevel7OrHigher(parent)) { return null; } + + if (element instanceof PsiMethod) { + if (((PsiMethod)element).findSuperMethods().length > 0) return null; + if (qualifier instanceof PsiReferenceExpression){ + final PsiClass typeParameter = PsiUtil.resolveClassInType(((PsiReferenceExpression)qualifier).getType()); + if (typeParameter instanceof PsiTypeParameter) { + if (JavaVersionService.getInstance().isAtLeast(element, JavaSdkVersion.JDK_1_7)) return null; + for (PsiClassType classType : typeParameter.getExtendsListTypes()) { + final PsiClass resolve = classType.resolve(); + if (resolve != null) { + final PsiMethod[] superMethods = resolve.findMethodsBySignature((PsiMethod)element, true); + for (PsiMethod superMethod : superMethods) { + if (!PsiUtil.isRawSubstitutor(superMethod, resolveResult.getSubstitutor())) { + return null; + } + } + } + } + } + } + } final String message = element instanceof PsiClass ? JavaErrorMessages.message("generics.type.arguments.on.raw.type") : JavaErrorMessages.message("generics.type.arguments.on.raw.method"); diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/TypeArgumentsOnRawType.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/TypeArgumentsOnRawType.java new file mode 100644 index 000000000000..bbb565f10f6f --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/TypeArgumentsOnRawType.java @@ -0,0 +1,43 @@ +interface I{ + > void foo(); +} + +abstract class A implements I { + public abstract > void foo(); + void bar(T x){ + A a = null; + a.> foo(); + x.> foo(); + } +} + +abstract class B { + public abstract > void foo(); + void bar(T x){ + B a = null; + a.> foo(); + x.> foo(); + } +} + +abstract class C { + public abstract > void foo(); + void bar(T x){ + x.> foo(); + } +} + +//--------------------------------------------------------------- +interface I1 { + void foo(); +} + + +abstract class B1 { + public abstract > void foo(); + void bar(T x){ + B1 a = null; + a.> foo(); + x.> foo(); + } +} diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/TypeArgumentsOnRawType17.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/TypeArgumentsOnRawType17.java new file mode 100644 index 000000000000..f586b18a8a1d --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/TypeArgumentsOnRawType17.java @@ -0,0 +1,43 @@ +interface I{ + > void foo(); +} + +abstract class A implements I { + public abstract > void foo(); + void bar(T x){ + A a = null; + a.> foo(); + x.> foo(); + } +} + +abstract class B { + public abstract > void foo(); + void bar(T x){ + B a = null; + a.> foo(); + x.> foo(); + } +} + +abstract class C { + public abstract > void foo(); + void bar(T x){ + x.> foo(); + } +} + +//--------------------------------------------------------------- +interface I1 { + void foo(); +} + + +abstract class B1 { + public abstract > void foo(); + void bar(T x){ + B1 a = null; + a.> foo(); + x.> foo(); + } +} 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 afc3d15e5b5c..6d92b93eda85 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java @@ -243,6 +243,8 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase { public void testIDEA27185(){ doTest(LanguageLevel.JDK_1_6, JavaSdkVersion.JDK_1_6, false); } public void testIDEA67571(){ doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); } + public void testTypeArgumentsOnRawType(){ doTest(LanguageLevel.JDK_1_6, JavaSdkVersion.JDK_1_6, false); } + public void testTypeArgumentsOnRawType17(){ doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); } public void testWildcardsOnRawTypes() { doTest5(false); } public void testDisableWithinBoundsCheckForSuperWildcards() {