| // |
| // Copyright (c) 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. |
| // |
| // FindSymbol.cpp: |
| // Utility for finding a symbol node inside an AST tree. |
| |
| #include "compiler/translator/FindSymbolNode.h" |
| |
| #include "compiler/translator/IntermTraverse.h" |
| |
| namespace sh |
| { |
| |
| namespace |
| { |
| |
| class SymbolFinder : public TIntermTraverser |
| { |
| public: |
| SymbolFinder(const TString &symbolName, TBasicType basicType) |
| : TIntermTraverser(true, false, false), |
| mSymbolName(symbolName), |
| mNodeFound(nullptr), |
| mBasicType(basicType) |
| { |
| } |
| |
| void visitSymbol(TIntermSymbol *node) |
| { |
| if (node->getBasicType() == mBasicType && node->getSymbol() == mSymbolName) |
| { |
| mNodeFound = node; |
| } |
| } |
| |
| bool isFound() const { return mNodeFound != nullptr; } |
| const TIntermSymbol *getNode() const { return mNodeFound; } |
| |
| private: |
| TString mSymbolName; |
| TIntermSymbol *mNodeFound; |
| TBasicType mBasicType; |
| }; |
| |
| } // anonymous namespace |
| |
| const TIntermSymbol *FindSymbolNode(TIntermNode *root, |
| const TString &symbolName, |
| TBasicType basicType) |
| { |
| SymbolFinder finder(symbolName, basicType); |
| root->traverse(&finder); |
| return finder.getNode(); |
| } |
| |
| } // namespace sh |