LambdaGenerationUtil: disable if expression is accessed for writing

Fixes IDEA-165482 Optional.isPresent suggests to replace the code which assigns the variable defined outside
This commit is contained in:
Tagir Valeev
2016-12-15 11:51:58 +07:00
parent d8329c5638
commit 3741495801
2 changed files with 22 additions and 5 deletions

View File

@@ -19,6 +19,7 @@ import com.intellij.codeInsight.ExceptionUtil;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightControlFlowUtil;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -104,15 +105,18 @@ public class LambdaGenerationUtil {
if(!myCanBeLambdaBody) return;
super.visitReferenceExpression(expression);
PsiElement element = expression.resolve();
if (element instanceof PsiVariable &&
!(element instanceof PsiField) &&
!myVariableAllowedPredicate.test((PsiVariable)element) &&
!PsiTreeUtil.isAncestor(myRoot, element, true) &&
!HighlightControlFlowUtil.isEffectivelyFinal((PsiVariable)element, myRoot, null)) {
if (element instanceof PsiVariable && !isAllowedInLambda(expression, (PsiVariable)element)) {
myCanBeLambdaBody = false;
}
}
private boolean isAllowedInLambda(PsiReferenceExpression expression, PsiVariable variable) {
return variable instanceof PsiField ||
myVariableAllowedPredicate.test(variable) ||
PsiTreeUtil.isAncestor(myRoot, variable, true) ||
!PsiUtil.isAccessedForWriting(expression) && HighlightControlFlowUtil.isEffectivelyFinal(variable, myRoot, null);
}
@Override
public void visitBreakStatement(PsiBreakStatement statement) {
PsiStatement exitedStatement = statement.findExitedStatement();

View File

@@ -0,0 +1,13 @@
// "Replace Optional.isPresent() condition with functional style expression" "false"
import java.util.Optional;
public class Main {
void assignVariable(Optional<Object> opt) {
String s;
if(opt.isPre<caret>sent()) {
s = opt.get().toString();
}
String s2 = s;
}
}