mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-05-06 05:10:22 +07:00
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:
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user