Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSamrat Dhillon2013-10-17 03:30:19 +0000
committerManju Mathew2013-10-17 03:30:19 +0000
commitba5280deb3a074bf0d41687d395a2def630f9608 (patch)
tree63f7db581427fadb854a343a8e693af9bad06dc1
parent663e87e2e5920bb984560072ed5c7dc12401c8f6 (diff)
downloadeclipse.jdt.ui-ba5280deb3a074bf0d41687d395a2def630f9608.tar.gz
eclipse.jdt.ui-ba5280deb3a074bf0d41687d395a2def630f9608.tar.xz
eclipse.jdt.ui-ba5280deb3a074bf0d41687d395a2def630f9608.zip
Fixed Bug 394030: [extract method] Extracting expression of
parameterized type that is passed as argument to this constructor yields compilation error Signed-off-by: Samrat Dhillon <samrat.dhillon@gmail.com>
-rw-r--r--org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/generics_in/A_test1121.java11
-rw-r--r--org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/generics_in/A_test1122.java10
-rw-r--r--org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/generics_out/A_test1121.java15
-rw-r--r--org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/generics_out/A_test1122.java14
-rw-r--r--org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractMethodTests.java9
-rw-r--r--org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/ExtractMethodRefactoring.java29
6 files changed, 81 insertions, 7 deletions
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/generics_in/A_test1121.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/generics_in/A_test1121.java
new file mode 100644
index 0000000000..03a4bd9588
--- /dev/null
+++ b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/generics_in/A_test1121.java
@@ -0,0 +1,11 @@
+package generics_in;
+import java.util.Map;
+
+public class A_test1121<V> {
+ public A_test1121(Map<?, ? extends V> c) {
+ this(/*[*/c.size()/*]*/);
+ }
+
+ public A_test1121(int size) {
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/generics_in/A_test1122.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/generics_in/A_test1122.java
new file mode 100644
index 0000000000..3a259549bd
--- /dev/null
+++ b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/generics_in/A_test1122.java
@@ -0,0 +1,10 @@
+package generics_in;
+import java.util.ArrayList;
+import java.util.List;
+
+public class A_test1122{
+ public <E> void foo() {
+ List<? extends E> t = new ArrayList<E>();
+ /*[*/t.size();/*]*/
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/generics_out/A_test1121.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/generics_out/A_test1121.java
new file mode 100644
index 0000000000..be2f2614c4
--- /dev/null
+++ b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/generics_out/A_test1121.java
@@ -0,0 +1,15 @@
+package generics_out;
+import java.util.Map;
+
+public class A_test1121<V> {
+ public A_test1121(Map<?, ? extends V> c) {
+ this(extracted(c));
+ }
+
+ protected static <V> int extracted(Map<?, ? extends V> c) {
+ return /*[*/c.size()/*]*/;
+ }
+
+ public A_test1121(int size) {
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/generics_out/A_test1122.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/generics_out/A_test1122.java
new file mode 100644
index 0000000000..a582ad3818
--- /dev/null
+++ b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractMethodWorkSpace/ExtractMethodTests/generics_out/A_test1122.java
@@ -0,0 +1,14 @@
+package generics_out;
+import java.util.ArrayList;
+import java.util.List;
+
+public class A_test1122{
+ public <E> void foo() {
+ List<? extends E> t = new ArrayList<E>();
+ extracted(t);
+ }
+
+ protected <E> void extracted(List<? extends E> t) {
+ /*[*/t.size();/*]*/
+ }
+} \ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractMethodTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractMethodTests.java
index 082518263f..353153df59 100644
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractMethodTests.java
+++ b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractMethodTests.java
@@ -14,6 +14,7 @@
* Benjamin Muskalla <bmuskalla@eclipsesource.com> - [extract method] should declare method static if extracted from anonymous in static method - https://bugs.eclipse.org/bugs/show_bug.cgi?id=152004
* Benjamin Muskalla <bmuskalla@eclipsesource.com> - [extract method] extracting return value results in compile error - https://bugs.eclipse.org/bugs/show_bug.cgi?id=264606
* Samrat Dhillon <samrat.dhillon@gmail.com> - [extract method] Extracted method should be declared static if extracted expression is also used in another static method https://bugs.eclipse.org/bugs/show_bug.cgi?id=393098
+ * Samrat Dhillon <samrat.dhillon@gmail.com> - [extract method] Extracting expression of parameterized type that is passed as argument to this constructor yields compilation error https://bugs.eclipse.org/bugs/show_bug.cgi?id=394030
*******************************************************************************/
package org.eclipse.jdt.ui.tests.refactoring;
@@ -2072,6 +2073,14 @@ public class ExtractMethodTests extends AbstractSelectionTestCase {
public void test1120() throws Exception {
genericTest(); //https://bugs.eclipse.org/bugs/show_bug.cgi?id=369295
}
+
+ public void test1121() throws Exception {
+ genericTest();
+ }
+
+ public void test1122() throws Exception {
+ genericTest();
+ }
//---- Test enums ---------------------------------
diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/ExtractMethodRefactoring.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/ExtractMethodRefactoring.java
index 1ca75f609e..88d3675a4c 100644
--- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/ExtractMethodRefactoring.java
+++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/ExtractMethodRefactoring.java
@@ -11,6 +11,7 @@
* Benjamin Muskalla <bmuskalla@eclipsesource.com> - [extract method] Extract method and continue https://bugs.eclipse.org/bugs/show_bug.cgi?id=48056
* Benjamin Muskalla <bmuskalla@eclipsesource.com> - [extract method] should declare method static if extracted from anonymous in static method - https://bugs.eclipse.org/bugs/show_bug.cgi?id=152004
* Samrat Dhillon <samrat.dhillon@gmail.com> - [extract method] Extracted method should be declared static if extracted expression is also used in another static method https://bugs.eclipse.org/bugs/show_bug.cgi?id=393098
+ * Samrat Dhillon <samrat.dhillon@gmail.com> - [extract method] Extracting expression of parameterized type that is passed as argument to this constructor yields compilation error https://bugs.eclipse.org/bugs/show_bug.cgi?id=394030
*******************************************************************************/
package org.eclipse.jdt.internal.corext.refactoring.code;
@@ -1002,7 +1003,7 @@ public class ExtractMethodRefactoring extends Refactoring {
}
}
- ITypeBinding[] typeVariables= computeLocalTypeVariables();
+ ITypeBinding[] typeVariables= computeLocalTypeVariables(modifiers);
List<TypeParameter> typeParameters= result.typeParameters();
for (int i= 0; i < typeVariables.length; i++) {
TypeParameter parameter= fAST.newTypeParameter();
@@ -1041,20 +1042,20 @@ public class ExtractMethodRefactoring extends Refactoring {
return result;
}
- private ITypeBinding[] computeLocalTypeVariables() {
+ private ITypeBinding[] computeLocalTypeVariables(int modifier) {
List<ITypeBinding> result= new ArrayList<ITypeBinding>(Arrays.asList(fAnalyzer.getTypeVariables()));
for (int i= 0; i < fParameterInfos.size(); i++) {
ParameterInfo info= fParameterInfos.get(i);
- processVariable(result, info.getOldBinding());
+ processVariable(result, info.getOldBinding(), modifier);
}
IVariableBinding[] methodLocals= fAnalyzer.getMethodLocals();
for (int i= 0; i < methodLocals.length; i++) {
- processVariable(result, methodLocals[i]);
+ processVariable(result, methodLocals[i], modifier);
}
return result.toArray(new ITypeBinding[result.size()]);
}
- private void processVariable(List<ITypeBinding> result, IVariableBinding variable) {
+ private void processVariable(List<ITypeBinding> result, IVariableBinding variable, int modifier) {
if (variable == null)
return;
ITypeBinding binding= variable.getType();
@@ -1064,8 +1065,22 @@ public class ExtractMethodRefactoring extends Refactoring {
ITypeBinding arg= typeArgs[args];
if (arg.isTypeVariable() && !result.contains(arg)) {
ASTNode decl= fRoot.findDeclaringNode(arg);
- if (decl != null && decl.getParent() instanceof MethodDeclaration) {
- result.add(arg);
+ if (decl != null) {
+ ASTNode parent= decl.getParent();
+ if (parent instanceof MethodDeclaration || (parent instanceof TypeDeclaration && Modifier.isStatic(modifier))) {
+ result.add(arg);
+ }
+ }
+ } else {
+ ITypeBinding bound= arg.getBound();
+ if (arg.isWildcardType() && bound != null && !result.contains(bound)) {
+ ASTNode decl= fRoot.findDeclaringNode(bound);
+ if (decl != null) {
+ ASTNode parent= decl.getParent();
+ if (parent instanceof MethodDeclaration || (parent instanceof TypeDeclaration && Modifier.isStatic(modifier))) {
+ result.add(bound);
+ }
+ }
}
}
}

Back to the top