Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read this important communication.
Bug 416264 - [1.8][extract local] Unable to extract lambda expression to local variable
Summary: [1.8][extract local] Unable to extract lambda expression to local variable
Status: RESOLVED WORKSFORME
Alias: None
Product: JDT
Classification: Eclipse Project
Component: UI (show other bugs)
Version: 4.4   Edit
Hardware: All All
: P3 enhancement (vote)
Target Milestone: 4.4 M7   Edit
Assignee: JDT-UI-Inbox CLA
QA Contact:
URL:
Whiteboard:
Keywords:
Depends on:
Blocks: 405305
  Show dependency tree
 
Reported: 2013-08-30 12:22 EDT by Noopur Gupta CLA
Modified: 2014-04-25 02:28 EDT (History)
0 users

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Noopur Gupta CLA 2013-08-30 12:22:27 EDT
Consider the example below:

@FunctionalInterface
public interface I1 {
	int foo(int a);
}

class X {	
	void foo() {
		// expected local variable after extraction
                // (should be similar to):
		I1 temp= (int a) -> {return 10;};
		
		//--------------------------------------------------
		I1 i1= /*[*/(int a) -> {return 10;};/*]*/ 
		
		I1 i2= /*[*/(a) -> {return 10;}/*]*/ ; 
		
		I1 i3= /*[*/ /**/(a) -> {return 10;};/**/ /*]*/ 
		
		bar(/*[*/ a -> 10 /*]*/);
		//--------------------------------------------------
	}
	
	void bar(I1 i) {
	}
}

It is not possible to extract the lambda expr to a local variable using Alt+Shift+L. Shown cases give different error messages and the following exception:

Caused by: org.eclipse.core.runtime.AssertionFailedException: assertion failed: 
	at org.eclipse.core.runtime.Assert.isTrue(Assert.java:110)
	at org.eclipse.core.runtime.Assert.isTrue(Assert.java:96)
	at org.eclipse.jdt.internal.corext.dom.fragments.ASTFragmentFactory$FragmentFactory.setFragment(ASTFragmentFactory.java:194)
	at org.eclipse.jdt.internal.corext.dom.fragments.ASTFragmentFactory$FragmentForFullSubtreeFactory.visit(ASTFragmentFactory.java:138)
	at org.eclipse.jdt.internal.corext.dom.HierarchicalASTVisitor.visit(HierarchicalASTVisitor.java:760)
	at org.eclipse.jdt.internal.corext.dom.HierarchicalASTVisitor.visit(HierarchicalASTVisitor.java:780)
	at org.eclipse.jdt.core.dom.Block.accept0(Block.java:134)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2710)
	at org.eclipse.jdt.core.dom.ASTNode.acceptChild(ASTNode.java:2758)
	at org.eclipse.jdt.core.dom.LambdaExpression.accept0(LambdaExpression.java:215)
	at org.eclipse.jdt.core.dom.ASTNode.accept(ASTNode.java:2710)
	at org.eclipse.jdt.internal.corext.dom.fragments.ASTFragmentFactory$FragmentFactory.createFragment(ASTFragmentFactory.java:186)
	at org.eclipse.jdt.internal.corext.dom.fragments.ASTFragmentFactory$FragmentForFullSubtreeFactory.createFragmentFor(ASTFragmentFactory.java:115)
	at org.eclipse.jdt.internal.corext.dom.fragments.ASTFragmentFactory.createFragmentForFullSubtree(ASTFragmentFactory.java:56)
	at org.eclipse.jdt.internal.corext.dom.fragments.ASTFragmentFactory.createFragmentForSourceRange(ASTFragmentFactory.java:82)
	at org.eclipse.jdt.internal.corext.refactoring.code.ExtractTempRefactoring.getSelectedExpression(ExtractTempRefactoring.java:850)
	at org.eclipse.jdt.internal.corext.refactoring.code.ExtractTempRefactoring.checkSelection(ExtractTempRefactoring.java:611)
	at org.eclipse.jdt.internal.corext.refactoring.code.ExtractTempRefactoring.checkInitialConditions(ExtractTempRefactoring.java:584)
...
Comment 1 Noopur Gupta CLA 2014-04-25 02:28:19 EDT
Verified that lambda expressions can be extracted to local variables now and we do not get any exception. Hence, closing this.