//
// Copyright (c) 2012 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.
//

#ifndef COMPILER_PREPROCESSOR_MACRO_EXPANDER_H_
#define COMPILER_PREPROCESSOR_MACRO_EXPANDER_H_

#include <cassert>
#include <memory>
#include <vector>

#include "Lexer.h"
#include "Macro.h"
#include "pp_utils.h"

namespace pp
{

class Diagnostics;

class MacroExpander : public Lexer
{
  public:
    MacroExpander(Lexer* lexer, MacroSet* macroSet, Diagnostics* diagnostics);
    virtual ~MacroExpander();

    virtual void lex(Token* token);

  private:
    PP_DISALLOW_COPY_AND_ASSIGN(MacroExpander);

    void getToken(Token* token);
    void ungetToken(const Token& token);
    bool isNextTokenLeftParen();

    bool pushMacro(const Macro& macro, const Token& identifier);
    void popMacro();

    bool expandMacro(const Macro& macro,
                     const Token& identifier,
                     std::vector<Token>* replacements);

    typedef std::vector<Token> MacroArg;
    bool collectMacroArgs(const Macro& macro,
                          const Token& identifier,
                          std::vector<MacroArg>* args);
    void replaceMacroParams(const Macro& macro,
                            const std::vector<MacroArg>& args,
                            std::vector<Token>* replacements);

    struct MacroContext
    {
        const Macro* macro;
        size_t index;
        std::vector<Token> replacements;

        MacroContext() : macro(0), index(0) { }
        bool empty() const { return index == replacements.size(); }
        const Token& get() { return replacements[index++]; }
        void unget() { assert(index > 0); --index; }
    };

    Lexer* mLexer;
    MacroSet* mMacroSet;
    Diagnostics* mDiagnostics;

    std::auto_ptr<Token> mReserveToken;
    std::vector<MacroContext*> mContextStack;
};

}  // namespace pp
#endif  // COMPILER_PREPROCESSOR_MACRO_EXPANDER_H_

