1*8975f5c5SAndroid Build Coastguard Worker // 2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2012 The ANGLE Project Authors. All rights reserved. 3*8975f5c5SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 4*8975f5c5SAndroid Build Coastguard Worker // found in the LICENSE file. 5*8975f5c5SAndroid Build Coastguard Worker // 6*8975f5c5SAndroid Build Coastguard Worker 7*8975f5c5SAndroid Build Coastguard Worker #ifndef COMPILER_PREPROCESSOR_MACROEXPANDER_H_ 8*8975f5c5SAndroid Build Coastguard Worker #define COMPILER_PREPROCESSOR_MACROEXPANDER_H_ 9*8975f5c5SAndroid Build Coastguard Worker 10*8975f5c5SAndroid Build Coastguard Worker #include <memory> 11*8975f5c5SAndroid Build Coastguard Worker #include <vector> 12*8975f5c5SAndroid Build Coastguard Worker 13*8975f5c5SAndroid Build Coastguard Worker #include "compiler/preprocessor/Lexer.h" 14*8975f5c5SAndroid Build Coastguard Worker #include "compiler/preprocessor/Macro.h" 15*8975f5c5SAndroid Build Coastguard Worker #include "compiler/preprocessor/Preprocessor.h" 16*8975f5c5SAndroid Build Coastguard Worker #include "compiler/preprocessor/Token.h" 17*8975f5c5SAndroid Build Coastguard Worker 18*8975f5c5SAndroid Build Coastguard Worker namespace angle 19*8975f5c5SAndroid Build Coastguard Worker { 20*8975f5c5SAndroid Build Coastguard Worker 21*8975f5c5SAndroid Build Coastguard Worker namespace pp 22*8975f5c5SAndroid Build Coastguard Worker { 23*8975f5c5SAndroid Build Coastguard Worker 24*8975f5c5SAndroid Build Coastguard Worker class Diagnostics; 25*8975f5c5SAndroid Build Coastguard Worker struct SourceLocation; 26*8975f5c5SAndroid Build Coastguard Worker 27*8975f5c5SAndroid Build Coastguard Worker class MacroExpander : public Lexer 28*8975f5c5SAndroid Build Coastguard Worker { 29*8975f5c5SAndroid Build Coastguard Worker public: 30*8975f5c5SAndroid Build Coastguard Worker MacroExpander(Lexer *lexer, 31*8975f5c5SAndroid Build Coastguard Worker MacroSet *macroSet, 32*8975f5c5SAndroid Build Coastguard Worker Diagnostics *diagnostics, 33*8975f5c5SAndroid Build Coastguard Worker const PreprocessorSettings &settings, 34*8975f5c5SAndroid Build Coastguard Worker bool parseDefined); 35*8975f5c5SAndroid Build Coastguard Worker ~MacroExpander() override; 36*8975f5c5SAndroid Build Coastguard Worker 37*8975f5c5SAndroid Build Coastguard Worker void lex(Token *token) override; 38*8975f5c5SAndroid Build Coastguard Worker 39*8975f5c5SAndroid Build Coastguard Worker private: 40*8975f5c5SAndroid Build Coastguard Worker void getToken(Token *token); 41*8975f5c5SAndroid Build Coastguard Worker void ungetToken(const Token &token); 42*8975f5c5SAndroid Build Coastguard Worker bool isNextTokenLeftParen(); 43*8975f5c5SAndroid Build Coastguard Worker 44*8975f5c5SAndroid Build Coastguard Worker bool pushMacro(std::shared_ptr<Macro> macro, const Token &identifier); 45*8975f5c5SAndroid Build Coastguard Worker void popMacro(); 46*8975f5c5SAndroid Build Coastguard Worker 47*8975f5c5SAndroid Build Coastguard Worker bool expandMacro(const Macro ¯o, const Token &identifier, std::vector<Token> *replacements); 48*8975f5c5SAndroid Build Coastguard Worker 49*8975f5c5SAndroid Build Coastguard Worker typedef std::vector<Token> MacroArg; 50*8975f5c5SAndroid Build Coastguard Worker bool collectMacroArgs(const Macro ¯o, 51*8975f5c5SAndroid Build Coastguard Worker const Token &identifier, 52*8975f5c5SAndroid Build Coastguard Worker std::vector<MacroArg> *args, 53*8975f5c5SAndroid Build Coastguard Worker SourceLocation *closingParenthesisLocation); 54*8975f5c5SAndroid Build Coastguard Worker void replaceMacroParams(const Macro ¯o, 55*8975f5c5SAndroid Build Coastguard Worker const std::vector<MacroArg> &args, 56*8975f5c5SAndroid Build Coastguard Worker std::vector<Token> *replacements); 57*8975f5c5SAndroid Build Coastguard Worker 58*8975f5c5SAndroid Build Coastguard Worker struct MacroContext 59*8975f5c5SAndroid Build Coastguard Worker { MacroContextMacroContext60*8975f5c5SAndroid Build Coastguard Worker MacroContext(std::shared_ptr<Macro> macro, std::vector<Token> &&replacements) 61*8975f5c5SAndroid Build Coastguard Worker : macro(std::move(macro)), replacements(std::move(replacements)) 62*8975f5c5SAndroid Build Coastguard Worker {} 63*8975f5c5SAndroid Build Coastguard Worker bool empty() const; 64*8975f5c5SAndroid Build Coastguard Worker const Token &get(); 65*8975f5c5SAndroid Build Coastguard Worker void unget(); 66*8975f5c5SAndroid Build Coastguard Worker 67*8975f5c5SAndroid Build Coastguard Worker std::shared_ptr<Macro> macro; 68*8975f5c5SAndroid Build Coastguard Worker std::vector<Token> replacements; 69*8975f5c5SAndroid Build Coastguard Worker std::size_t index = 0; 70*8975f5c5SAndroid Build Coastguard Worker }; 71*8975f5c5SAndroid Build Coastguard Worker 72*8975f5c5SAndroid Build Coastguard Worker Lexer *mLexer; 73*8975f5c5SAndroid Build Coastguard Worker MacroSet *mMacroSet; 74*8975f5c5SAndroid Build Coastguard Worker Diagnostics *mDiagnostics; 75*8975f5c5SAndroid Build Coastguard Worker bool mParseDefined; 76*8975f5c5SAndroid Build Coastguard Worker 77*8975f5c5SAndroid Build Coastguard Worker std::unique_ptr<Token> mReserveToken; 78*8975f5c5SAndroid Build Coastguard Worker std::vector<MacroContext> mContextStack; 79*8975f5c5SAndroid Build Coastguard Worker size_t mTotalTokensInContexts; 80*8975f5c5SAndroid Build Coastguard Worker 81*8975f5c5SAndroid Build Coastguard Worker PreprocessorSettings mSettings; 82*8975f5c5SAndroid Build Coastguard Worker 83*8975f5c5SAndroid Build Coastguard Worker bool mDeferReenablingMacros; 84*8975f5c5SAndroid Build Coastguard Worker std::vector<std::shared_ptr<Macro>> mMacrosToReenable; 85*8975f5c5SAndroid Build Coastguard Worker 86*8975f5c5SAndroid Build Coastguard Worker class ScopedMacroReenabler; 87*8975f5c5SAndroid Build Coastguard Worker }; 88*8975f5c5SAndroid Build Coastguard Worker 89*8975f5c5SAndroid Build Coastguard Worker } // namespace pp 90*8975f5c5SAndroid Build Coastguard Worker 91*8975f5c5SAndroid Build Coastguard Worker } // namespace angle 92*8975f5c5SAndroid Build Coastguard Worker 93*8975f5c5SAndroid Build Coastguard Worker #endif // COMPILER_PREPROCESSOR_MACROEXPANDER_H_ 94