From ba1cd24643c46cf9fe003fd5c890a2e13916d349 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 25 Nov 2010 21:12:03 +0300 Subject: [PATCH] replace constructor with builder: do not suggest to default chain constructor params --- .../ParameterData.java | 6 +++++- .../after/Builder.java | 18 ++++++++++++++++++ .../after/Test.java | 11 +++++++++++ .../before/Test.java | 11 +++++++++++ .../ReplaceConstructorWithBuilderTest.java | 7 +++++++ 5 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 java/java-tests/testData/refactoring/replaceConstructorWithBuilder/constructorChainWithoutDefaults/after/Builder.java create mode 100644 java/java-tests/testData/refactoring/replaceConstructorWithBuilder/constructorChainWithoutDefaults/after/Test.java create mode 100644 java/java-tests/testData/refactoring/replaceConstructorWithBuilder/constructorChainWithoutDefaults/before/Test.java diff --git a/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/ParameterData.java b/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/ParameterData.java index 5279cd3a3b25..66dc0e301bc1 100644 --- a/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/ParameterData.java +++ b/java/java-impl/src/com/intellij/refactoring/replaceConstructorWithBuilder/ParameterData.java @@ -61,8 +61,12 @@ public class ParameterData { int i = 0; for (final PsiParameter parameter : chainedConstructor.getParameterList().getParameters()) { if (!parameter.isVarArgs()) { + final PsiExpression arg = args[i]; final ParameterData parameterData = initParameterData(parameter, result); - parameterData.setDefaultValue(args[i++].getText()); + if (!(arg instanceof PsiReferenceExpression && ((PsiReferenceExpression)arg).resolve() instanceof PsiParameter)) { + parameterData.setDefaultValue(arg.getText()); + } + i++; } } } diff --git a/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/constructorChainWithoutDefaults/after/Builder.java b/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/constructorChainWithoutDefaults/after/Builder.java new file mode 100644 index 000000000000..347dfc9b0a92 --- /dev/null +++ b/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/constructorChainWithoutDefaults/after/Builder.java @@ -0,0 +1,18 @@ +public class Builder { + private int i = 2; + private int j; + + public Builder setI(int i) { + this.i = i; + return this; + } + + public Builder setJ(int j) { + this.j = j; + return this; + } + + public Test createTest() { + return new Test(i, j); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/constructorChainWithoutDefaults/after/Test.java b/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/constructorChainWithoutDefaults/after/Test.java new file mode 100644 index 000000000000..07c16795afb9 --- /dev/null +++ b/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/constructorChainWithoutDefaults/after/Test.java @@ -0,0 +1,11 @@ +public class Test { + public Test(int i, int j){} + public Test(int j){ + this(2, j); + } + void foo(){} + public static void main(String[] args){ + new Builder().setJ(1).createTest().foo(); + new Builder().setI(2).setJ(3).createTest().foo(); + } +} \ No newline at end of file diff --git a/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/constructorChainWithoutDefaults/before/Test.java b/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/constructorChainWithoutDefaults/before/Test.java new file mode 100644 index 000000000000..5d62250352f6 --- /dev/null +++ b/java/java-tests/testData/refactoring/replaceConstructorWithBuilder/constructorChainWithoutDefaults/before/Test.java @@ -0,0 +1,11 @@ +public class Test { + public Test(int i, int j){} + public Test(int j){ + this(2, j); + } + void foo(){} + public static void main(String[] args){ + new Test(1).foo(); + new Test(2, 3).foo(); + } +} \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ReplaceConstructorWithBuilderTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ReplaceConstructorWithBuilderTest.java index ba3e1e468c96..5af77957eec3 100644 --- a/java/java-tests/testSrc/com/intellij/refactoring/ReplaceConstructorWithBuilderTest.java +++ b/java/java-tests/testSrc/com/intellij/refactoring/ReplaceConstructorWithBuilderTest.java @@ -50,6 +50,13 @@ public class ReplaceConstructorWithBuilderTest extends MultiFileTestCase { doTest(true, defaults); } + public void testConstructorChainWithoutDefaults() throws Exception { + final HashMap defaults = new HashMap(); + defaults.put("i", "2"); + defaults.put("j", null); + doTest(true, defaults); + } + public void testConstructorTree() throws Exception { doTest(true, null, "Found constructors are not reducible to simple chain"); }