From bc3046982877a542765e65dbbcfed0a1824cced6 Mon Sep 17 00:00:00 2001 From: anna Date: Mon, 14 Feb 2011 18:50:55 +0100 Subject: [PATCH] extract method: search deep for type parameters used in extracted fragment --- .../refactoring/util/RefactoringUtil.java | 46 +++++++++++++++++-- .../extractMethod/ComplexTypeParams.java | 9 ++++ .../ComplexTypeParams_after.java | 13 ++++++ .../refactoring/ExtractMethodTest.java | 4 ++ 4 files changed, 68 insertions(+), 4 deletions(-) create mode 100644 java/java-tests/testData/refactoring/extractMethod/ComplexTypeParams.java create mode 100644 java/java-tests/testData/refactoring/extractMethod/ComplexTypeParams_after.java diff --git a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java index 62a71a3d7752..df71d08c73f3 100644 --- a/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java +++ b/java/java-impl/src/com/intellij/refactoring/util/RefactoringUtil.java @@ -56,6 +56,7 @@ import com.intellij.refactoring.introduceField.ElementToWorkOn; import com.intellij.refactoring.introduceVariable.IntroduceVariableBase; import com.intellij.usageView.UsageInfo; import com.intellij.util.IncorrectOperationException; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashMap; import com.intellij.util.containers.HashSet; import gnu.trove.THashMap; @@ -1269,10 +1270,47 @@ public class RefactoringUtil { public void visitExpression(final PsiExpression expression) { super.visitExpression(expression); final PsiType type = expression.getType(); - final PsiClass resolved = PsiUtil.resolveClassInType(type); - if (resolved instanceof PsiTypeParameter && PsiTreeUtil.isAncestor(((PsiTypeParameter)resolved).getOwner(), element, false) && filter.value( - (PsiTypeParameter)resolved)){ - used.add((PsiTypeParameter)resolved); + if (type != null) { + final TypeParameterSearcher searcher = new TypeParameterSearcher(); + type.accept(searcher); + for (PsiTypeParameter typeParam : searcher.myTypeParams) { + if (PsiTreeUtil.isAncestor(typeParam.getOwner(), element, false) && filter.value(typeParam)){ + used.add(typeParam); + } + } + } + } + + class TypeParameterSearcher extends PsiTypeVisitor { + private final Set myTypeParams = new java.util.HashSet(); + + public Boolean visitType(final PsiType type) { + return false; + } + + public Boolean visitArrayType(final PsiArrayType arrayType) { + return arrayType.getComponentType().accept(this); + } + + public Boolean visitClassType(final PsiClassType classType) { + final PsiClass aClass = classType.resolve(); + if (aClass instanceof PsiTypeParameter) { + myTypeParams.add((PsiTypeParameter)aClass); + } + + final PsiType[] types = classType.getParameters(); + for (final PsiType psiType : types) { + psiType.accept(this); + } + return false; + } + + public Boolean visitWildcardType(final PsiWildcardType wildcardType) { + final PsiType bound = wildcardType.getBound(); + if (bound != null) { + bound.accept(this); + } + return false; } } }); diff --git a/java/java-tests/testData/refactoring/extractMethod/ComplexTypeParams.java b/java/java-tests/testData/refactoring/extractMethod/ComplexTypeParams.java new file mode 100644 index 000000000000..c42f2268547d --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/ComplexTypeParams.java @@ -0,0 +1,9 @@ +import java.util.List; + +public class Test +{ + void foo(List> tr){ + tr.add(null); + } + +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/extractMethod/ComplexTypeParams_after.java b/java/java-tests/testData/refactoring/extractMethod/ComplexTypeParams_after.java new file mode 100644 index 000000000000..9253419d1838 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/ComplexTypeParams_after.java @@ -0,0 +1,13 @@ +import java.util.List; + +public class Test +{ + void foo(List> tr){ + newMethod(tr); + } + + private void newMethod(List> tr) { + tr.add(null); + } + +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java index 356adf3e2f59..5ddf845b5212 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractMethodTest.java @@ -483,6 +483,10 @@ public class ExtractMethodTest extends LightCodeInsightTestCase { doTest(); } + public void testComplexTypeParams() throws Exception { + doTest(); + } + private void doPrepareErrorTest(final String expectedMessage) throws Exception { String expectedError = null; try {