Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 245909 Details for
Bug 417801
[1.8][quick assist] Infer lambda parameters
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
[patch]
Patch
eclipse.jdt.ui.patch (text/plain), 16.54 KB, created by
Noopur Gupta
on 2014-08-12 07:42:49 EDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Noopur Gupta
Created:
2014-08-12 07:42:49 EDT
Size:
16.54 KB
patch
obsolete
>diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest18.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest18.java >index 6e0f547..eea04ca 100644 >--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest18.java >+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/AssistQuickFixTest18.java >@@ -1193,7 +1193,7 @@ > assertNoErrors(context); > List proposals= collectAssists(context, false); > >- assertNumberOfProposals(proposals, 2); >+ assertNumberOfProposals(proposals, 3); > assertCorrectLabels(proposals); > > buf= new StringBuffer(); >@@ -1242,7 +1242,7 @@ > assertNoErrors(context); > List proposals= collectAssists(context, false); > >- assertNumberOfProposals(proposals, 2); >+ assertNumberOfProposals(proposals, 3); > assertCorrectLabels(proposals); > > buf= new StringBuffer(); >@@ -1514,7 +1514,7 @@ > assertNoErrors(context); > List proposals= collectAssists(context, false); > >- assertNumberOfProposals(proposals, 2); >+ assertNumberOfProposals(proposals, 3); > assertCorrectLabels(proposals); > > buf= new StringBuffer(); >@@ -1554,7 +1554,7 @@ > assertNoErrors(context); > List proposals= collectAssists(context, false); > >- assertNumberOfProposals(proposals, 2); >+ assertNumberOfProposals(proposals, 3); > assertCorrectLabels(proposals); > > buf= new StringBuffer(); >@@ -1595,7 +1595,7 @@ > assertNoErrors(context); > List proposals= collectAssists(context, false); > >- assertNumberOfProposals(proposals, 2); >+ assertNumberOfProposals(proposals, 3); > assertCorrectLabels(proposals); > > buf= new StringBuffer(); >@@ -1635,7 +1635,7 @@ > assertNoErrors(context); > List proposals= collectAssists(context, false); > >- assertNumberOfProposals(proposals, 2); >+ assertNumberOfProposals(proposals, 3); > assertCorrectLabels(proposals); > > buf= new StringBuffer(); >@@ -1676,7 +1676,7 @@ > assertNoErrors(context); > List proposals= collectAssists(context, false); > >- assertNumberOfProposals(proposals, 2); >+ assertNumberOfProposals(proposals, 3); > assertCorrectLabels(proposals); > > buf= new StringBuffer(); >@@ -1718,7 +1718,7 @@ > assertNoErrors(context); > List proposals= collectAssists(context, false); > >- assertNumberOfProposals(proposals, 2); >+ assertNumberOfProposals(proposals, 3); > assertCorrectLabels(proposals); > > buf= new StringBuffer(); >@@ -1759,7 +1759,7 @@ > assertNoErrors(context); > List proposals= collectAssists(context, false); > >- assertNumberOfProposals(proposals, 2); >+ assertNumberOfProposals(proposals, 3); > assertCorrectLabels(proposals); > > buf= new StringBuffer(); >@@ -1808,7 +1808,7 @@ > buf.append("interface FI2 {\n"); > buf.append(" void foo(int x);\n"); > buf.append("}\n"); >- assertNumberOfProposals(proposals, 2); >+ assertNumberOfProposals(proposals, 3); > assertCorrectLabels(proposals); > > String expected1= buf.toString(); >@@ -1846,7 +1846,7 @@ > buf.append("interface FI2 {\n"); > buf.append(" void foo(int x);\n"); > buf.append("}\n"); >- assertNumberOfProposals(proposals, 2); >+ assertNumberOfProposals(proposals, 3); > assertCorrectLabels(proposals); > > String expected1= buf.toString(); >@@ -1872,7 +1872,7 @@ > AssistContext context= getCorrectionContext(cu, offset, 0); > assertNoErrors(context); > List proposals= collectAssists(context, false); >- assertNumberOfProposals(proposals, 1); >+ assertNumberOfProposals(proposals, 2); > assertCorrectLabels(proposals); > assertProposalDoesNotExist(proposals, CorrectionMessages.QuickAssistProcessor_change_lambda_body_to_expression); > } >@@ -1897,7 +1897,7 @@ > AssistContext context= getCorrectionContext(cu, offset, 0); > assertNoErrors(context); > List proposals= collectAssists(context, false); >- assertNumberOfProposals(proposals, 1); >+ assertNumberOfProposals(proposals, 2); > assertCorrectLabels(proposals); > assertProposalDoesNotExist(proposals, CorrectionMessages.QuickAssistProcessor_change_lambda_body_to_expression); > } >@@ -1922,7 +1922,7 @@ > AssistContext context= getCorrectionContext(cu, offset, 0); > assertNoErrors(context); > List proposals= collectAssists(context, false); >- assertNumberOfProposals(proposals, 1); >+ assertNumberOfProposals(proposals, 2); > assertCorrectLabels(proposals); > assertProposalDoesNotExist(proposals, CorrectionMessages.QuickAssistProcessor_change_lambda_body_to_expression); > } >@@ -1962,4 +1962,142 @@ > > assertExpectedExistInProposals(proposals, new String[] { expected1 }); > } >+ >+ public void testAddInferredLambdaParamTypes1() throws Exception { >+ IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null); >+ StringBuffer buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("public class E1 {\n"); >+ buf.append(" FI fi= (i, s) -> {};\n"); >+ buf.append("}\n"); >+ buf.append("interface FI {\n"); >+ buf.append(" void foo(Integer i, String[]... s);\n"); >+ buf.append("}\n"); >+ ICompilationUnit cu= pack1.createCompilationUnit("E1.java", buf.toString(), false, null); >+ >+ int offset= buf.toString().indexOf("->"); >+ AssistContext context= getCorrectionContext(cu, offset, 0); >+ assertNoErrors(context); >+ List proposals= collectAssists(context, false); >+ buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("public class E1 {\n"); >+ buf.append(" FI fi= (Integer i, String[][] s) -> {};\n"); // no varargs >+ buf.append("}\n"); >+ buf.append("interface FI {\n"); >+ buf.append(" void foo(Integer i, String[]... s);\n"); >+ buf.append("}\n"); >+ assertNumberOfProposals(proposals, 2); >+ assertCorrectLabels(proposals); >+ >+ String expected1= buf.toString(); >+ >+ assertExpectedExistInProposals(proposals, new String[] { expected1 }); >+ } >+ >+ public void testAddInferredLambdaParamTypes2() throws Exception { >+ IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null); >+ StringBuffer buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("import java.util.function.Function;\n"); >+ buf.append("public class E2<T> {\n"); >+ buf.append(" Function<T, Object> fi = t -> null;\n"); >+ buf.append("}\n"); >+ ICompilationUnit cu= pack1.createCompilationUnit("E2.java", buf.toString(), false, null); >+ >+ int offset= buf.toString().indexOf("->"); >+ AssistContext context= getCorrectionContext(cu, offset, 0); >+ assertNoErrors(context); >+ List proposals= collectAssists(context, false); >+ buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("import java.util.function.Function;\n"); >+ buf.append("public class E2<T> {\n"); >+ buf.append(" Function<T, Object> fi = (T t) -> null;\n"); >+ buf.append("}\n"); >+ assertNumberOfProposals(proposals, 3); >+ assertCorrectLabels(proposals); >+ >+ String expected1= buf.toString(); >+ >+ assertExpectedExistInProposals(proposals, new String[] { expected1 }); >+ } >+ >+ public void testAddInferredLambdaParamTypes3() throws Exception { >+ IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null); >+ StringBuffer buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("import java.util.function.IntFunction;\n"); >+ buf.append("import java.util.function.Supplier;\n"); >+ buf.append("public class E3 {\n"); >+ buf.append(" Supplier<String> s = () -> \"\";\n"); >+ buf.append(" IntFunction<Object> ifn= (int i) -> null; \n"); >+ buf.append("}\n"); >+ ICompilationUnit cu= pack1.createCompilationUnit("E3.java", buf.toString(), false, null); >+ >+ int offset= buf.toString().indexOf("->"); >+ AssistContext context= getCorrectionContext(cu, offset, 0); >+ assertNoErrors(context); >+ List proposals= collectAssists(context, false); >+ >+ assertNumberOfProposals(proposals, 3); >+ assertCorrectLabels(proposals); >+ assertProposalDoesNotExist(proposals, CorrectionMessages.QuickAssistProcessor_add_inferred_lambda_parameter_types); >+ >+ offset= buf.toString().indexOf("-> null"); >+ context= getCorrectionContext(cu, offset, 0); >+ assertNoErrors(context); >+ proposals= collectAssists(context, false); >+ >+ assertNumberOfProposals(proposals, 2); >+ assertCorrectLabels(proposals); >+ assertProposalDoesNotExist(proposals, CorrectionMessages.QuickAssistProcessor_add_inferred_lambda_parameter_types); >+ } >+ >+ public void testAddInferredLambdaParamTypes4() throws Exception { >+ IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null); >+ StringBuffer buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("import java.lang.annotation.ElementType;\n"); >+ buf.append("import java.lang.annotation.Target;\n"); >+ buf.append("public class E4 {\n"); >+ buf.append(" FI fi= (i, s) -> {};\n"); >+ buf.append("}\n"); >+ buf.append("interface FI {\n"); >+ buf.append(" void foo(@A Integer i, @A String @B [] s @C []);\n"); >+ buf.append("}\n"); >+ buf.append("@Target(ElementType.TYPE_USE)\n"); >+ buf.append("@interface A {}\n"); >+ buf.append("@Target(ElementType.TYPE_USE)\n"); >+ buf.append("@interface B {}\n"); >+ buf.append("@Target(ElementType.TYPE_USE)\n"); >+ buf.append("@interface C {}\n"); >+ ICompilationUnit cu= pack1.createCompilationUnit("E4.java", buf.toString(), false, null); >+ >+ int offset= buf.toString().indexOf("->"); >+ AssistContext context= getCorrectionContext(cu, offset, 0); >+ assertNoErrors(context); >+ List proposals= collectAssists(context, false); >+ buf= new StringBuffer(); >+ buf.append("package test1;\n"); >+ buf.append("import java.lang.annotation.ElementType;\n"); >+ buf.append("import java.lang.annotation.Target;\n"); >+ buf.append("public class E4 {\n"); >+ buf.append(" FI fi= (Integer i, String [] [] s) -> {};\n"); // No annotations, No extra dimensions >+ buf.append("}\n"); >+ buf.append("interface FI {\n"); >+ buf.append(" void foo(@A Integer i, @A String @B [] s @C []);\n"); >+ buf.append("}\n"); >+ buf.append("@Target(ElementType.TYPE_USE)\n"); >+ buf.append("@interface A {}\n"); >+ buf.append("@Target(ElementType.TYPE_USE)\n"); >+ buf.append("@interface B {}\n"); >+ buf.append("@Target(ElementType.TYPE_USE)\n"); >+ buf.append("@interface C {}\n"); >+ assertNumberOfProposals(proposals, 2); >+ assertCorrectLabels(proposals); >+ >+ /*String expected1= buf.toString(); // TODO: Uncomment after bug 432614 is fixed for no annotations >+ assertExpectedExistInProposals(proposals, new String[] { expected1 });*/ >+ } > } >diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.java >index 98fee99..1c10ed4 100644 >--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.java >+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.java >@@ -273,6 +273,7 @@ > public static String QuickAssistProcessor_unwrap_synchronizedstatement; > public static String QuickAssistProcessor_splitdeclaration_description; > public static String QuickAssistProcessor_joindeclaration_description; >+ public static String QuickAssistProcessor_add_inferred_lambda_parameter_types; > public static String QuickAssistProcessor_addfinallyblock_description; > public static String QuickAssistProcessor_addelseblock_description; > public static String QuickAssistProcessor_replacethenwithblock_description; >diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.properties b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.properties >index c7c8eef..219f421 100644 >--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.properties >+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.properties >@@ -330,6 +330,7 @@ > QuickAssistProcessor_extractmethod_description=Extract to method > QuickAssistProcessor_extract_to_constant_description=Extract to constant > QuickAssistProcessor_joindeclaration_description=Join variable declaration >+QuickAssistProcessor_add_inferred_lambda_parameter_types=Add inferred lambda parameter types > QuickAssistProcessor_addfinallyblock_description=Add finally block > QuickAssistProcessor_addelseblock_description=Add else block > >diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/IProposalRelevance.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/IProposalRelevance.java >index e9268da..d9f0fca 100644 >--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/IProposalRelevance.java >+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/IProposalRelevance.java >@@ -207,6 +207,7 @@ > public static final int CHANGE_TO_ATTRIBUTE= 3; > public static final int CHANGE_LAMBDA_BODY_TO_BLOCK= 3; > public static final int CHANGE_LAMBDA_BODY_TO_EXPRESSION= 3; >+ public static final int ADD_INFERRED_LAMBDA_PARAMETER_TYPES= 3; > > public static final int CONVERT_TO_INDEXED_FOR_LOOP= 2; > public static final int GENERATE_ENHANCED_FOR_LOOP= 2; >diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java >index 83c64a7..45e05d4 100644 >--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java >+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java >@@ -236,6 +236,7 @@ > || getConvertLambdaToAnonymousClassCreationsProposals(context, coveringNode, null) > || getChangeLambdaBodyToBlockProposal(context, coveringNode, null) > || getChangeLambdaBodyToExpressionProposal(context, coveringNode, null) >+ || getAddInferredLambdaParameterTypes(context, coveringNode, null) > || getRemoveBlockProposals(context, coveringNode, null) > || getMakeVariableDeclarationFinalProposals(context, null) > || getMissingCaseStatementProposals(context, coveringNode, null) >@@ -284,6 +285,7 @@ > getConvertLambdaToAnonymousClassCreationsProposals(context, coveringNode, resultingCollections); > getChangeLambdaBodyToBlockProposal(context, coveringNode, resultingCollections); > getChangeLambdaBodyToExpressionProposal(context, coveringNode, resultingCollections); >+ getAddInferredLambdaParameterTypes(context, coveringNode, resultingCollections); > if (!getConvertForLoopProposal(context, coveringNode, resultingCollections)) > getConvertIterableLoopProposal(context, coveringNode, resultingCollections); > getConvertEnhancedForLoopProposal(context, coveringNode, resultingCollections); >@@ -705,6 +707,51 @@ > return isValidExpressionBody; > } > >+ public static boolean getAddInferredLambdaParameterTypes(IInvocationContext context, ASTNode covering, Collection<ICommandAccess> resultingCollections) { >+ if (!(covering instanceof LambdaExpression)) { >+ return false; >+ } >+ LambdaExpression lambda= (LambdaExpression) covering; >+ >+ List<VariableDeclaration> lambdaParameters= lambda.parameters(); >+ int noOfLambdaParams= lambdaParameters.size(); >+ if (noOfLambdaParams == 0) >+ return false; >+ >+ if (lambdaParameters.get(0) instanceof SingleVariableDeclaration) >+ return false; >+ >+ IMethodBinding methodBinding= lambda.resolveMethodBinding(); >+ if (methodBinding == null) >+ return false; >+ >+ if (resultingCollections == null) >+ return true; >+ >+ AST ast= lambda.getAST(); >+ ASTRewrite rewrite= ASTRewrite.create(ast); >+ ImportRewrite importRewrite= StubUtility.createImportRewrite(context.getASTRoot(), true); >+ >+ rewrite.set(lambda, LambdaExpression.PARENTHESES_PROPERTY, Boolean.valueOf(true), null); >+ >+ ITypeBinding[] parameterTypes= methodBinding.getParameterTypes(); >+ for (int i= 0; i < noOfLambdaParams; i++) { >+ VariableDeclaration param= lambdaParameters.get(i); >+ SingleVariableDeclaration newParam= ast.newSingleVariableDeclaration(); >+ newParam.setName(ast.newSimpleName(param.getName().getIdentifier())); >+ newParam.setType(importRewrite.addImport(parameterTypes[i], ast)); >+ rewrite.replace(param, newParam, null); >+ } >+ >+ // add proposal >+ String label= CorrectionMessages.QuickAssistProcessor_add_inferred_lambda_parameter_types; >+ Image image= JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE); >+ ASTRewriteCorrectionProposal proposal= new ASTRewriteCorrectionProposal(label, context.getCompilationUnit(), rewrite, IProposalRelevance.ADD_INFERRED_LAMBDA_PARAMETER_TYPES, image); >+ proposal.setImportRewrite(importRewrite); >+ resultingCollections.add(proposal); >+ return true; >+ } >+ > public static boolean getInferDiamondArgumentsProposal(IInvocationContext context, ASTNode node, IProblemLocation[] locations, Collection<ICommandAccess> resultingCollections) { > // don't add if already added as quick fix > if (containsMatchingProblem(locations, IProblem.DiamondNotBelow17))
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 417801
: 245909