From 9697949fe123e974b8aa7e8024bb55235068a952 Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Wed, 9 Dec 2015 20:33:15 +0100 Subject: [PATCH] make variable type A denotable (IDEA-57518; IDEA-57273) --- .../src/com/intellij/psi/GenericsUtil.java | 5 +++++ .../introduceVariable/DenotableType1.after.java | 9 +++++++++ .../refactoring/introduceVariable/DenotableType1.java | 9 +++++++++ .../introduceVariable/DenotableType2.after.java | 11 +++++++++++ .../refactoring/introduceVariable/DenotableType2.java | 11 +++++++++++ .../intellij/refactoring/IntroduceVariableTest.java | 8 ++++++++ 6 files changed, 53 insertions(+) create mode 100644 java/java-tests/testData/refactoring/introduceVariable/DenotableType1.after.java create mode 100644 java/java-tests/testData/refactoring/introduceVariable/DenotableType1.java create mode 100644 java/java-tests/testData/refactoring/introduceVariable/DenotableType2.after.java create mode 100644 java/java-tests/testData/refactoring/introduceVariable/DenotableType2.java diff --git a/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java b/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java index 53c3aa129b02..314580fc7d80 100644 --- a/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java +++ b/java/java-psi-api/src/com/intellij/psi/GenericsUtil.java @@ -320,6 +320,11 @@ public class GenericsUtil { final PsiType bound = wildcardType.getBound(); PsiManager manager = wildcardType.getManager(); if (bound != null) { + + if (wildcardType.isSuper() && bound instanceof PsiIntersectionType) { + return PsiWildcardType.createUnbounded(manager); + } + final PsiType acceptedBound = bound.accept(this); if (acceptedBound instanceof PsiWildcardType) { if (((PsiWildcardType)acceptedBound).isExtends() != wildcardType.isExtends()) return PsiWildcardType.createUnbounded(manager); diff --git a/java/java-tests/testData/refactoring/introduceVariable/DenotableType1.after.java b/java/java-tests/testData/refactoring/introduceVariable/DenotableType1.after.java new file mode 100644 index 000000000000..bbfc213a835b --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceVariable/DenotableType1.after.java @@ -0,0 +1,9 @@ +abstract class A { + abstract T foo(T x, T y); + + { + A>> a = null; + A>> b = null; + A> m = foo(a, b); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceVariable/DenotableType1.java b/java/java-tests/testData/refactoring/introduceVariable/DenotableType1.java new file mode 100644 index 000000000000..4915b3ea9537 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceVariable/DenotableType1.java @@ -0,0 +1,9 @@ +abstract class A { + abstract T foo(T x, T y); + + { + A>> a = null; + A>> b = null; + foo(a, b); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceVariable/DenotableType2.after.java b/java/java-tests/testData/refactoring/introduceVariable/DenotableType2.after.java new file mode 100644 index 000000000000..562d92f748c8 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceVariable/DenotableType2.after.java @@ -0,0 +1,11 @@ +interface I{} +interface A extends I> {} +interface B extends I> {} +abstract class X { + + abstract T foo(T x, T y); + + void bar(A x, B y){ + I> m = foo(x, y); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/introduceVariable/DenotableType2.java b/java/java-tests/testData/refactoring/introduceVariable/DenotableType2.java new file mode 100644 index 000000000000..b958e04ef2c9 --- /dev/null +++ b/java/java-tests/testData/refactoring/introduceVariable/DenotableType2.java @@ -0,0 +1,11 @@ +interface I{} +interface A extends I> {} +interface B extends I> {} +abstract class X { + + abstract T foo(T x, T y); + + void bar(A x, B y){ + foo(x, y); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java index 604e779a9544..f84ec7a34264 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java @@ -500,6 +500,14 @@ public class IntroduceVariableTest extends LightCodeInsightTestCase { doTest(new MockIntroduceVariableHandler("m", false, false, false, "Foo.I")); } + public void testDenotableType1() { + doTest(new MockIntroduceVariableHandler("m", false, false, false, "A>")); + } + + public void testDenotableType2() { + doTest(new MockIntroduceVariableHandler("m", false, false, false, "I>")); + } + public void testReturnNonExportedArray() { doTest(new MockIntroduceVariableHandler("i", false, false, false, "java.io.File[]") { @Override