### Eclipse Workspace Patch 1.0 #P org.eclipse.jdt.ui.tests diff --git ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest18.java ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest18.java index 58fd6f4..73731c5 100644 --- ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest18.java +++ ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest18.java @@ -672,6 +672,56 @@ assertProposalDoesNotExist(proposals, FixMessages.LambdaExpressionsFix_convert_to_lambda_expression); } + public void testConvertToLambda14() throws Exception { + IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null); + StringBuffer buf= new StringBuffer(); + buf.append("package test1;\n"); + buf.append("import java.util.List;\n"); + buf.append("\n"); + buf.append("interface I {\n"); + buf.append(" void goo(List i);\n"); + buf.append("}\n"); + buf.append("\n"); + buf.append("public class X {\n"); + buf.append(" public static void main(String[] args) {\n"); + buf.append(" I i = new I() {\n"); + buf.append(" @Override\n"); + buf.append(" public void goo(List ls) {\n"); + buf.append(" String s = ls.get(0);\n"); + buf.append(" }\n"); + buf.append(" };\n"); + buf.append(" }\n"); + buf.append("}\n"); + ICompilationUnit cu= pack1.createCompilationUnit("X.java", buf.toString(), false, null); + + int offset= buf.toString().indexOf("I()"); + AssistContext context= getCorrectionContext(cu, offset, 0); + assertNoErrors(context); + List proposals= collectAssists(context, false); + + assertNumberOfProposals(proposals, 2); + assertCorrectLabels(proposals); + + buf= new StringBuffer(); + buf.append("package test1;\n"); + buf.append("import java.util.List;\n"); + buf.append("\n"); + buf.append("interface I {\n"); + buf.append(" void goo(List i);\n"); + buf.append("}\n"); + buf.append("\n"); + buf.append("public class X {\n"); + buf.append(" public static void main(String[] args) {\n"); + buf.append(" I i = (I) ls -> {\n"); + buf.append(" String s = ls.get(0);\n"); + buf.append(" };\n"); + buf.append(" }\n"); + buf.append("}\n"); + String expected1= buf.toString(); + + assertExpectedExistInProposals(proposals, new String[] { expected1 }); + } + public void testConvertToLambdaAmbiguousOverridden() throws Exception { IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null); StringBuffer buf= new StringBuffer(); diff --git ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest18.java ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest18.java index a4a8e96..7df1901 100644 --- ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest18.java +++ ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest18.java @@ -182,7 +182,20 @@ 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) (i1, i2) -> i1 - i2);\n"); + buf.append(" Comparator cw = (Comparator) (w1, w2) -> 0;\n"); + buf.append(" Comparator cr = (r1, r2) -> 0;\n"); + buf.append(" Comparator ce = (Comparator) (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 { @@ -226,7 +239,19 @@ 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 {\n"); + buf.append(" M run(M x);\n"); + buf.append("}\n"); + buf.append("\n"); + buf.append("class Test {\n"); + buf.append(" I li = (I) s -> null;\n"); + buf.append("}\n"); + String expected2= buf.toString(); + + assertRefactoringResultAsExpected(new ICompilationUnit[] { cu1 }, new String[] { expected2 }); } public void testConvertToAnonymous_andBack_WithJoinedSAM() throws Exception { @@ -302,10 +327,11 @@ 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) () -> \"hi\"));\n"); buf.append(" }\n"); buf.append("}\n"); String expected1= buf.toString(); #P org.eclipse.jdt.ui diff --git core extension/org/eclipse/jdt/internal/corext/dom/ASTNodes.java core extension/org/eclipse/jdt/internal/corext/dom/ASTNodes.java index e86e33e..203978f 100644 --- core extension/org/eclipse/jdt/internal/corext/dom/ASTNodes.java +++ core extension/org/eclipse/jdt/internal/corext/dom/ASTNodes.java @@ -581,6 +581,9 @@ public static ITypeBinding getExplicitCast(Expression initializer, Expression reference) { ITypeBinding initializerType= initializer.resolveTypeBinding(); ITypeBinding referenceType= reference.resolveTypeBinding(); + if (reference instanceof ClassInstanceCreation) { + referenceType= ((ClassInstanceCreation) reference).getType().resolveBinding(); + } if (initializerType == null || referenceType == null) return null; @@ -607,7 +610,7 @@ return referenceType; } else { ITypeBinding targetType= getTargetType(reference); - if (targetType == null || targetType != referenceType) { + if (!referenceType.isEqualTo(targetType)) { // includes targetType == null return referenceType; } } diff --git core extension/org/eclipse/jdt/internal/corext/fix/LambdaExpressionsFix.java core extension/org/eclipse/jdt/internal/corext/fix/LambdaExpressionsFix.java index bacd49a..ca7131d 100644 --- core extension/org/eclipse/jdt/internal/corext/fix/LambdaExpressionsFix.java +++ core extension/org/eclipse/jdt/internal/corext/fix/LambdaExpressionsFix.java @@ -240,12 +240,14 @@ lambdaExpression.setBody(rewrite.createCopyTarget(lambdaBody)); Expression replacement= lambdaExpression; - if (ASTNodes.isTargetAmbiguous(classInstanceCreation)) { + ITypeBinding cicTypeBinding= classInstanceCreation.getType().resolveBinding(); + 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); - Type castType= importRewrite.addImport(classInstanceCreation.getType().resolveBinding(), ast, importRewriteContext); + Type castType= importRewrite.addImport(cicTypeBinding, ast, importRewriteContext); cast.setType(castType); importRemover.registerAddedImports(castType); replacement= cast;