diff --git a/java/java-impl/src/com/intellij/refactoring/extractMethod/ParametrizedDuplicates.java b/java/java-impl/src/com/intellij/refactoring/extractMethod/ParametrizedDuplicates.java index 9b70f6c16022..6014836161ef 100644 --- a/java/java-impl/src/com/intellij/refactoring/extractMethod/ParametrizedDuplicates.java +++ b/java/java-impl/src/com/intellij/refactoring/extractMethod/ParametrizedDuplicates.java @@ -593,16 +593,24 @@ public class ParametrizedDuplicates { if (pattern == copy) return; if (pattern instanceof PsiExpression && copy instanceof PsiExpression && replaceablePatterns.contains(pattern)) { expressions.put((PsiExpression)pattern, (PsiExpression)copy); + return; } - if (pattern instanceof PsiReferenceExpression && copy instanceof PsiReferenceExpression) { - PsiElement resolvedPattern = ((PsiReferenceExpression)pattern).resolve(); - PsiElement resolvedCopy = ((PsiReferenceExpression)copy).resolve(); + if (pattern instanceof PsiJavaCodeReferenceElement && copy instanceof PsiJavaCodeReferenceElement) { + PsiElement resolvedPattern = ((PsiJavaCodeReferenceElement)pattern).resolve(); + PsiElement resolvedCopy = ((PsiJavaCodeReferenceElement)copy).resolve(); if (resolvedPattern != resolvedCopy && resolvedPattern instanceof PsiVariable && resolvedCopy instanceof PsiVariable) { variables.put((PsiVariable)resolvedPattern, (PsiVariable)resolvedCopy); } + PsiElement patternQualifier = ((PsiJavaCodeReferenceElement)pattern).getQualifier(); + PsiElement copyQualifier = ((PsiJavaCodeReferenceElement)copy).getQualifier(); + if (patternQualifier != null && copyQualifier != null) { + collectCopyMapping(patternQualifier, copyQualifier, replaceablePatterns, expressions, variables); + } + return; } - else if (pattern instanceof PsiVariable && copy instanceof PsiVariable) { + + if (pattern instanceof PsiVariable && copy instanceof PsiVariable) { variables.put((PsiVariable)pattern, (PsiVariable)copy); } diff --git a/java/java-tests/testData/refactoring/extractMethod/DuplicatesFullyQualifiedType.java b/java/java-tests/testData/refactoring/extractMethod/DuplicatesFullyQualifiedType.java new file mode 100644 index 000000000000..0d9767f4d691 --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/DuplicatesFullyQualifiedType.java @@ -0,0 +1,31 @@ +public class FullyQualifiedType { + void foo(String s) { + try { + java.net.URL url = parse(s, java.net.URL.class); + System.out.println(url); + if (url != null) { + System.out.println(url.toExternalForm()); + System.out.println(url.getProtocol()); + } + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + + void bar(String s) { + try { + java.net.URL url = parse(s, java.net.URL.class); + System.out.println(url); + if (url != null) { + System.out.println(url.toExternalForm()); + System.out.println(url.getProtocol()); + } + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + + private static T parse(String s, Class aClass) throws Exception { + return aClass.getDeclaredConstructor(String.class).newInstance(s); + } +} diff --git a/java/java-tests/testData/refactoring/extractMethod/DuplicatesFullyQualifiedType_after.java b/java/java-tests/testData/refactoring/extractMethod/DuplicatesFullyQualifiedType_after.java new file mode 100644 index 000000000000..9b4d724ca11b --- /dev/null +++ b/java/java-tests/testData/refactoring/extractMethod/DuplicatesFullyQualifiedType_after.java @@ -0,0 +1,30 @@ +public class FullyQualifiedType { + void foo(String s) { + try { + newMethod(s); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + + private void newMethod(String s) throws Exception { + java.net.URL url = parse(s, java.net.URL.class); + System.out.println(url); + if (url != null) { + System.out.println(url.toExternalForm()); + System.out.println(url.getProtocol()); + } + } + + void bar(String s) { + try { + newMethod(s); + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + + private static T parse(String s, Class aClass) throws Exception { + return aClass.getDeclaredConstructor(String.class).newInstance(s); + } +} diff --git a/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodTest.java b/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodTest.java index 0fc8375c3c75..8d4b315eba80 100644 --- a/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodTest.java +++ b/java/java-tests/testSrc/com/intellij/java/refactoring/ExtractMethodTest.java @@ -299,6 +299,10 @@ public class ExtractMethodTest extends LightCodeInsightTestCase { doDuplicatesTest(); } + public void testDuplicatesFullyQualifiedType() throws Exception { + doDuplicatesTest(); + } + public void testCodeDuplicatesWithContinueNoReturn() throws Exception { doDuplicatesTest(); }