blob: 22a57c969f105e98e6ce72f5b6e698bca08e1b70 [file] [log] [blame]
alokp@chromium.org04d7d222012-05-16 19:24:07 +00001//
2// Copyright (c) 2012 The ANGLE Project Authors. All rights reserved.
3// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
Geoff Lang0a73dd82014-11-19 16:18:08 -05007#ifndef COMPILER_PREPROCESSOR_MACROEXPANDER_H_
8#define COMPILER_PREPROCESSOR_MACROEXPANDER_H_
alokp@chromium.org04d7d222012-05-16 19:24:07 +00009
alokp@chromium.orga19572c2012-06-15 16:30:08 +000010#include <memory>
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000011#include <vector>
12
Corentin Wallez054f7ed2016-09-20 17:15:59 -040013#include "compiler/preprocessor/Lexer.h"
14#include "compiler/preprocessor/Macro.h"
alokp@chromium.org04d7d222012-05-16 19:24:07 +000015
16namespace pp
17{
18
alokp@chromium.org2c958ee2012-05-17 20:35:42 +000019class Diagnostics;
Olli Etuahoe6432c82015-09-08 14:21:38 +030020struct SourceLocation;
alokp@chromium.org2c958ee2012-05-17 20:35:42 +000021
alokp@chromium.org04d7d222012-05-16 19:24:07 +000022class MacroExpander : public Lexer
23{
24 public:
Olli Etuahof1cf5e62016-11-22 17:36:49 +000025 MacroExpander(Lexer *lexer,
26 MacroSet *macroSet,
27 Diagnostics *diagnostics,
28 int allowedMacroExpansionDepth);
Corentin Walleze5a1f272015-08-21 02:58:25 +020029 ~MacroExpander() override;
alokp@chromium.org04d7d222012-05-16 19:24:07 +000030
Corentin Walleze5a1f272015-08-21 02:58:25 +020031 void lex(Token *token) override;
alokp@chromium.org04d7d222012-05-16 19:24:07 +000032
33 private:
Zhenyao Mod526f982014-05-13 14:51:19 -070034 void getToken(Token *token);
35 void ungetToken(const Token &token);
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000036 bool isNextTokenLeftParen();
37
Zhenyao Mod526f982014-05-13 14:51:19 -070038 bool pushMacro(const Macro &macro, const Token &identifier);
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000039 void popMacro();
40
Zhenyao Mod526f982014-05-13 14:51:19 -070041 bool expandMacro(const Macro &macro,
42 const Token &identifier,
43 std::vector<Token> *replacements);
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000044
45 typedef std::vector<Token> MacroArg;
Zhenyao Mod526f982014-05-13 14:51:19 -070046 bool collectMacroArgs(const Macro &macro,
47 const Token &identifier,
Olli Etuahoe6432c82015-09-08 14:21:38 +030048 std::vector<MacroArg> *args,
49 SourceLocation *closingParenthesisLocation);
Zhenyao Mod526f982014-05-13 14:51:19 -070050 void replaceMacroParams(const Macro &macro,
51 const std::vector<MacroArg> &args,
52 std::vector<Token> *replacements);
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000053
54 struct MacroContext
55 {
Corentin Wallez054f7ed2016-09-20 17:15:59 -040056 MacroContext();
57 bool empty() const;
58 const Token &get();
59 void unget();
60
Zhenyao Mod526f982014-05-13 14:51:19 -070061 const Macro *macro;
daniel@transgaming.coma16a55f2012-12-20 20:51:54 +000062 std::size_t index;
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000063 std::vector<Token> replacements;
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000064 };
65
Zhenyao Mod526f982014-05-13 14:51:19 -070066 Lexer *mLexer;
67 MacroSet *mMacroSet;
68 Diagnostics *mDiagnostics;
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000069
Corentin Wallez946903d2016-04-18 17:30:07 -040070 std::unique_ptr<Token> mReserveToken;
Zhenyao Mod526f982014-05-13 14:51:19 -070071 std::vector<MacroContext *> mContextStack;
Corentin Wallez2bd9c442016-09-20 16:39:18 -040072 size_t mTotalTokensInContexts;
Olli Etuaho78b0c912016-11-21 14:23:06 +000073
Olli Etuahof1cf5e62016-11-22 17:36:49 +000074 int mAllowedMacroExpansionDepth;
75
Olli Etuaho78b0c912016-11-21 14:23:06 +000076 bool mDeferReenablingMacros;
77 std::vector<const Macro *> mMacrosToReenable;
78
79 class ScopedMacroReenabler;
alokp@chromium.org04d7d222012-05-16 19:24:07 +000080};
81
82} // namespace pp
alokp@chromium.org04d7d222012-05-16 19:24:07 +000083
Geoff Lang0a73dd82014-11-19 16:18:08 -050084#endif // COMPILER_PREPROCESSOR_MACROEXPANDER_H_