| // | |
| // Copyright (c) 2016 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. | |
| // | |
| // IntermNodePatternMatcher is a helper class for matching node trees to given patterns. | |
| // It can be used whenever the same checks for certain node structures are common to multiple AST | |
| // traversers. | |
| // | |
| #ifndef COMPILER_TRANSLATOR_INTERMNODEPATTERNMATCHER_H_ | |
| #define COMPILER_TRANSLATOR_INTERMNODEPATTERNMATCHER_H_ | |
| namespace sh | |
| { | |
| class TIntermAggregate; | |
| class TIntermBinary; | |
| class TIntermNode; | |
| class TIntermTernary; | |
| class TIntermDeclaration; | |
| class IntermNodePatternMatcher | |
| { | |
| public: | |
| static bool IsDynamicIndexingOfVectorOrMatrix(TIntermBinary *node); | |
| enum PatternType | |
| { | |
| // Matches expressions that are unfolded to if statements by UnfoldShortCircuitToIf | |
| kUnfoldedShortCircuitExpression = 0x0001, | |
| // Matches expressions that return arrays with the exception of simple statements where a | |
| // constructor or function call result is assigned. | |
| kExpressionReturningArray = 0x0002, | |
| // Matches dynamic indexing of vectors or matrices in l-values. | |
| kDynamicIndexingOfVectorOrMatrixInLValue = 0x0004, | |
| // Matches declarations with more than one declared variables | |
| kMultiDeclaration = 0x0008, | |
| }; | |
| IntermNodePatternMatcher(const unsigned int mask); | |
| bool match(TIntermBinary *node, TIntermNode *parentNode); | |
| // Use this version for checking binary node matches in case you're using flag | |
| // kDynamicIndexingOfVectorOrMatrixInLValue. | |
| bool match(TIntermBinary *node, TIntermNode *parentNode, bool isLValueRequiredHere); | |
| bool match(TIntermAggregate *node, TIntermNode *parentNode); | |
| bool match(TIntermTernary *node); | |
| bool match(TIntermDeclaration *node); | |
| private: | |
| const unsigned int mMask; | |
| bool matchInternal(TIntermBinary *node, TIntermNode *parentNode); | |
| }; | |
| } // namespace sh | |
| #endif |