summaryrefslogtreecommitdiff
path: root/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowFactory.java
diff options
context:
space:
mode:
Diffstat (limited to 'java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowFactory.java')
-rw-r--r--java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowFactory.java29
1 files changed, 21 insertions, 8 deletions
diff --git a/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowFactory.java b/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowFactory.java
index 2ba1906c422c..3159193bce4f 100644
--- a/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowFactory.java
+++ b/java/java-psi-impl/src/com/intellij/psi/controlFlow/ControlFlowFactory.java
@@ -62,19 +62,29 @@ public class ControlFlowFactory {
cachedFlows.clear();
}
+ @Deprecated
public void registerSubRange(final PsiElement codeFragment, final ControlFlowSubRange flow, final boolean evaluateConstantIfConfition,
final ControlFlowPolicy policy) {
- registerControlFlow(codeFragment, flow, evaluateConstantIfConfition, policy);
+ registerSubRange(codeFragment, flow, evaluateConstantIfConfition, true, policy);
+ }
+
+ public void registerSubRange(final PsiElement codeFragment,
+ final ControlFlowSubRange flow,
+ final boolean evaluateConstantIfConfition,
+ boolean enableShortCircuit, final ControlFlowPolicy policy) {
+ registerControlFlow(codeFragment, flow, evaluateConstantIfConfition, enableShortCircuit, policy);
}
private static class ControlFlowContext {
private final ControlFlowPolicy policy;
private final boolean evaluateConstantIfCondition;
+ private final boolean enableShortCircuit;
private final long modificationCount;
private final ControlFlow controlFlow;
- private ControlFlowContext(boolean evaluateConstantIfCondition, @NotNull ControlFlowPolicy policy, long modificationCount, @NotNull ControlFlow controlFlow) {
+ private ControlFlowContext(boolean evaluateConstantIfCondition, boolean enableShortCircuit, @NotNull ControlFlowPolicy policy, long modificationCount, @NotNull ControlFlow controlFlow) {
this.evaluateConstantIfCondition = evaluateConstantIfCondition;
+ this.enableShortCircuit = enableShortCircuit;
this.policy = policy;
this.modificationCount = modificationCount;
this.controlFlow = controlFlow;
@@ -96,9 +106,10 @@ public class ControlFlowFactory {
return result;
}
- public boolean isFor(@NotNull ControlFlowPolicy policy, final boolean evaluateConstantIfCondition, long modificationCount) {
+ public boolean isFor(@NotNull ControlFlowPolicy policy, final boolean evaluateConstantIfCondition, final boolean enableShortCircuit, long modificationCount) {
if (modificationCount != this.modificationCount) return false;
if (!policy.equals(this.policy)) return false;
+ if (enableShortCircuit != this.enableShortCircuit) return false;
// optimization: when no constant condition were computed, both control flows are the same
if (!controlFlow.isConstantConditionOccurred()) return true;
@@ -107,7 +118,7 @@ public class ControlFlowFactory {
}
private boolean isFor(@NotNull ControlFlowContext that) {
- return isFor(that.policy, that.evaluateConstantIfCondition, that.modificationCount);
+ return isFor(that.policy, that.evaluateConstantIfCondition, that.enableShortCircuit, that.modificationCount);
}
}
@@ -129,28 +140,30 @@ public class ControlFlowFactory {
final long modificationCount = element.getManager().getModificationTracker().getModificationCount();
ConcurrentList<ControlFlowContext> cached = getOrCreateCachedFlowsForElement(element);
for (ControlFlowContext context : cached) {
- if (context.isFor(policy, evaluateConstantIfCondition,modificationCount)) return context.controlFlow;
+ if (context.isFor(policy, evaluateConstantIfCondition, enableShortCircuit, modificationCount)) return context.controlFlow;
}
ControlFlow controlFlow = new ControlFlowAnalyzer(element, policy, enableShortCircuit, evaluateConstantIfCondition).buildControlFlow();
- ControlFlowContext context = createContext(evaluateConstantIfCondition, policy, controlFlow, modificationCount);
+ ControlFlowContext context = createContext(evaluateConstantIfCondition, enableShortCircuit, policy, controlFlow, modificationCount);
cached.addIfAbsent(context);
return controlFlow;
}
@NotNull
private static ControlFlowContext createContext(final boolean evaluateConstantIfCondition,
+ boolean enableShortCircuit,
@NotNull ControlFlowPolicy policy,
@NotNull ControlFlow controlFlow,
final long modificationCount) {
- return new ControlFlowContext(evaluateConstantIfCondition, policy, modificationCount,controlFlow);
+ return new ControlFlowContext(evaluateConstantIfCondition, enableShortCircuit, policy, modificationCount,controlFlow);
}
private void registerControlFlow(@NotNull PsiElement element,
@NotNull ControlFlow flow,
boolean evaluateConstantIfCondition,
+ boolean enableShortCircuit,
@NotNull ControlFlowPolicy policy) {
final long modificationCount = element.getManager().getModificationTracker().getModificationCount();
- ControlFlowContext controlFlowContext = createContext(evaluateConstantIfCondition, policy, flow, modificationCount);
+ ControlFlowContext controlFlowContext = createContext(evaluateConstantIfCondition, enableShortCircuit, policy, flow, modificationCount);
ConcurrentList<ControlFlowContext> cached = getOrCreateCachedFlowsForElement(element);
cached.addIfAbsent(controlFlowContext);