lambda -> anonymous: qualify this

This commit is contained in:
Anna Kozlova
2012-08-30 20:14:34 +04:00
parent 76fe4475b1
commit 626122ba82
4 changed files with 31 additions and 1 deletions
@@ -15,6 +15,7 @@
*/
package com.siyeh.ipp.types;
import com.intellij.codeInsight.ChangeContextUtil;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightControlFlowUtil;
import com.intellij.codeInsight.generation.GenerateMembersUtil;
import com.intellij.codeInsight.generation.OverrideImplementUtil;
@@ -25,6 +26,7 @@ import com.intellij.psi.*;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.refactoring.util.RefactoringUtil;
import com.intellij.util.IncorrectOperationException;
import com.siyeh.ipp.base.Intention;
import com.siyeh.ipp.base.PsiElementPredicate;
@@ -62,7 +64,12 @@ public class ReplaceLambdaWithAnonymousIntention extends Intention {
if (blockText == null) return;
final PsiElementFactory psiElementFactory = JavaPsiFacade.getElementFactory(element.getProject());
PsiCodeBlock blockFromText = psiElementFactory.createCodeBlockFromText(blockText, lambdaExpression);
ChangeContextUtil.encodeContextInfo(blockFromText, true);
PsiNewExpression newExpression = (PsiNewExpression)psiElementFactory.createExpressionFromText("new " + functionalInterfaceType.getCanonicalText() + "(){}", lambdaExpression);
PsiClass thisClass = PsiTreeUtil.getParentOfType(lambdaExpression, PsiClass.class, true);
ChangeContextUtil.decodeContextInfo(blockFromText, thisClass, RefactoringUtil.createThisExpression(lambdaExpression.getManager(), thisClass));
blockFromText = psiElementFactory.createCodeBlockFromText(blockFromText.getText(), null);
newExpression = (PsiNewExpression)lambdaExpression.replace(newExpression);
final PsiAnonymousClass anonymousClass = newExpression.getAnonymousClass();
@@ -80,7 +87,8 @@ public class ReplaceLambdaWithAnonymousIntention extends Intention {
}
PsiCodeBlock codeBlock = member.getBody();
LOG.assertTrue(codeBlock != null);
codeBlock = (PsiCodeBlock)codeBlock.replace(psiElementFactory.createCodeBlockFromText(blockText, null));
codeBlock = (PsiCodeBlock)codeBlock.replace(blockFromText);
final Set<PsiVariable> vars2BeFinal = new HashSet<PsiVariable>();
codeBlock.accept(new JavaRecursiveElementWalkingVisitor() {
@Override
@@ -99,6 +107,7 @@ public class ReplaceLambdaWithAnonymousIntention extends Intention {
for (PsiVariable var : vars2BeFinal) {
PsiUtil.setModifierProperty(var, PsiModifier.FINAL, true);
}
GenerateMembersUtil.positionCaret(editor, member, true);
}
}
@@ -0,0 +1,6 @@
class Test {
public void m() {
Runnable r = (<caret>) -> {System.out.println(this);};
r.run();
}
}
@@ -0,0 +1,11 @@
class Test {
public void m() {
Runnable r = new Runnable() {
@Override
public void run() {
<selection>System.out.println(Test.this);</selection>
}
};
r.run();
}
}
@@ -55,6 +55,10 @@ public class ReplaceLambdaWithAnonymousIntentionTest extends IPPTestCase {
doTest();
}
public void testQualifyThis() {
doTest();
}
@Override
protected String getIntentionName() {
return IntentionPowerPackBundle.message("replace.lambda.with.anonymous.intention.name");