xref: /aosp_15_r20/external/angle/src/compiler/preprocessor/MacroExpander.h (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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 &macro, 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 &macro,
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 &macro,
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