//
// 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_DIRECTIVE_PARSER_H_
#define COMPILER_PREPROCESSOR_DIRECTIVE_PARSER_H_

#include "Lexer.h"
#include "Macro.h"
#include "pp_utils.h"
#include "SourceLocation.h"

namespace pp
{

class Diagnostics;
class DirectiveHandler;
class Tokenizer;

class DirectiveParser : public Lexer
{
  public:
    DirectiveParser(Tokenizer* tokenizer,
                    MacroSet* macroSet,
                    Diagnostics* diagnostics,
                    DirectiveHandler* directiveHandler);

    virtual void lex(Token* token);

  private:
    PP_DISALLOW_COPY_AND_ASSIGN(DirectiveParser);

    void parseDirective(Token* token);
    void parseDefine(Token* token);
    void parseUndef(Token* token);
    void parseIf(Token* token);
    void parseIfdef(Token* token);
    void parseIfndef(Token* token);
    void parseElse(Token* token);
    void parseElif(Token* token);
    void parseEndif(Token* token);
    void parseError(Token* token);
    void parsePragma(Token* token);
    void parseExtension(Token* token);
    void parseVersion(Token* token);
    void parseLine(Token* token);

    bool skipping() const;
    void parseConditionalIf(Token* token);
    int parseExpressionIf(Token* token);
    int parseExpressionIfdef(Token* token);

    struct ConditionalBlock
    {
        std::string type;
        SourceLocation location;
        bool skipBlock;
        bool skipGroup;
        bool foundValidGroup;
        bool foundElseGroup;

        ConditionalBlock() :
            skipBlock(false),
            skipGroup(false),
            foundValidGroup(false),
            foundElseGroup(false)
        {
        }
    };
    bool mPastFirstStatement;
    std::vector<ConditionalBlock> mConditionalStack;
    Tokenizer* mTokenizer;
    MacroSet* mMacroSet;
    Diagnostics* mDiagnostics;
    DirectiveHandler* mDirectiveHandler;
};

}  // namespace pp
#endif  // COMPILER_PREPROCESSOR_DIRECTIVE_PARSER_H_

