// // Copyright (c) 2002-2015 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // #ifndef COMPILER_TRANSLATOR_REMOVESWITCHFALLTHROUGH_H_ #define COMPILER_TRANSLATOR_REMOVESWITCHFALLTHROUGH_H_ #include "compiler/translator/IntermNode.h" namespace sh { class RemoveSwitchFallThrough : public TIntermTraverser { public: // When given a statementList from a switch AST node, return an updated // statementList that has fall-through removed. static TIntermBlock *removeFallThrough(TIntermBlock *statementList); private: RemoveSwitchFallThrough(TIntermBlock *statementList); void visitSymbol(TIntermSymbol *node) override; void visitConstantUnion(TIntermConstantUnion *node) override; bool visitBinary(Visit, TIntermBinary *node) override; bool visitUnary(Visit, TIntermUnary *node) override; bool visitTernary(Visit visit, TIntermTernary *node) override; bool visitIfElse(Visit visit, TIntermIfElse *node) override; bool visitSwitch(Visit, TIntermSwitch *node) override; bool visitCase(Visit, TIntermCase *node) override; bool visitAggregate(Visit, TIntermAggregate *node) override; bool visitBlock(Visit, TIntermBlock *node) override; bool visitLoop(Visit, TIntermLoop *node) override; bool visitBranch(Visit, TIntermBranch *node) override; void outputSequence(TIntermSequence *sequence, size_t startIndex); void handlePreviousCase(); TIntermBlock *mStatementList; TIntermBlock *mStatementListOut; bool mLastStatementWasBreak; TIntermBlock *mPreviousCase; std::vector mCasesSharingBreak; }; } // namespace sh #endif // COMPILER_TRANSLATOR_REMOVESWITCHFALLTHROUGH_H_