last resource delete from try-with-resources(IDEA-145803)

ensure that psi remain correct, automatically resolve conflict with variables declared after the try-with-resources stmt
This commit is contained in:
Anna Kozlova
2018-02-01 13:40:05 +03:00
parent d4f64ce91a
commit d138577fe1
28 changed files with 162 additions and 131 deletions
@@ -15,6 +15,7 @@
*/
package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.BlockUtils;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.daemon.QuickFixBundle;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightMessageUtil;
@@ -32,7 +33,6 @@ import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.util.*;
import com.intellij.util.IncorrectOperationException;
import com.siyeh.ig.psiutils.BlockUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -15,6 +15,7 @@
*/
package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.BlockUtils;
import com.intellij.codeInsight.daemon.QuickFixBundle;
import com.intellij.codeInsight.intention.LowPriorityAction;
import com.intellij.codeInspection.LocalQuickFixAndIntentionActionOnPsiElement;
@@ -23,7 +24,6 @@ import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.siyeh.ig.psiutils.BlockUtils;
import com.siyeh.ig.psiutils.SideEffectChecker;
import com.siyeh.ig.psiutils.StatementExtractor;
import org.jetbrains.annotations.Nls;
@@ -2,6 +2,7 @@
package com.intellij.codeInsight.daemon.impl.quickfix;
import com.intellij.codeInsight.BlockUtils;
import com.intellij.codeInsight.daemon.QuickFixBundle;
import com.intellij.codeInsight.daemon.impl.analysis.HighlightControlFlowUtil;
import com.intellij.codeInspection.LocalQuickFixOnPsiElement;
@@ -219,7 +220,7 @@ public class SimplifyBooleanExpressionFix extends LocalQuickFixOnPsiElement {
if (parent instanceof PsiCodeBlock) {
if (statement instanceof PsiBlockStatement &&
!DeclarationSearchUtils.containsConflictingDeclarations(((PsiBlockStatement)statement).getCodeBlock(), (PsiCodeBlock)parent)) {
!BlockUtils.containsConflictingDeclarations(((PsiBlockStatement)statement).getCodeBlock(), (PsiCodeBlock)parent)) {
inlineBlockStatements(orig, (PsiBlockStatement)statement, parent);
return;
}
@@ -15,6 +15,7 @@
*/
package com.intellij.codeInspection;
import com.intellij.codeInsight.BlockUtils;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInspection.reference.RefElement;
import com.intellij.codeInspection.reference.RefMethod;
@@ -31,7 +32,6 @@ import com.intellij.refactoring.changeSignature.ParameterInfoImpl;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.SmartList;
import com.siyeh.ig.controlflow.UnnecessaryReturnInspection;
import com.siyeh.ig.psiutils.BlockUtils;
import com.siyeh.ig.psiutils.SideEffectChecker;
import com.siyeh.ig.psiutils.StatementExtractor;
import org.jetbrains.annotations.NotNull;
@@ -1,6 +1,7 @@
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.codeInspection;
import com.intellij.codeInsight.BlockUtils;
import com.intellij.codeInspection.dataFlow.ControlFlowAnalyzer;
import com.intellij.codeInspection.dataFlow.MethodContract;
import com.intellij.codeInspection.dataFlow.StandardMethodContract;
@@ -10,7 +11,10 @@ import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.ObjectUtils;
import com.siyeh.ig.callMatcher.CallMatcher;
import com.siyeh.ig.psiutils.*;
import com.siyeh.ig.psiutils.CommentTracker;
import com.siyeh.ig.psiutils.ExpressionUtils;
import com.siyeh.ig.psiutils.SideEffectChecker;
import com.siyeh.ig.psiutils.StatementExtractor;
import one.util.streamex.StreamEx;
import org.jetbrains.annotations.Nls;
import org.jetbrains.annotations.NotNull;
@@ -15,6 +15,7 @@
*/
package com.intellij.codeInspection;
import com.intellij.codeInsight.BlockUtils;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.codeInsight.daemon.impl.quickfix.RemoveUnusedVariableFix;
import com.intellij.codeInsight.daemon.impl.quickfix.RemoveUnusedVariableUtil;
@@ -25,7 +26,6 @@ import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiExpressionTrimRenderer;
import com.intellij.psi.util.PsiUtil;
import com.siyeh.ig.psiutils.BlockUtils;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
@@ -1,16 +1,15 @@
/*
* Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
*/
package com.siyeh.ig.psiutils;
// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.codeInsight;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.SmartList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author Tagir Valeev
*/
import java.util.List;
public class BlockUtils {
/**
@@ -110,4 +109,92 @@ public class BlockUtils {
}
throw new AssertionError("can't get body from " + element);
}
public static void unwrapTryBlock(PsiTryStatement tryStatement) {
PsiCodeBlock tryBlock = tryStatement.getTryBlock();
if (tryBlock == null) {
return;
}
final PsiElement parent = tryStatement.getParent();
boolean singleStatement = false;
if (parent instanceof PsiStatement) {
final PsiStatement[] statements = tryBlock.getStatements();
if (statements.length == 1 && !(statements[0] instanceof PsiDeclarationStatement)) {
singleStatement = true;
}
else {
tryStatement = expandSingleStatementToBlockStatement(tryStatement);
}
}
else if (parent instanceof PsiCodeBlock) {
if (containsConflictingDeclarations(tryBlock, (PsiCodeBlock)parent)) {
tryStatement = expandSingleStatementToBlockStatement(tryStatement);
}
}
else {
return;
}
tryBlock = tryStatement.getTryBlock();
assert tryBlock != null;
final PsiElement first = singleStatement ? skip(tryBlock.getFirstBodyElement(), true) : tryBlock.getFirstBodyElement();
final PsiElement last = singleStatement? skip(tryBlock.getLastBodyElement(), false) : tryBlock.getLastBodyElement();
assert first != null && last != null;
tryStatement.getParent().addRangeBefore(first, last, tryStatement);
tryStatement.delete();
}
private static PsiElement skip(PsiElement element, boolean forward) {
if (!(element instanceof PsiWhiteSpace)) {
return element;
}
return forward ? element.getNextSibling() : element.getPrevSibling();
}
public static boolean containsConflictingDeclarations(PsiCodeBlock block, PsiCodeBlock parentBlock) {
final PsiStatement[] statements = block.getStatements();
if (statements.length == 0) {
return false;
}
final int endOffset = block.getTextRange().getEndOffset();
final List<PsiCodeBlock> affectedBlocks =
SyntaxTraverser.psiTraverser(parentBlock)
.filter(PsiCodeBlock.class)
.filter(cb -> cb.getTextRange().getEndOffset() > endOffset)
.addAllTo(new SmartList<>());
final Project project = block.getProject();
final JavaPsiFacade facade = JavaPsiFacade.getInstance(project);
final PsiResolveHelper resolveHelper = facade.getResolveHelper();
for (final PsiStatement statement : statements) {
if (!(statement instanceof PsiDeclarationStatement)) {
continue;
}
final PsiDeclarationStatement declaration = (PsiDeclarationStatement)statement;
final PsiElement[] variables = declaration.getDeclaredElements();
for (PsiElement variable : variables) {
if (!(variable instanceof PsiLocalVariable)) {
continue;
}
final PsiLocalVariable localVariable = (PsiLocalVariable)variable;
final String variableName = localVariable.getName();
if (variableName == null) {
continue;
}
for (PsiCodeBlock codeBlock : affectedBlocks) {
final PsiVariable target = resolveHelper.resolveAccessibleReferencedVariable(variableName, codeBlock);
if (target instanceof PsiLocalVariable) {
return true;
}
if (target instanceof PsiField) {
for (PsiCodeBlock affectedBlock : affectedBlocks) {
if (!SyntaxTraverser.psiTraverser(affectedBlock).filter(PsiReferenceExpression.class).filter(ref -> ref.resolve() == target).isEmpty()) {
return true;
}
}
}
}
}
}
return false;
}
}
@@ -15,6 +15,7 @@
*/
package com.intellij.psi.impl.source.tree.java;
import com.intellij.codeInsight.BlockUtils;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.*;
@@ -186,15 +187,7 @@ public class PsiTryStatementImpl extends CompositePsiElement implements PsiTrySt
if (child.getPsi() instanceof PsiResourceList && getCatchBlocks().length == 0 && getFinallyBlock() == null) {
final PsiCodeBlock tryBlock = getTryBlock();
if (tryBlock != null) {
final PsiCodeBlock block = (PsiCodeBlock)replace(tryBlock);
final PsiJavaToken lBrace = block.getLBrace();
final PsiJavaToken rBrace = block.getRBrace();
if (lBrace != null) {
lBrace.delete();
}
if (rBrace != null) {
rBrace.delete();
}
BlockUtils.unwrapTryBlock(this);
return;
}
}
@@ -1,7 +1,7 @@
class Test {
void m() throws Exception {
try (AutoCloseable r2 = null) {
System.out.println(null + ", " + r2);
}
System.out.println(null + ", " + r2);
}
}
}
@@ -1,6 +1,8 @@
class ARM {
void f() {
try (AutoCloseable <caret>r = null) {
void f() {
System.out.println("before");
try (AutoCloseable <caret>r = null) {
System.out.println("inside");
}
}
}
}
@@ -0,0 +1,10 @@
class ARM {
void f() {
System.out.println("before");
try (AutoCloseable <caret>r = null) {
int i = 0;
System.out.println("inside");
}
int i = 0;
}
}
@@ -0,0 +1,10 @@
class ARM {
void f() {
System.out.println("before");
{
int i = 0;
System.out.println("inside");
}
int i = 0;
}
}
@@ -1,4 +1,6 @@
class ARM {
void f() {
}
void f() {
System.out.println("before");
System.out.println("inside");
}
}
@@ -273,6 +273,11 @@ public class SafeDeleteTest extends MultiFileTestCase {
LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.JDK_1_7);
doSingleFileTest();
}
public void testLastResourceVariableConflictingVar() throws Exception {
LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.JDK_1_7);
doSingleFileTest();
}
public void testLastResourceVariableWithFinallyBlock() throws Exception {
LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.JDK_1_7);
@@ -15,6 +15,7 @@
*/
package com.siyeh.ig.controlflow;
import com.intellij.codeInsight.BlockUtils;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.codeInspection.ProblemHighlightType;
import com.intellij.codeInspection.ui.MultipleCheckboxOptionsPanel;
@@ -26,7 +27,6 @@ import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.BaseInspection;
import com.siyeh.ig.BaseInspectionVisitor;
import com.siyeh.ig.InspectionGadgetsFix;
import com.siyeh.ig.psiutils.BlockUtils;
import com.siyeh.ig.psiutils.CommentTracker;
import org.jdom.Element;
import org.jetbrains.annotations.NotNull;
@@ -15,6 +15,7 @@
*/
package com.siyeh.ig.controlflow;
import com.intellij.codeInsight.BlockUtils;
import com.intellij.codeInspection.*;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
@@ -3,14 +3,14 @@
*/
package com.siyeh.ig.fixes;
import com.intellij.codeInsight.BlockUtils;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.PsiCatchSection;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiParameter;
import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.InspectionGadgetsFix;
import com.siyeh.ig.psiutils.BlockUtils;
import com.siyeh.ig.psiutils.DeclarationSearchUtils;
import org.jetbrains.annotations.NotNull;
/**
@@ -55,51 +55,10 @@ public class DeleteCatchSectionFix extends InspectionGadgetsFix {
}
final PsiCatchSection catchSection = (PsiCatchSection)grandParent;
if (removeTryCatch) {
unwrapTryBlock(catchSection.getTryStatement());
BlockUtils.unwrapTryBlock(catchSection.getTryStatement());
}
else {
catchSection.delete();
}
}
public static void unwrapTryBlock(PsiTryStatement tryStatement) {
PsiCodeBlock tryBlock = tryStatement.getTryBlock();
if (tryBlock == null) {
return;
}
final PsiElement parent = tryStatement.getParent();
boolean singleStatement = false;
if (parent instanceof PsiStatement) {
final PsiStatement[] statements = tryBlock.getStatements();
if (statements.length == 1 && !(statements[0] instanceof PsiDeclarationStatement)) {
singleStatement = true;
}
else {
tryStatement = BlockUtils.expandSingleStatementToBlockStatement(tryStatement);
}
}
else if (parent instanceof PsiCodeBlock) {
if (DeclarationSearchUtils.containsConflictingDeclarations(tryBlock, (PsiCodeBlock)parent)) {
tryStatement = BlockUtils.expandSingleStatementToBlockStatement(tryStatement);
}
}
else {
return;
}
tryBlock = tryStatement.getTryBlock();
assert tryBlock != null;
final PsiElement first = singleStatement ? skip(tryBlock.getFirstBodyElement(), true) : tryBlock.getFirstBodyElement();
final PsiElement last = singleStatement? skip(tryBlock.getLastBodyElement(), false) : tryBlock.getLastBodyElement();
assert first != null && last != null;
tryStatement.getParent().addRangeBefore(first, last, tryStatement);
tryStatement.delete();
}
private static PsiElement skip(PsiElement element, boolean forward) {
if (!(element instanceof PsiWhiteSpace)) {
return element;
}
return forward ? element.getNextSibling() : element.getPrevSibling();
}
}
@@ -15,6 +15,7 @@
*/
package com.siyeh.ig.performance;
import com.intellij.codeInsight.BlockUtils;
import com.intellij.codeInsight.NullableNotNullManager;
import com.intellij.codeInsight.PsiEquivalenceUtil;
import com.intellij.codeInspection.ProblemDescriptor;
@@ -20,17 +20,12 @@ import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.controlFlow.DefUseUtil;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.search.LocalSearchScope;
import com.intellij.psi.search.PsiSearchHelper;
import com.intellij.psi.search.SearchScope;
import com.intellij.psi.search.searches.ReferencesSearch;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.SmartList;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List;
public class DeclarationSearchUtils {
private DeclarationSearchUtils() {}
@@ -48,48 +43,6 @@ public class DeclarationSearchUtils {
return target.equals(variable);
}
public static boolean containsConflictingDeclarations(PsiCodeBlock block, PsiCodeBlock parentBlock) {
final PsiStatement[] statements = block.getStatements();
if (statements.length == 0) {
return false;
}
final int endOffset = block.getTextRange().getEndOffset();
final List<PsiCodeBlock> affectedBlocks =
SyntaxTraverser.psiTraverser(parentBlock)
.filter(PsiCodeBlock.class)
.filter(cb -> cb.getTextRange().getEndOffset() > endOffset)
.addAllTo(new SmartList<>());
final SearchScope affectedScope = new LocalSearchScope(affectedBlocks.toArray(PsiElement.EMPTY_ARRAY));
final Project project = block.getProject();
final JavaPsiFacade facade = JavaPsiFacade.getInstance(project);
final PsiResolveHelper resolveHelper = facade.getResolveHelper();
for (final PsiStatement statement : statements) {
if (!(statement instanceof PsiDeclarationStatement)) {
continue;
}
final PsiDeclarationStatement declaration = (PsiDeclarationStatement)statement;
final PsiElement[] variables = declaration.getDeclaredElements();
for (PsiElement variable : variables) {
if (!(variable instanceof PsiLocalVariable)) {
continue;
}
final PsiLocalVariable localVariable = (PsiLocalVariable)variable;
final String variableName = localVariable.getName();
if (variableName == null) {
continue;
}
for (PsiCodeBlock codeBlock : affectedBlocks) {
final PsiVariable target = resolveHelper.resolveAccessibleReferencedVariable(variableName, codeBlock);
if (target instanceof PsiLocalVariable ||
target instanceof PsiField && ReferencesSearch.search(target, affectedScope).findFirst() != null) {
return true;
}
}
}
}
return false;
}
public static PsiExpression findDefinition(@NotNull PsiReferenceExpression referenceExpression,
@Nullable PsiVariable variable) {
if (variable == null) {
@@ -15,6 +15,7 @@
*/
package com.siyeh.ig.style;
import com.intellij.codeInsight.BlockUtils;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Pair;
@@ -25,7 +26,6 @@ import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.BaseInspection;
import com.siyeh.ig.BaseInspectionVisitor;
import com.siyeh.ig.InspectionGadgetsFix;
import com.siyeh.ig.psiutils.BlockUtils;
import org.jetbrains.annotations.Contract;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -15,6 +15,7 @@
*/
package com.siyeh.ig.style;
import com.intellij.codeInsight.BlockUtils;
import com.intellij.codeInspection.CleanupLocalInspectionTool;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel;
@@ -25,7 +26,6 @@ import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.BaseInspection;
import com.siyeh.ig.BaseInspectionVisitor;
import com.siyeh.ig.InspectionGadgetsFix;
import com.siyeh.ig.psiutils.DeclarationSearchUtils;
import org.jetbrains.annotations.NotNull;
import javax.swing.*;
@@ -121,7 +121,7 @@ public class UnnecessaryBlockStatementInspection extends BaseInspection implemen
}
final PsiCodeBlock parentBlock = (PsiCodeBlock)parent;
if (parentBlock.getStatementCount() > 1 &&
DeclarationSearchUtils.containsConflictingDeclarations(codeBlock, parentBlock)) {
BlockUtils.containsConflictingDeclarations(codeBlock, parentBlock)) {
return;
}
registerError(brace);
@@ -15,6 +15,7 @@
*/
package com.siyeh.ig.threading;
import com.intellij.codeInsight.BlockUtils;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel;
import com.intellij.openapi.project.Project;
@@ -29,7 +30,6 @@ import com.siyeh.ig.BaseInspection;
import com.siyeh.ig.BaseInspectionVisitor;
import com.siyeh.ig.InspectionGadgetsFix;
import com.siyeh.ig.callMatcher.CallMatcher;
import com.siyeh.ig.psiutils.BlockUtils;
import com.siyeh.ig.psiutils.ControlFlowUtils;
import com.siyeh.ig.psiutils.ExpressionUtils;
import com.siyeh.ig.psiutils.VariableAccessUtils;
@@ -1,6 +1,7 @@
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.codeInspection;
import com.intellij.codeInsight.BlockUtils;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.search.searches.ReferencesSearch;
@@ -15,6 +15,7 @@
*/
package com.siyeh.ig.controlflow;
import com.intellij.codeInsight.BlockUtils;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.codeInspection.ui.SingleCheckboxOptionsPanel;
import com.intellij.openapi.project.Project;
@@ -15,6 +15,7 @@
*/
package com.siyeh.ig.fixes;
import com.intellij.codeInsight.BlockUtils;
import com.intellij.codeInsight.daemon.impl.analysis.JavaHighlightUtil;
import com.intellij.codeInspection.ProblemDescriptor;
import com.intellij.openapi.project.Project;
@@ -26,7 +27,6 @@ import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.refactoring.util.RefactoringUtil;
import com.siyeh.InspectionGadgetsBundle;
import com.siyeh.ig.InspectionGadgetsFix;
import com.siyeh.ig.psiutils.BlockUtils;
import com.siyeh.ig.psiutils.CommentTracker;
import com.siyeh.ig.psiutils.ParenthesesUtils;
import com.siyeh.ipp.psiutils.HighlightUtil;
@@ -1,6 +1,7 @@
// Copyright 2000-2017 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.siyeh.ig.redundancy;
import com.intellij.codeInsight.BlockUtils;
import com.intellij.codeInsight.daemon.impl.quickfix.DeleteElementFix;
import com.intellij.codeInspection.*;
import com.intellij.openapi.project.Project;
@@ -15,12 +15,12 @@
*/
package com.siyeh.ipp.exceptions;
import com.intellij.codeInsight.BlockUtils;
import com.intellij.codeInsight.FileModificationService;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.util.PsiTreeUtil;
import com.siyeh.ig.fixes.DeleteCatchSectionFix;
import com.siyeh.ipp.base.Intention;
import com.siyeh.ipp.base.PsiElementPredicate;
import org.jetbrains.annotations.NotNull;
@@ -69,7 +69,7 @@ public class ConvertCatchToThrowsIntention extends Intention {
catchSection.delete();
}
else {
DeleteCatchSectionFix.unwrapTryBlock(tryStatement);
BlockUtils.unwrapTryBlock(tryStatement);
}
});
}
@@ -15,10 +15,10 @@
*/
package com.siyeh.ipp.whileloop;
import com.intellij.codeInsight.BlockUtils;
import com.intellij.openapi.project.Project;
import com.intellij.psi.*;
import com.intellij.psi.codeStyle.CodeStyleManager;
import com.siyeh.ig.psiutils.BlockUtils;
import com.siyeh.ig.psiutils.BoolUtils;
import com.siyeh.ig.psiutils.ExpressionUtils;
import com.siyeh.ipp.base.Intention;