//
// 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/IntermNode.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
