diff --git a/java/java-tests/testData/refactoring/extractMethodNew/AnonInner.java b/java/java-tests/testData/refactoring/extractMethodNew/AnonInner.java
new file mode 100644
index 000000000000..6431f5b2c48f
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/AnonInner.java
@@ -0,0 +1,24 @@
+
+public class ExtractMethods { }
+abstract class MyButton
+ extends JButton
+ {
+ protected MyButton( String text ) {
+ super( text );
+ }
+}
+class Foo {
+ private JButton createOKButton() {
+ return new MyButton( "OK" ) {
+ public void actionPerformed( int e ) {
+ setVisible( false );
+ }
+ };
+ }
+}
+
+class JButton {
+ public JButton(String text) {
+ }
+ public void setVisible(boolean b) {}
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/AnonInner_after.java b/java/java-tests/testData/refactoring/extractMethodNew/AnonInner_after.java
new file mode 100644
index 000000000000..86c3f649be03
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/AnonInner_after.java
@@ -0,0 +1,28 @@
+
+public class ExtractMethods { }
+abstract class MyButton
+ extends JButton
+ {
+ protected MyButton( String text ) {
+ super( text );
+ }
+}
+class Foo {
+ private JButton createOKButton() {
+ return new MyButton( "OK" ) {
+ public void actionPerformed( int e ) {
+ newMethod();
+ }
+
+ private void newMethod() {
+ setVisible( false );
+ }
+ };
+ }
+}
+
+class JButton {
+ public JButton(String text) {
+ }
+ public void setVisible(boolean b) {}
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingMethodCall.java b/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingMethodCall.java
new file mode 100644
index 000000000000..617884b2d780
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingMethodCall.java
@@ -0,0 +1,24 @@
+import java.util.List;
+
+class C {
+ List x;
+ List y;
+
+ private void foo() {
+
+ if (x.isEmpty()) return;
+ x.remove(0);
+ y.add(str());
+ baz();
+ }
+
+ private void bar() {
+ if (y.isEmpty()) return;
+ y.remove(0);
+ x.add(str());
+ baz();
+ }
+
+ private void baz() { }
+ private String str() { return null; }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingMethodCall_after.java b/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingMethodCall_after.java
new file mode 100644
index 000000000000..f0412f953ccc
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingMethodCall_after.java
@@ -0,0 +1,25 @@
+import java.util.List;
+
+class C {
+ List x;
+ List y;
+
+ private void foo() {
+
+ newMethod(x, y);
+ }
+
+ private void newMethod(List x, List y) {
+ if (x.isEmpty()) return;
+ x.remove(0);
+ y.add(str());
+ baz();
+ }
+
+ private void bar() {
+ newMethod(y, x);
+ }
+
+ private void baz() { }
+ private String str() { return null; }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingWholeStatement.java b/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingWholeStatement.java
new file mode 100644
index 000000000000..62b11ee051ab
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingWholeStatement.java
@@ -0,0 +1,19 @@
+import java.util.List;
+
+class ArgumentFoldingWholeStatement {
+ List x;
+ List y;
+
+ private void foo() {
+ x.add(str());
+ baz();
+ }
+
+ private void bar() {
+ y.add(str());
+ baz();
+ }
+
+ private String str() { return null; }
+ private void baz() { }
+}
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingWholeStatementForUpdate.java b/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingWholeStatementForUpdate.java
new file mode 100644
index 000000000000..fe4045ebc43f
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingWholeStatementForUpdate.java
@@ -0,0 +1,22 @@
+import java.util.List;
+
+class ArgumentFoldingWholeStatement {
+ List x;
+ List y;
+
+ private void foo() {
+
+ for (int i = 0; ++i < 5; x.indexOf(str())) {
+ baz();
+ }
+ }
+
+ private void bar() {
+ for (int i = 0; ++i < 5; y.indexOf(str())) {
+ baz();
+ }
+ }
+
+ private String str() { return null; }
+ private void baz() { }
+}
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingWholeStatementForUpdateList.java b/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingWholeStatementForUpdateList.java
new file mode 100644
index 000000000000..5f63dc1e0d94
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingWholeStatementForUpdateList.java
@@ -0,0 +1,22 @@
+import java.util.List;
+
+class ArgumentFoldingWholeStatement {
+ List x;
+ List y;
+
+ private void foo() {
+
+ for (int i = 0; i < 5; i++, x.indexOf(str())) {
+ baz();
+ }
+ }
+
+ private void bar() {
+ for (int i = 0; i < 5; i++, y.indexOf(str())) {
+ baz();
+ }
+ }
+
+ private String str() { return null; }
+ private void baz() { }
+}
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingWholeStatementForUpdateList_after.java b/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingWholeStatementForUpdateList_after.java
new file mode 100644
index 000000000000..10de66ad3f9f
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingWholeStatementForUpdateList_after.java
@@ -0,0 +1,24 @@
+import java.util.List;
+
+class ArgumentFoldingWholeStatement {
+ List x;
+ List y;
+
+ private void foo() {
+
+ newMethod(x);
+ }
+
+ private void newMethod(List x) {
+ for (int i = 0; i < 5; i++, x.indexOf(str())) {
+ baz();
+ }
+ }
+
+ private void bar() {
+ newMethod(y);
+ }
+
+ private String str() { return null; }
+ private void baz() { }
+}
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingWholeStatementForUpdate_after.java b/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingWholeStatementForUpdate_after.java
new file mode 100644
index 000000000000..7ca04c24282f
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingWholeStatementForUpdate_after.java
@@ -0,0 +1,24 @@
+import java.util.List;
+
+class ArgumentFoldingWholeStatement {
+ List x;
+ List y;
+
+ private void foo() {
+
+ newMethod(x);
+ }
+
+ private void newMethod(List x) {
+ for (int i = 0; ++i < 5; x.indexOf(str())) {
+ baz();
+ }
+ }
+
+ private void bar() {
+ newMethod(y);
+ }
+
+ private String str() { return null; }
+ private void baz() { }
+}
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingWholeStatement_after.java b/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingWholeStatement_after.java
new file mode 100644
index 000000000000..e946d753707c
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ArgumentFoldingWholeStatement_after.java
@@ -0,0 +1,22 @@
+import java.util.List;
+
+class ArgumentFoldingWholeStatement {
+ List x;
+ List y;
+
+ private void foo() {
+ newMethod(x);
+ }
+
+ private void newMethod(List x) {
+ x.add(str());
+ baz();
+ }
+
+ private void bar() {
+ newMethod(y);
+ }
+
+ private String str() { return null; }
+ private void baz() { }
+}
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccess.java b/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccess.java
new file mode 100644
index 000000000000..7d1fd88999b3
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccess.java
@@ -0,0 +1,8 @@
+class Test {
+ void foo(String[] ss) {
+ for(int i = 0; i < ss.length; i++) {
+ System.out.println(ss[i]);
+ System.out.println(ss[i] + ss[i]);
+ }
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccess1.java b/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccess1.java
new file mode 100644
index 000000000000..7ec503300ed4
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccess1.java
@@ -0,0 +1,10 @@
+class Test {
+ void foo(String[] ss, String[] bb) {
+ for(int i = 0; i < ss.length; i++) {
+
+ System.out.println(ss[i]);
+ System.out.println(bb[i]);
+
+ }
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccess1_after.java b/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccess1_after.java
new file mode 100644
index 000000000000..abecb60b4eca
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccess1_after.java
@@ -0,0 +1,14 @@
+class Test {
+ void foo(String[] ss, String[] bb) {
+ for(int i = 0; i < ss.length; i++) {
+
+ newMethod(ss[i], bb[i]);
+
+ }
+ }
+
+ private void newMethod(String s, String s1) {
+ System.out.println(s);
+ System.out.println(s1);
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccessWithDuplicates.java b/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccessWithDuplicates.java
new file mode 100644
index 000000000000..85248fba6cad
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccessWithDuplicates.java
@@ -0,0 +1,6 @@
+class Test {
+ void foo(String[] ss) {
+ System.out.println(ss[0]);
+ System.out.println(ss[0]);
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccessWithDuplicates_after.java b/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccessWithDuplicates_after.java
new file mode 100644
index 000000000000..64496be89f1e
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccessWithDuplicates_after.java
@@ -0,0 +1,10 @@
+class Test {
+ void foo(String[] ss) {
+ newMethod(ss[0]);
+ newMethod(ss[0]);
+ }
+
+ private void newMethod(String s) {
+ System.out.println(s);
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccessWithLocalIndex.java b/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccessWithLocalIndex.java
new file mode 100644
index 000000000000..cb850bd94990
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccessWithLocalIndex.java
@@ -0,0 +1,9 @@
+class Test {
+ void foo(String[] ss) {
+ Integer[] levels = new Integer[]{Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3),};
+ Integer[] nextWinNumber = new Integer[6];
+ for (Integer level : levels) {
+ Integer nextWinNum = nextWinNumber[level - 1];
+ }
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccessWithLocalIndex_after.java b/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccessWithLocalIndex_after.java
new file mode 100644
index 000000000000..497400c0f37c
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccessWithLocalIndex_after.java
@@ -0,0 +1,13 @@
+class Test {
+ void foo(String[] ss) {
+ Integer[] levels = new Integer[]{Integer.valueOf(1), Integer.valueOf(2), Integer.valueOf(3),};
+ Integer[] nextWinNumber = new Integer[6];
+ newMethod(levels, nextWinNumber);
+ }
+
+ private void newMethod(Integer[] levels, Integer[] nextWinNumber) {
+ for (Integer level : levels) {
+ Integer nextWinNum = nextWinNumber[level - 1];
+ }
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccessWithTopExpression.java b/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccessWithTopExpression.java
new file mode 100644
index 000000000000..453e376880d5
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccessWithTopExpression.java
@@ -0,0 +1,8 @@
+class Test {
+ {
+ int i = 0;
+ double[] doubles = null;
+
+ double progressResult = doubles[0] / i;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccessWithTopExpression_after.java b/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccessWithTopExpression_after.java
new file mode 100644
index 000000000000..b3cad8ff539e
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccessWithTopExpression_after.java
@@ -0,0 +1,12 @@
+class Test {
+ {
+ int i = 0;
+ double[] doubles = null;
+
+ newMethod(doubles[0] / i);
+ }
+
+ private void newMethod(double progressResult1) {
+ double progressResult = progressResult1;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccess_after.java b/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccess_after.java
new file mode 100644
index 000000000000..d8b4d1643309
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ArrayAccess_after.java
@@ -0,0 +1,12 @@
+class Test {
+ void foo(String[] ss) {
+ for(int i = 0; i < ss.length; i++) {
+ newMethod(ss[i]);
+ }
+ }
+
+ private void newMethod(String s) {
+ System.out.println(s);
+ System.out.println(s + s);
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ArrayReturnType.java b/java/java-tests/testData/refactoring/extractMethodNew/ArrayReturnType.java
new file mode 100644
index 000000000000..355a4e97206f
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ArrayReturnType.java
@@ -0,0 +1,10 @@
+class Test {
+ String[] foos;
+
+ void test() {
+ for (String foo : foos) {
+
+ }
+ System.out.println(foos.length);
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ArrayReturnType_after.java b/java/java-tests/testData/refactoring/extractMethodNew/ArrayReturnType_after.java
new file mode 100644
index 000000000000..de7dae99935d
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ArrayReturnType_after.java
@@ -0,0 +1,14 @@
+class Test {
+ String[] foos;
+
+ void test() {
+ for (String foo : newMethod()) {
+
+ }
+ System.out.println(newMethod().length);
+ }
+
+ private String[] newMethod() {
+ return foos;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/AvoidGenericArgumentCast.java b/java/java-tests/testData/refactoring/extractMethodNew/AvoidGenericArgumentCast.java
new file mode 100644
index 000000000000..8cb66b52dd68
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/AvoidGenericArgumentCast.java
@@ -0,0 +1,10 @@
+class C {
+ void f(K k) {
+ System.out.println(k);
+ }
+
+ void g() {
+ Object o = "";
+ System.out.println(o);
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/AvoidGenericArgumentCastLocalClass.java b/java/java-tests/testData/refactoring/extractMethodNew/AvoidGenericArgumentCastLocalClass.java
new file mode 100644
index 000000000000..05c233036047
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/AvoidGenericArgumentCastLocalClass.java
@@ -0,0 +1,13 @@
+class C {
+ void method() {
+ class Local {
+ void foo(K k) {
+ System.out.println(k);
+ }
+ void bar() {
+ Object o = new Object();
+ System.out.println(o);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/AvoidGenericArgumentCastLocalClass_after.java b/java/java-tests/testData/refactoring/extractMethodNew/AvoidGenericArgumentCastLocalClass_after.java
new file mode 100644
index 000000000000..2c6718d8f6d7
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/AvoidGenericArgumentCastLocalClass_after.java
@@ -0,0 +1,18 @@
+class C {
+ void method() {
+ class Local {
+ void foo(K k) {
+ newMethod(k);
+ }
+
+ private void newMethod(K k) {
+ System.out.println(k);
+ }
+
+ void bar() {
+ Object o = new Object();
+ newMethod(o);
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/AvoidGenericArgumentCast_after.java b/java/java-tests/testData/refactoring/extractMethodNew/AvoidGenericArgumentCast_after.java
new file mode 100644
index 000000000000..c98f87e1ce52
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/AvoidGenericArgumentCast_after.java
@@ -0,0 +1,14 @@
+class C {
+ void f(K k) {
+ newMethod(k);
+ }
+
+ private void newMethod(K k) {
+ System.out.println(k);
+ }
+
+ void g() {
+ Object o = "";
+ newMethod(o);
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/BeforeCommentAfterSelectedFragment.java b/java/java-tests/testData/refactoring/extractMethodNew/BeforeCommentAfterSelectedFragment.java
new file mode 100644
index 000000000000..8b69426d7098
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/BeforeCommentAfterSelectedFragment.java
@@ -0,0 +1,10 @@
+class CommentAfterSelectedFragment {
+ foo(boolean debugMode) {
+ int i= 0;
+
+ if (debugMode) {
+ i = 1;
+ } /* comment */
+ System.out.println(i);
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/BeforeCommentAfterSelectedFragment_after.java b/java/java-tests/testData/refactoring/extractMethodNew/BeforeCommentAfterSelectedFragment_after.java
new file mode 100644
index 000000000000..970f5f31f6f9
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/BeforeCommentAfterSelectedFragment_after.java
@@ -0,0 +1,15 @@
+class CommentAfterSelectedFragment {
+ foo(boolean debugMode) {
+ int i= 0;
+
+ i = newMethod(debugMode, i);
+ System.out.println(i);
+ }
+
+ private int newMethod(boolean debugMode, int i) {
+ if (debugMode) {
+ i = 1;
+ } /* comment */
+ return i;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/BooleanExpression.java b/java/java-tests/testData/refactoring/extractMethodNew/BooleanExpression.java
new file mode 100644
index 000000000000..e039152086e3
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/BooleanExpression.java
@@ -0,0 +1,5 @@
+class Test {
+ void method(int i) {
+ boolean isDirty = i == 0 || otherTests();
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/BooleanExpression_after.java b/java/java-tests/testData/refactoring/extractMethodNew/BooleanExpression_after.java
new file mode 100644
index 000000000000..859d12c4388f
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/BooleanExpression_after.java
@@ -0,0 +1,9 @@
+class Test {
+ void method(int i) {
+ boolean isDirty = newMethod(i) || otherTests();
+ }
+
+ private boolean newMethod(int i) {
+ return i == 0;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/BoxedConditionalReturn.java b/java/java-tests/testData/refactoring/extractMethodNew/BoxedConditionalReturn.java
new file mode 100644
index 000000000000..f9d35ac7b5f9
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/BoxedConditionalReturn.java
@@ -0,0 +1,18 @@
+class Test {
+ public static Integer foo(Integer[] a) {
+
+ if (a.length != 0) {
+ int n = a[0] != null ? a[0] : 0;
+ return n;
+ }
+ return null;
+ }
+
+ public static Integer bar(Integer[] a) {
+ if (a.length != 0) {
+ int n = a[0] != null ? a[0] : 0;
+ return n;
+ }
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/BoxedConditionalReturn_after.java b/java/java-tests/testData/refactoring/extractMethodNew/BoxedConditionalReturn_after.java
new file mode 100644
index 000000000000..ca7e24ea0123
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/BoxedConditionalReturn_after.java
@@ -0,0 +1,25 @@
+import org.jetbrains.annotations.Nullable;
+
+class Test {
+ public static Integer foo(Integer[] a) {
+
+ Integer n = newMethod(a);
+ if (n != null) return n;
+ return null;
+ }
+
+ @Nullable
+ private static Integer newMethod(Integer[] a) {
+ if (a.length != 0) {
+ int n = a[0] != null ? a[0] : 0;
+ return n;
+ }
+ return null;
+ }
+
+ public static Integer bar(Integer[] a) {
+ Integer n = newMethod(a);
+ if (n != null) return n;
+ return null;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWith2DimArrayAccess.java b/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWith2DimArrayAccess.java
new file mode 100644
index 000000000000..4c8b730e589c
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWith2DimArrayAccess.java
@@ -0,0 +1,11 @@
+class Foo {
+ boolean bar(String[][] a) {
+ for (int i = 0; i < a.length; i++)
+ for (int j = 0; i < a[i].length; j++) {
+ if (a[i][j].length() > 3 && i % 3 == 0)
+ return true;
+
+ }
+ return false;
+ }
+}
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWith2DimArrayAccess_after.java b/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWith2DimArrayAccess_after.java
new file mode 100644
index 000000000000..c04f3fb6da0a
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWith2DimArrayAccess_after.java
@@ -0,0 +1,16 @@
+class Foo {
+ boolean bar(String[][] a) {
+ for (int i = 0; i < a.length; i++)
+ for (int j = 0; i < a[i].length; j++) {
+ if (newMethod(a, i, j)) return true;
+
+ }
+ return false;
+ }
+
+ private boolean newMethod(String[][] a, int i, int j) {
+ if (a[i][j].length() > 3 && i % 3 == 0)
+ return true;
+ return false;
+ }
+}
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWithArrayAccess.java b/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWithArrayAccess.java
new file mode 100644
index 000000000000..3f2be2ea0d65
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWithArrayAccess.java
@@ -0,0 +1,15 @@
+class UseBuilder {
+ void test(Builder builder, int[] arr) {
+ builder.foo("xyz").bar(arr[0]).foo("abc");
+ }
+
+ static class Builder {
+ Builder foo(String s) {
+ return this;
+ }
+
+ Builder bar(int x) {
+ return this;
+ }
+ }
+}
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWithArrayAccessExpr.java b/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWithArrayAccessExpr.java
new file mode 100644
index 000000000000..11f0607aaf81
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWithArrayAccessExpr.java
@@ -0,0 +1,15 @@
+class UseBuilder {
+ void test(Builder builder, int[] arr) {
+ builder.foo("xyz").bar(arr[0]).foo("abc");
+ }
+
+ static class Builder {
+ Builder foo(String s) {
+ return this;
+ }
+
+ Builder bar(int x) {
+ return this;
+ }
+ }
+}
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWithArrayAccessExpr_after.java b/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWithArrayAccessExpr_after.java
new file mode 100644
index 000000000000..0ad6a1d75ad0
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWithArrayAccessExpr_after.java
@@ -0,0 +1,19 @@
+class UseBuilder {
+ void test(Builder builder, int[] arr) {
+ newMethod(builder, arr[0]).foo("abc");
+ }
+
+ private Builder newMethod(Builder builder, int x) {
+ return builder.foo("xyz").bar(x);
+ }
+
+ static class Builder {
+ Builder foo(String s) {
+ return this;
+ }
+
+ Builder bar(int x) {
+ return this;
+ }
+ }
+}
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWithArrayAccessIf.java b/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWithArrayAccessIf.java
new file mode 100644
index 000000000000..d5a624418922
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWithArrayAccessIf.java
@@ -0,0 +1,9 @@
+class Foo {
+ boolean bar(String[] a) {
+ for (int i = 0; i < a.length; i++) {
+ if (a[i].length() > 3 && i % 3 == 0)
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWithArrayAccessIf_after.java b/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWithArrayAccessIf_after.java
new file mode 100644
index 000000000000..68d0467f17db
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWithArrayAccessIf_after.java
@@ -0,0 +1,14 @@
+class Foo {
+ boolean bar(String[] a) {
+ for (int i = 0; i < a.length; i++) {
+ if (newMethod(a, i)) return true;
+ }
+ return false;
+ }
+
+ private boolean newMethod(String[] a, int i) {
+ if (a[i].length() > 3 && i % 3 == 0)
+ return true;
+ return false;
+ }
+}
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWithArrayAccess_after.java b/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWithArrayAccess_after.java
new file mode 100644
index 000000000000..3e4109c1c899
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/BuilderChainWithArrayAccess_after.java
@@ -0,0 +1,19 @@
+class UseBuilder {
+ void test(Builder builder, int[] arr) {
+ newMethod(builder, arr[0]);
+ }
+
+ private void newMethod(Builder builder, int x) {
+ builder.foo("xyz").bar(x).foo("abc");
+ }
+
+ static class Builder {
+ Builder foo(String s) {
+ return this;
+ }
+
+ Builder bar(int x) {
+ return this;
+ }
+ }
+}
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CallChainExpression.java b/java/java-tests/testData/refactoring/extractMethodNew/CallChainExpression.java
new file mode 100644
index 000000000000..f8aafa4cf157
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CallChainExpression.java
@@ -0,0 +1,13 @@
+class CallChainExpression {
+ String foo() {
+ String s = A.a().b().c;
+ System.out.println(s);
+ return s;
+ }
+
+ static class A {
+ static A a() { return new A(); }
+ A b() { return this; }
+ String c = "";
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CallChainExpression_after.java b/java/java-tests/testData/refactoring/extractMethodNew/CallChainExpression_after.java
new file mode 100644
index 000000000000..eaf6211359be
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CallChainExpression_after.java
@@ -0,0 +1,17 @@
+class CallChainExpression {
+ String foo() {
+ String s = newMethod();
+ System.out.println(s);
+ return s;
+ }
+
+ private String newMethod() {
+ return A.a().b().c;
+ }
+
+ static class A {
+ static A a() { return new A(); }
+ A b() { return this; }
+ String c = "";
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CallOn2DimArrayElement.java b/java/java-tests/testData/refactoring/extractMethodNew/CallOn2DimArrayElement.java
new file mode 100644
index 000000000000..cf33c80c42d4
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CallOn2DimArrayElement.java
@@ -0,0 +1,5 @@
+class C {
+ int foo(String[][] vars, int i, int j) {
+ return vars[i][j].length();
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CallOn2DimArrayElement_after.java b/java/java-tests/testData/refactoring/extractMethodNew/CallOn2DimArrayElement_after.java
new file mode 100644
index 000000000000..495f7d8f629e
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CallOn2DimArrayElement_after.java
@@ -0,0 +1,9 @@
+class C {
+ int foo(String[][] vars, int i, int j) {
+ return newMethod(vars[i][j]);
+ }
+
+ private int newMethod(String s) {
+ return s.length();
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CallOnArrayElement.java b/java/java-tests/testData/refactoring/extractMethodNew/CallOnArrayElement.java
new file mode 100644
index 000000000000..7794ab9692f3
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CallOnArrayElement.java
@@ -0,0 +1,5 @@
+class C {
+ int foo(String[] vars, int i) {
+ return vars[i].length();
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CallOnArrayElement_after.java b/java/java-tests/testData/refactoring/extractMethodNew/CallOnArrayElement_after.java
new file mode 100644
index 000000000000..5c74700b8918
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CallOnArrayElement_after.java
@@ -0,0 +1,9 @@
+class C {
+ int foo(String[] vars, int i) {
+ return newMethod(vars[i]);
+ }
+
+ private int newMethod(String var) {
+ return var.length();
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CallOnFieldArrayElement.java b/java/java-tests/testData/refactoring/extractMethodNew/CallOnFieldArrayElement.java
new file mode 100644
index 000000000000..c5aca75e0a9d
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CallOnFieldArrayElement.java
@@ -0,0 +1,6 @@
+class C {
+ String[] vars;
+ int foo(C c, int i) {
+ return c.vars[i].length();
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CallOnFieldArrayElement_after.java b/java/java-tests/testData/refactoring/extractMethodNew/CallOnFieldArrayElement_after.java
new file mode 100644
index 000000000000..569e9b96299c
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CallOnFieldArrayElement_after.java
@@ -0,0 +1,10 @@
+class C {
+ String[] vars;
+ int foo(C c, int i) {
+ return newMethod(c.vars[i]);
+ }
+
+ private int newMethod(String var) {
+ return var.length();
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CantPassFieldAsParameter.java b/java/java-tests/testData/refactoring/extractMethodNew/CantPassFieldAsParameter.java
new file mode 100644
index 000000000000..7eb85c4ab5c5
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CantPassFieldAsParameter.java
@@ -0,0 +1,6 @@
+class X {
+ private int myI;
+ void foo() {
+ int i = myI++;
+ }
+}
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/Cast4ParamGeneration.java b/java/java-tests/testData/refactoring/extractMethodNew/Cast4ParamGeneration.java
new file mode 100644
index 000000000000..a36c65d88461
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/Cast4ParamGeneration.java
@@ -0,0 +1,11 @@
+public class Test {
+ void foo(Object o) {
+ if (o instanceof A) {
+ ((A)o).bar();
+ }
+ }
+}
+
+class A {
+ void bar(){}
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/Cast4ParamGeneration_after.java b/java/java-tests/testData/refactoring/extractMethodNew/Cast4ParamGeneration_after.java
new file mode 100644
index 000000000000..3c55402357eb
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/Cast4ParamGeneration_after.java
@@ -0,0 +1,15 @@
+public class Test {
+ void foo(Object o) {
+ if (o instanceof A) {
+ newMethod((A) o);
+ }
+ }
+
+ private void newMethod(A o) {
+ o.bar();
+ }
+}
+
+class A {
+ void bar(){}
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CastWhenDuplicateReplacement.java b/java/java-tests/testData/refactoring/extractMethodNew/CastWhenDuplicateReplacement.java
new file mode 100644
index 000000000000..68a91fd51b8f
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CastWhenDuplicateReplacement.java
@@ -0,0 +1,7 @@
+class Test {
+
+ void foo(Object x) {
+ if (x instanceof String) x = ((String)x).substring(1);
+ if (x instanceof String) x = ((String)x).substring(1);
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CastWhenDuplicateReplacement_after.java b/java/java-tests/testData/refactoring/extractMethodNew/CastWhenDuplicateReplacement_after.java
new file mode 100644
index 000000000000..dbe5a20546ce
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CastWhenDuplicateReplacement_after.java
@@ -0,0 +1,14 @@
+import org.jetbrains.annotations.NotNull;
+
+class Test {
+
+ void foo(Object x) {
+ if (x instanceof String) x = newMethod((String) x);
+ if (x instanceof String) x = newMethod((String) x);
+ }
+
+ @NotNull
+ private String newMethod(String x) {
+ return x.substring(1);
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ChainedConstructor.java b/java/java-tests/testData/refactoring/extractMethodNew/ChainedConstructor.java
new file mode 100644
index 000000000000..c69c2f6a06b6
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ChainedConstructor.java
@@ -0,0 +1,9 @@
+class A {
+ private int i;
+ private int j;
+
+ public A(int i, int j) {
+ this.i = i;
+ this.j = j;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ChainedConstructorDuplicates.java b/java/java-tests/testData/refactoring/extractMethodNew/ChainedConstructorDuplicates.java
new file mode 100644
index 000000000000..30ccf5a8d350
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ChainedConstructorDuplicates.java
@@ -0,0 +1,15 @@
+class A {
+ private int i;
+ private int j;
+ private int s;
+
+ public A(int i, int j) {
+ this.i = i;
+ this.j = j;
+ }
+
+ public A(int i, String s) {
+ this.i = i;
+ this.s = s;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ChainedConstructorDuplicates_after.java b/java/java-tests/testData/refactoring/extractMethodNew/ChainedConstructorDuplicates_after.java
new file mode 100644
index 000000000000..70f9fa161b00
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ChainedConstructorDuplicates_after.java
@@ -0,0 +1,19 @@
+class A {
+ private int i;
+ private int j;
+ private int s;
+
+ public A(int i, int j) {
+ this(i);
+ this.j = j;
+ }
+
+ private A(int i) {
+ this.i = i;
+ }
+
+ public A(int i, String s) {
+ this(i);
+ this.s = s;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ChainedConstructorInvalidDuplicates.java b/java/java-tests/testData/refactoring/extractMethodNew/ChainedConstructorInvalidDuplicates.java
new file mode 100644
index 000000000000..696090f4eb1f
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ChainedConstructorInvalidDuplicates.java
@@ -0,0 +1,15 @@
+class A {
+ private int i;
+ private int j;
+ private int s;
+
+ public A(int i, int j) {
+ this.i = i;
+ this.j = j;
+ }
+
+ public A(int i, String s) {
+ this.s = s;
+ this.i = i;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ChainedConstructorInvalidDuplicates_after.java b/java/java-tests/testData/refactoring/extractMethodNew/ChainedConstructorInvalidDuplicates_after.java
new file mode 100644
index 000000000000..53b78ecc3d3c
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ChainedConstructorInvalidDuplicates_after.java
@@ -0,0 +1,19 @@
+class A {
+ private int i;
+ private int j;
+ private int s;
+
+ public A(int i, int j) {
+ this(i);
+ this.j = j;
+ }
+
+ private A(int i) {
+ this.i = i;
+ }
+
+ public A(int i, String s) {
+ this.s = s;
+ this.i = i;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ChainedConstructor_after.java b/java/java-tests/testData/refactoring/extractMethodNew/ChainedConstructor_after.java
new file mode 100644
index 000000000000..bb45e0bbe12a
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ChainedConstructor_after.java
@@ -0,0 +1,13 @@
+class A {
+ private int i;
+ private int j;
+
+ public A(int i, int j) {
+ this(i);
+ this.j = j;
+ }
+
+ private A(int i) {
+ this.i = i;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ChangedReturnType.java b/java/java-tests/testData/refactoring/extractMethodNew/ChangedReturnType.java
new file mode 100644
index 000000000000..627f2f8c7b8b
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ChangedReturnType.java
@@ -0,0 +1,13 @@
+class X {
+ void foo(java.util.List l) {
+ for (Object o : l) {
+ if (o == null) continue;
+ String x = bar(o);
+ System.out.println(x);
+ }
+ }
+
+ private String bar(Object o) {
+ return "";
+ }
+}
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ChangedReturnType_after.java b/java/java-tests/testData/refactoring/extractMethodNew/ChangedReturnType_after.java
new file mode 100644
index 000000000000..359aa9483800
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ChangedReturnType_after.java
@@ -0,0 +1,22 @@
+import org.jetbrains.annotations.Nullable;
+
+class X {
+ void foo(java.util.List l) {
+ for (Object o : l) {
+ Object x = newMethod(o);
+ if (x == null) continue;
+ System.out.println(x);
+ }
+ }
+
+ @Nullable
+ private Object newMethod(Object o) {
+ if (o == null) return null;
+ String x = bar(o);
+ return x;
+ }
+
+ private String bar(Object o) {
+ return "";
+ }
+}
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CheckQualifierMapping.java b/java/java-tests/testData/refactoring/extractMethodNew/CheckQualifierMapping.java
new file mode 100644
index 000000000000..46ea8a3e3489
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CheckQualifierMapping.java
@@ -0,0 +1,14 @@
+import java.util.*;
+class Test {
+
+ public void method() {
+ String a = "A";
+ ArrayList listA = new ArrayList();
+ listA.add(a);
+
+ ArrayList listB = new ArrayList();
+ ArrayList listC = new ArrayList();
+ listB.add("B");
+ listC.add("C");
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CheckQualifierMapping_after.java b/java/java-tests/testData/refactoring/extractMethodNew/CheckQualifierMapping_after.java
new file mode 100644
index 000000000000..c33b439a2138
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CheckQualifierMapping_after.java
@@ -0,0 +1,18 @@
+import java.util.*;
+class Test {
+
+ public void method() {
+ String a = "A";
+ newMethod(a);
+
+ ArrayList listB = new ArrayList();
+ ArrayList listC = new ArrayList();
+ listB.add("B");
+ listC.add("C");
+ }
+
+ private void newMethod(String a) {
+ ArrayList listA = new ArrayList();
+ listA.add(a);
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ClassReference.java b/java/java-tests/testData/refactoring/extractMethodNew/ClassReference.java
new file mode 100644
index 000000000000..3eec91cf5b2f
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ClassReference.java
@@ -0,0 +1,19 @@
+class C {
+ Object foo(boolean b) {
+ if (b) {
+ return A.getInstance();
+ } else {
+ return B.getInstance();
+ }
+ }
+}
+class A {
+ static A getInstance() {
+ return new A();
+ }
+}
+class B extends A {
+ static B getInstance() {
+ return new B();
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ClassReference2.java b/java/java-tests/testData/refactoring/extractMethodNew/ClassReference2.java
new file mode 100644
index 000000000000..a8fc11819921
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ClassReference2.java
@@ -0,0 +1,16 @@
+class C {
+ Object foo(boolean b) {
+ if (b) {
+ return A.getInstance();
+ } else {
+ return B.getInstance();
+ }
+ }
+}
+class A {
+ static A getInstance() {
+ return new A();
+ }
+}
+class B extends A {
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ClassReference2_after.java b/java/java-tests/testData/refactoring/extractMethodNew/ClassReference2_after.java
new file mode 100644
index 000000000000..e05a47b4fa1a
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ClassReference2_after.java
@@ -0,0 +1,23 @@
+import org.jetbrains.annotations.NotNull;
+
+class C {
+ Object foo(boolean b) {
+ if (b) {
+ return newMethod();
+ } else {
+ return newMethod();
+ }
+ }
+
+ @NotNull
+ private Object newMethod() {
+ return A.getInstance();
+ }
+}
+class A {
+ static A getInstance() {
+ return new A();
+ }
+}
+class B extends A {
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/ClassReference_after.java b/java/java-tests/testData/refactoring/extractMethodNew/ClassReference_after.java
new file mode 100644
index 000000000000..87324962ce5d
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/ClassReference_after.java
@@ -0,0 +1,26 @@
+import org.jetbrains.annotations.NotNull;
+
+class C {
+ Object foo(boolean b) {
+ if (b) {
+ return newMethod();
+ } else {
+ return B.getInstance();
+ }
+ }
+
+ @NotNull
+ private Object newMethod() {
+ return A.getInstance();
+ }
+}
+class A {
+ static A getInstance() {
+ return new A();
+ }
+}
+class B extends A {
+ static B getInstance() {
+ return new B();
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates.java b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates.java
new file mode 100644
index 000000000000..291e623a1516
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates.java
@@ -0,0 +1,8 @@
+class C {
+ {
+ int i;
+
+ System.out.println(i);
+ System.out.println(128);
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates2.java b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates2.java
new file mode 100644
index 000000000000..0ac81a21b961
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates2.java
@@ -0,0 +1,15 @@
+class C {
+ {
+ Object[] array;
+
+ for (int i = 0; i < array.length; i++) {
+ System.out.println(array[i]);
+ }
+
+
+ Object[] array1;
+ for (int i = 0; i < array1.length; i++) {
+ System.out.println(array[i]);
+ }
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates2_after.java b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates2_after.java
new file mode 100644
index 000000000000..e4a1b396e91f
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates2_after.java
@@ -0,0 +1,19 @@
+class C {
+ {
+ Object[] array;
+
+ newMethod(array);
+
+
+ Object[] array1;
+ for (int i = 0; i < array1.length; i++) {
+ System.out.println(array[i]);
+ }
+ }
+
+ private void newMethod(Object[] array) {
+ for (int i = 0; i < array.length; i++) {
+ System.out.println(array[i]);
+ }
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates3.java b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates3.java
new file mode 100644
index 000000000000..70538c646eaf
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates3.java
@@ -0,0 +1,15 @@
+class C {
+ {
+ Object[] array;
+
+ for (int i = 0; i < array.length; i++) {
+ System.out.println(array[i]);
+ }
+
+
+ Object[] array1;
+ for (int i = 0; i < array1.length; i++) {
+ System.out.println(array1[i]);
+ }
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates3_after.java b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates3_after.java
new file mode 100644
index 000000000000..f2b59d1bcd31
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates3_after.java
@@ -0,0 +1,17 @@
+class C {
+ {
+ Object[] array;
+
+ newMethod(array);
+
+
+ Object[] array1;
+ newMethod(array1);
+ }
+
+ private void newMethod(Object[] array) {
+ for (int i = 0; i < array.length; i++) {
+ System.out.println(array[i]);
+ }
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates4.java b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates4.java
new file mode 100644
index 000000000000..f22baf62e3d0
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates4.java
@@ -0,0 +1,15 @@
+class C {
+ {
+ Object[] array;
+
+ for (int i = 0; i < array.length; i++) {
+ System.out.println(array[i]);
+ }
+
+
+ Object[] array1;
+ for (int j = 0; j < array1.length; j++) {
+ System.out.println(array1[j]);
+ }
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates4_after.java b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates4_after.java
new file mode 100644
index 000000000000..f2b59d1bcd31
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates4_after.java
@@ -0,0 +1,17 @@
+class C {
+ {
+ Object[] array;
+
+ newMethod(array);
+
+
+ Object[] array1;
+ newMethod(array1);
+ }
+
+ private void newMethod(Object[] array) {
+ for (int i = 0; i < array.length; i++) {
+ System.out.println(array[i]);
+ }
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates5.java b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates5.java
new file mode 100644
index 000000000000..05197ad38bf1
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates5.java
@@ -0,0 +1,30 @@
+class D {}
+class C extends D {
+ int myField = 10;
+ int myOtherField = 10;
+
+ {
+ int i = 5;
+ myField = i;
+ myOtherField = i;
+
+ C c = new C();
+
+ c.myField = 12;
+ c.myOtherField = 12;
+
+ C c1 = new C();
+ c1.myField = 12;
+ myOtherField = 12;
+
+
+ //not a duplicate: method is not visible with qualifer class
+ D d1 = new D();
+ d1.myField = 12;
+ d1.myOtherField = 12;
+
+
+ c.myField = 15;
+ c1.myOtherField = 15;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates5_after.java b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates5_after.java
new file mode 100644
index 000000000000..f603c3d2844f
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicates5_after.java
@@ -0,0 +1,33 @@
+class D {}
+class C extends D {
+ int myField = 10;
+ int myOtherField = 10;
+
+ {
+ int i = 5;
+ newMethod(i);
+
+ C c = new C();
+
+ c.newMethod(12);
+
+ C c1 = new C();
+ c1.myField = 12;
+ myOtherField = 12;
+
+
+ //not a duplicate: method is not visible with qualifer class
+ D d1 = new D();
+ d1.myField = 12;
+ d1.myOtherField = 12;
+
+
+ c.myField = 15;
+ c1.myOtherField = 15;
+ }
+
+ private void newMethod(int i) {
+ myField = i;
+ myOtherField = i;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicatesVarargsShouldNotChangeReturnType.java b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicatesVarargsShouldNotChangeReturnType.java
new file mode 100644
index 000000000000..082875b217b9
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicatesVarargsShouldNotChangeReturnType.java
@@ -0,0 +1,12 @@
+class Test {
+ void foo() {
+ bar(String.valueOf(1));
+ baz(String.valueOf(1));
+ }
+
+ private void bar(String s) {
+ }
+
+ private void baz(String... s) {
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicatesVarargsShouldNotChangeReturnType_after.java b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicatesVarargsShouldNotChangeReturnType_after.java
new file mode 100644
index 000000000000..cabf2a5a0c1d
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicatesVarargsShouldNotChangeReturnType_after.java
@@ -0,0 +1,19 @@
+import org.jetbrains.annotations.NotNull;
+
+class Test {
+ void foo() {
+ bar(newMethod());
+ baz(newMethod());
+ }
+
+ @NotNull
+ private String newMethod() {
+ return String.valueOf(1);
+ }
+
+ private void bar(String s) {
+ }
+
+ private void baz(String... s) {
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicatesWithComments.java b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicatesWithComments.java
new file mode 100644
index 000000000000..187ead9cf607
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodNew/CodeDuplicatesWithComments.java
@@ -0,0 +1,19 @@
+class Test {
+ private List