diff options
Diffstat (limited to '')
-rw-r--r-- | gfx/angle/checkout/src/compiler/translator/tree_util/FindSymbolNode.cpp | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/gfx/angle/checkout/src/compiler/translator/tree_util/FindSymbolNode.cpp b/gfx/angle/checkout/src/compiler/translator/tree_util/FindSymbolNode.cpp new file mode 100644 index 0000000000..2951399390 --- /dev/null +++ b/gfx/angle/checkout/src/compiler/translator/tree_util/FindSymbolNode.cpp @@ -0,0 +1,53 @@ +// +// 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) override + { + 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 |