diff options
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.java | 29 |
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); |