diff options
author | Noopur Gupta | 2014-02-19 12:41:13 +0000 |
---|---|---|
committer | Noopur Gupta | 2014-02-19 12:41:13 +0000 |
commit | 7ac9de0f154fb3553d36df6bc22079e0d68fdc85 (patch) | |
tree | ef0cfd0a66fde72fc817ecba972a82c7f6e8f27b | |
parent | 1e7fd470ba063434dde6553e25aca4031e42912b (diff) | |
download | eclipse.jdt.ui-7ac9de0f154fb3553d36df6bc22079e0d68fdc85.tar.gz eclipse.jdt.ui-7ac9de0f154fb3553d36df6bc22079e0d68fdc85.tar.xz eclipse.jdt.ui-7ac9de0f154fb3553d36df6bc22079e0d68fdc85.zip |
Fixed bug 425412: [1.8][quick assist] Conversion from anonymous class to
lambda loses parameterized type details - used IBinding#isEqualTo and
updated tests with additional casts
3 files changed, 35 insertions, 6 deletions
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest18.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest18.java index 32b0edf93b..3279ee9311 100644 --- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest18.java +++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest18.java @@ -186,7 +186,20 @@ public class CleanUpTest18 extends CleanUpTestCase { disable(CleanUpConstants.USE_ANONYMOUS_CLASS_CREATION); enable(CleanUpConstants.USE_LAMBDA); - assertRefactoringResultAsExpected(new ICompilationUnit[] { cu1 }, new String[] { original }); + buf= new StringBuffer(); + buf.append("package test;\n"); + buf.append("import java.util.*;\n"); + buf.append("public class E {\n"); + buf.append(" void foo(Integer[] ints){\n"); + buf.append(" Arrays.sort(ints, (Comparator<Integer>) (i1, i2) -> i1 - i2);\n"); + buf.append(" Comparator<?> cw = (Comparator<Object>) (w1, w2) -> 0;\n"); + buf.append(" Comparator cr = (r1, r2) -> 0;\n"); + buf.append(" Comparator<? extends Number> ce = (Comparator<Number>) (n1, n2) -> -0;\n"); + buf.append(" };\n"); + buf.append("}\n"); + String expected2= buf.toString(); + + assertRefactoringResultAsExpected(new ICompilationUnit[] { cu1 }, new String[] { expected2 }); } public void testConvertToAnonymous_andBack_WithWildcards1() throws Exception { @@ -230,7 +243,19 @@ public class CleanUpTest18 extends CleanUpTestCase { disable(CleanUpConstants.USE_ANONYMOUS_CLASS_CREATION); enable(CleanUpConstants.USE_LAMBDA); - assertRefactoringResultAsExpected(new ICompilationUnit[] { cu1 }, new String[] { original }); + buf= new StringBuffer(); + buf.append("package test;\n"); + buf.append("\n"); + buf.append("interface I<M> {\n"); + buf.append(" M run(M x);\n"); + buf.append("}\n"); + buf.append("\n"); + buf.append("class Test {\n"); + buf.append(" I<?> li = (I<Object>) s -> null;\n"); + buf.append("}\n"); + String expected2= buf.toString(); + + assertRefactoringResultAsExpected(new ICompilationUnit[] { cu1 }, new String[] { expected2 }); } public void testConvertToLambdaNestedWithImports() throws Exception { @@ -261,10 +286,11 @@ public class CleanUpTest18 extends CleanUpTestCase { buf= new StringBuffer(); buf.append("package test;\n"); + buf.append("import java.util.concurrent.Callable;\n"); buf.append("import java.util.concurrent.Executors;\n"); buf.append("public class E {\n"); buf.append(" void foo() {\n"); - buf.append(" new Thread(() -> Executors.newSingleThreadExecutor().submit(() -> \"hi\"));\n"); + buf.append(" new Thread(() -> Executors.newSingleThreadExecutor().submit((Callable<String>) () -> \"hi\"));\n"); buf.append(" }\n"); buf.append("}\n"); String expected1= buf.toString(); diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTNodes.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTNodes.java index 97ad0a14eb..93757741ff 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTNodes.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/dom/ASTNodes.java @@ -585,7 +585,7 @@ public class ASTNodes { return referenceType; } else { ITypeBinding targetType= getTargetType(reference); - if (targetType != null && targetType != referenceType) { + if (!referenceType.isEqualTo(targetType)) { return referenceType; } } diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/LambdaExpressionsFix.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/LambdaExpressionsFix.java index 55bcd7e4ff..890d193cc3 100644 --- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/LambdaExpressionsFix.java +++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/fix/LambdaExpressionsFix.java @@ -250,12 +250,15 @@ public class LambdaExpressionsFix extends CompilationUnitRewriteOperationsFix { lambdaExpression.setBody(rewrite.createCopyTarget(lambdaBody)); Expression replacement= lambdaExpression; ITypeBinding cicTypeBinding= classInstanceCreation.getType().resolveBinding(); - if (ASTNodes.isTargetAmbiguous(classInstanceCreation) || cicTypeBinding != ASTNodes.getTargetType(classInstanceCreation)) { + ITypeBinding targetTypeBinding= ASTNodes.getTargetType(classInstanceCreation); + if (cicTypeBinding != null && (ASTNodes.isTargetAmbiguous(classInstanceCreation) || !cicTypeBinding.isEqualTo(targetTypeBinding))) { CastExpression cast= ast.newCastExpression(); cast.setExpression(lambdaExpression); ImportRewrite importRewrite= cuRewrite.getImportRewrite(); ImportRewriteContext importRewriteContext= new ContextSensitiveImportRewriteContext(classInstanceCreation, importRewrite); - cast.setType(importRewrite.addImport(cicTypeBinding, ast, importRewriteContext)); + Type castType= importRewrite.addImport(cicTypeBinding, ast, importRewriteContext); + importRemover.registerAddedImports(castType); + cast.setType(castType); replacement= cast; } rewrite.replace(classInstanceCreation, replacement, group); |