| // | |
| // Copyright 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/tree_util/FindSymbolNode.h" | |
| #include "compiler/translator/ImmutableString.h" | |
| #include "compiler/translator/Symbol.h" | |
| #include "compiler/translator/tree_util/IntermTraverse.h" | |
| namespace sh | |
| { | |
| namespace | |
| { | |
| class SymbolFinder : public TIntermTraverser | |
| { | |
| public: | |
| SymbolFinder(const ImmutableString &symbolName) | |
| : TIntermTraverser(true, false, false), mSymbolName(symbolName), mNodeFound(nullptr) | |
| {} | |
| void visitSymbol(TIntermSymbol *node) | |
| { | |
| if (node->variable().symbolType() != SymbolType::Empty && node->getName() == mSymbolName) | |
| { | |
| mNodeFound = node; | |
| } | |
| } | |
| bool isFound() const { return mNodeFound != nullptr; } | |
| const TIntermSymbol *getNode() const { return mNodeFound; } | |
| private: | |
| ImmutableString mSymbolName; | |
| TIntermSymbol *mNodeFound; | |
| }; | |
| } // anonymous namespace | |
| const TIntermSymbol *FindSymbolNode(TIntermNode *root, const ImmutableString &symbolName) | |
| { | |
| SymbolFinder finder(symbolName); | |
| root->traverse(&finder); | |
| return finder.getNode(); | |
| } | |
| } // namespace sh |