From a4e23d3546e6bcde3cf4329faf4a18c6c8e2ed3b Mon Sep 17 00:00:00 2001 From: anna Date: Tue, 3 Apr 2012 19:14:52 +0200 Subject: [PATCH] good code red: do not allow unchecked conversions on deeper wildcard levels (IDEA-80386) --- .../intellij/psi/util/TypeConversionUtil.java | 34 +++++++++++++++++-- .../genericsHighlighting/IDEA77991.java | 1 + .../genericsHighlighting/IDEA80386.java | 33 ++++++++++++++++++ .../daemon/GenericsHighlightingTest.java | 1 + 4 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA80386.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 557c12198331..1e90d2449297 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 @@ -880,10 +880,10 @@ public class TypeConversionUtil { } else { if (leftWildcard.isExtends()) { - return isAssignable(leftBound, typeRight, allowUncheckedConversion); + return isAssignable(leftBound, typeRight, allowUncheckedConversion && !leftBound.accept(new WildcardDetector())); } else { // isSuper - return isAssignable(typeRight, leftBound, allowUncheckedConversion); + return isAssignable(typeRight, leftBound, allowUncheckedConversion && !leftBound.accept(new WildcardDetector())); } } } @@ -1676,4 +1676,34 @@ public class TypeConversionUtil { return WRAPPER_TO_PRIMITIVE.get(o.getClass()); } + private static class WildcardDetector extends PsiTypeVisitor { + @Override + public Boolean visitCapturedWildcardType(PsiCapturedWildcardType capturedWildcardType) { + return true; + } + + @Override + public Boolean visitWildcardType(PsiWildcardType wildcardType) { + return true; + } + + @Override + public Boolean visitClassType(PsiClassType classType) { + final PsiType[] parameters = classType.getParameters(); + for (PsiType parameter : parameters) { + if (parameter.accept(this)) return true; + } + return super.visitClassType(classType); + } + + @Override + public Boolean visitArrayType(PsiArrayType arrayType) { + return arrayType.getComponentType().accept(this); + } + + @Override + public Boolean visitType(PsiType type) { + return false; + } + } } diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA77991.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA77991.java index 308f6feeed01..507e3cad8262 100644 --- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA77991.java +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA77991.java @@ -2,6 +2,7 @@ class Test { static { Class testClass = get(Test.class); foo(testClass); + Test f = foo(testClass); } static Class get(Class value) { diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA80386.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA80386.java new file mode 100644 index 000000000000..3587f4f125b0 --- /dev/null +++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA80386.java @@ -0,0 +1,33 @@ +import java.util.List; + +public class IDEA80386 { + void foo(Class listClass) { + Class> cls = listClass; + Class < ?extends List > cls1 = listClass; + Class>> cls2 = listClass; + Class> clsS = listClass; + Class clsS1 = listClass; + } + + void fooE(Class listClass) { + Class> cls = listClass; + Class cls1 = listClass; + Class>> cls2 = listClass; + Class> clsS = listClass; + Class clsS1 = listClass; + } + + void fooS(Class listClass) { + Class> cls1 = listClass; + Class>> cls2 = listClass; + Class> clsS = listClass; + Class clsS1 = listClass; + } + + void fooU(Class listClass) { + Class> cls1 = listClass; + Class>> cls2 = listClass; + Class> clsS = listClass; + Class clsS1 = listClass; + } +} 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 c5cc8905b1c5..7d767cf5c083 100644 --- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java +++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java @@ -121,6 +121,7 @@ public class GenericsHighlightingTest extends LightDaemonAnalyzerTestCase { public void testUncheckedWarningsLevel6() throws Exception { doTest(true);} public void testIDEA77991() throws Exception { doTest(false);} + public void testIDEA80386() throws Exception { doTest(false);} public void testJavaUtilCollections_NoVerify() throws Exception { PsiClass collectionsClass = getJavaFacade().findClass("java.util.Collections", GlobalSearchScope.moduleWithLibrariesScope(getModule()));