From 46a3df0018e9e43be4fabd23f1b39b79c8a01161 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 12 Sep 2017 17:03:42 +0700 Subject: [PATCH] DfaUtil#getWriteOffset: use PsiTreeUtil.processElements instead of ReferencesSearch (faster) --- .../com/intellij/codeInspection/dataFlow/DfaUtil.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaUtil.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaUtil.java index 8a66aabe4775..1a8f4293c4b2 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaUtil.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/DfaUtil.java @@ -24,8 +24,6 @@ import com.intellij.lang.jvm.JvmModifier; import com.intellij.openapi.util.MultiValuesMap; import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.*; -import com.intellij.psi.search.LocalSearchScope; -import com.intellij.psi.search.searches.ReferencesSearch; import com.intellij.psi.tree.IElementType; import com.intellij.psi.util.*; import com.intellij.util.IncorrectOperationException; @@ -220,8 +218,10 @@ public class DfaUtil { } PsiClass aClass = Objects.requireNonNull(target.getContainingClass()); PsiClassInitializer[] initializers = aClass.getInitializers(); - Predicate writesToTarget = element -> !ReferencesSearch.search(target, new LocalSearchScope(element)) - .forEach(e -> !(e instanceof PsiExpression) || !PsiUtil.isAccessedForWriting((PsiExpression)e)); + Predicate writesToTarget = element -> + !PsiTreeUtil.processElements(element, e -> !(e instanceof PsiExpression) || + !PsiUtil.isAccessedForWriting((PsiExpression)e) || + !ExpressionUtils.isReferenceTo((PsiExpression)e, target)); Predicate hasSideEffectCall = element -> !PsiTreeUtil.findChildrenOfType(element, PsiMethodCallExpression.class).stream() .map(PsiMethodCallExpression::resolveMethod).allMatch(method -> method != null && ControlFlowAnalyzer.isPure(method)); for (PsiClassInitializer initializer : initializers) { @@ -374,7 +374,7 @@ public class DfaUtil { final ValuableDataFlowRunner.ValuableDfaVariableState curState = (ValuableDataFlowRunner.ValuableDfaVariableState)memState.getVariableState(var); final FList curValue = curState.myConcatenation; final FList nextValue; - if (type == JavaTokenType.PLUSEQ && !prevValue.isEmpty() && rightValue != null) { + if (type == JavaTokenType.PLUSEQ && !prevValue.isEmpty()) { nextValue = prevValue.prepend(rightValue); } else {