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();
}