introduce functional variable: encode this (IDEA-174203)

This commit is contained in:
Anna Kozlova
2017-06-09 15:52:28 +03:00
parent 404fe68c03
commit d0fab7fd0b
4 changed files with 31 additions and 3 deletions

View File

@@ -15,6 +15,7 @@
*/
package com.intellij.refactoring.introduceVariable;
import com.intellij.codeInsight.ChangeContextUtil;
import com.intellij.codeInsight.FunctionalInterfaceSuggester;
import com.intellij.codeInsight.navigation.NavigationUtil;
import com.intellij.codeInspection.AnonymousCanBeLambdaInspection;
@@ -38,6 +39,7 @@ import com.intellij.refactoring.actions.IntroduceFunctionalVariableAction;
import com.intellij.refactoring.extractMethod.*;
import com.intellij.refactoring.introduceParameter.IntroduceParameterHandler;
import com.intellij.refactoring.util.CommonRefactoringUtil;
import com.intellij.refactoring.util.RefactoringChangeUtil;
import com.intellij.refactoring.util.RefactoringUtil;
import com.intellij.refactoring.util.VariableData;
import com.intellij.util.containers.ContainerUtil;
@@ -170,11 +172,18 @@ public class IntroduceFunctionalVariableHandler extends IntroduceVariableHandler
}
final PsiMethodCallExpression methodCall = processor.getMethodCall();
PsiMethodCallExpression psiExpression = (PsiMethodCallExpression)factory
.createExpressionFromText("new " + selectedType.getCanonicalText() + "() {" + extractedMethod.getText() + "}." + methodCall.getText(),
.createExpressionFromText("new " + selectedType.getCanonicalText() + "() {" + "}." + methodCall.getText(),
methodCall);
PsiExpression qualifierExpression = psiExpression.getMethodExpression().getQualifierExpression();
assert qualifierExpression != null;
if (AnonymousCanBeLambdaInspection.canBeConvertedToLambda(((PsiNewExpression)qualifierExpression).getAnonymousClass(), false, Collections.emptySet())) {
PsiAnonymousClass anonymousClass = ((PsiNewExpression)qualifierExpression).getAnonymousClass();
assert anonymousClass != null;
ChangeContextUtil.encodeContextInfo(extractedMethod, true);
PsiClass aClass = extractedMethod.getContainingClass();
ChangeContextUtil.decodeContextInfo(anonymousClass.add(extractedMethod), aClass,
RefactoringChangeUtil.createThisExpression(anonymousClass.getManager(), aClass));
if (AnonymousCanBeLambdaInspection.canBeConvertedToLambda(anonymousClass, false, Collections.emptySet())) {
PsiExpression castExpression = JavaPsiFacade.getElementFactory(project)
.createExpressionFromText("((" +
selectedType.getCanonicalText() + ")" +
@@ -183,7 +192,7 @@ public class IntroduceFunctionalVariableHandler extends IntroduceVariableHandler
qualifierExpression.replace(castExpression);
}
processor.getExtractedMethod().delete();
extractedMethod.delete();
return (PsiMethodCallExpression)JavaCodeStyleManager.getInstance(project).shortenClassReferences(methodCall.replace(psiExpression));
}

View File

@@ -0,0 +1,9 @@
import java.util.function.Function;
class Test {
String string;
void useThis() {
Function<String, String> stringStringFunction = string -> string;
System.out.println(stringStringFunction.apply(string));
}
}

View File

@@ -0,0 +1,6 @@
class Test {
String string;
void useThis() {
System.out.println(<selection>this.string</selection>);
}
}

View File

@@ -67,6 +67,10 @@ public class IntroduceFunctionalVariableTest extends LightRefactoringTestCase {
doTest();
}
public void testChangeContextBeforePuttingIntoAnonymous() throws Exception {
doTest();
}
public void testIgnoreMethodObjectSuggestion() throws Exception {
try {
doTest();