Cleanup: NotNull/Nullable
[idea/community.git] / java / debugger / impl / src / com / intellij / debugger / engine / evaluation / expression / SwitchStatementEvaluator.java
1 // 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.
2 package com.intellij.debugger.engine.evaluation.expression;
3
4 import com.intellij.debugger.engine.evaluation.EvaluateException;
5 import com.intellij.debugger.engine.evaluation.EvaluationContextImpl;
6 import com.intellij.openapi.util.Comparing;
7 import org.jetbrains.annotations.Nullable;
8
9 import java.util.List;
10
11 /**
12  * @author egor
13  */
14 public class SwitchStatementEvaluator implements Evaluator {
15   private final Evaluator myExpressionEvaluator;
16   private final Evaluator[] myBodyEvaluators;
17   private final String myLabelName;
18
19   public SwitchStatementEvaluator(Evaluator expressionEvaluator, Evaluator[] bodyEvaluators, @Nullable String labelName) {
20     myExpressionEvaluator = expressionEvaluator;
21     myBodyEvaluators = bodyEvaluators;
22     myLabelName = labelName;
23   }
24
25   @Override
26   public Object evaluate(EvaluationContextImpl context) throws EvaluateException {
27     Object switchValue = UnBoxingEvaluator.unbox(myExpressionEvaluator.evaluate(context), context);
28     try {
29       boolean caseFound = false;
30       for (Evaluator evaluator : myBodyEvaluators) {
31         if (caseFound) {
32           evaluator.evaluate(context);
33         }
34         else {
35           Evaluator e = DisableGC.unwrap(evaluator);
36           if (e instanceof SwitchCaseEvaluator) {
37             SwitchCaseEvaluator caseEvaluator = (SwitchCaseEvaluator)e;
38             if (caseEvaluator.myDefaultCase || caseEvaluator.match(switchValue, context)) {
39               caseFound = true;
40             }
41           }
42         }
43       }
44     }
45     catch (BreakException e) {
46       if (!Comparing.equal(e.getLabelName(), myLabelName)) {
47         throw e;
48       }
49     }
50     return null;
51   }
52
53   static class SwitchCaseEvaluator implements Evaluator {
54     private final List<Evaluator> myEvaluators;
55     private final boolean myDefaultCase;
56
57     SwitchCaseEvaluator(List<Evaluator> evaluators, boolean defaultCase) {
58       myEvaluators = evaluators;
59       myDefaultCase = defaultCase;
60     }
61
62     boolean match(Object value, EvaluationContextImpl context) throws EvaluateException {
63       for (Evaluator evaluator : myEvaluators) {
64         if (value.equals(UnBoxingEvaluator.unbox(evaluator.evaluate(context), context))) {
65           return true;
66         }
67       }
68       return false;
69     }
70
71
72     @Override
73     public Object evaluate(EvaluationContextImpl context) throws EvaluateException {
74       return null;
75     }
76   }
77 }