// // 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 TIntermDeclaration; class TIntermNode; class TIntermTernary; class TIntermUnary; 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 = 0x0001 << 1, // Matches dynamic indexing of vectors or matrices in l-values. kDynamicIndexingOfVectorOrMatrixInLValue = 0x0001 << 2, // Matches declarations with more than one declared variables. kMultiDeclaration = 0x0001 << 3, // Matches declarations of arrays. kArrayDeclaration = 0x0001 << 4, // Matches declarations of structs where the struct type does not have a name. kNamelessStructDeclaration = 0x0001 << 5, // Matches array length() method. kArrayLengthMethod = 0x0001 << 6 }; IntermNodePatternMatcher(const unsigned int mask); bool match(TIntermUnary *node); 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