blob: 837bd73302ea07865d3f0042d117ed1049402113 [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"
Jamie Madillc3bef3e2018-10-03 07:35:09 -040015#include "compiler/preprocessor/Preprocessor.h"
alokp@chromium.org04d7d222012-05-16 19:24:07 +000016
Geoff Lang197d5292018-04-25 14:29:00 -040017namespace angle
18{
19
alokp@chromium.org04d7d222012-05-16 19:24:07 +000020namespace pp
21{
22
alokp@chromium.org2c958ee2012-05-17 20:35:42 +000023class Diagnostics;
Olli Etuahoe6432c82015-09-08 14:21:38 +030024struct SourceLocation;
alokp@chromium.org2c958ee2012-05-17 20:35:42 +000025
alokp@chromium.org04d7d222012-05-16 19:24:07 +000026class MacroExpander : public Lexer
27{
28 public:
Olli Etuahof1cf5e62016-11-22 17:36:49 +000029 MacroExpander(Lexer *lexer,
30 MacroSet *macroSet,
31 Diagnostics *diagnostics,
Jamie Madillc3bef3e2018-10-03 07:35:09 -040032 const PreprocessorSettings &settings,
33 bool parseDefined);
Corentin Walleze5a1f272015-08-21 02:58:25 +020034 ~MacroExpander() override;
alokp@chromium.org04d7d222012-05-16 19:24:07 +000035
Corentin Walleze5a1f272015-08-21 02:58:25 +020036 void lex(Token *token) override;
alokp@chromium.org04d7d222012-05-16 19:24:07 +000037
38 private:
Zhenyao Mod526f982014-05-13 14:51:19 -070039 void getToken(Token *token);
40 void ungetToken(const Token &token);
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000041 bool isNextTokenLeftParen();
42
Olli Etuaho47c27e82017-01-17 15:29:35 +000043 bool pushMacro(std::shared_ptr<Macro> macro, const Token &identifier);
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000044 void popMacro();
45
Jamie Madillf832c9d2016-12-12 17:38:48 -050046 bool expandMacro(const Macro &macro, const Token &identifier, std::vector<Token> *replacements);
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000047
48 typedef std::vector<Token> MacroArg;
Zhenyao Mod526f982014-05-13 14:51:19 -070049 bool collectMacroArgs(const Macro &macro,
50 const Token &identifier,
Olli Etuahoe6432c82015-09-08 14:21:38 +030051 std::vector<MacroArg> *args,
52 SourceLocation *closingParenthesisLocation);
Zhenyao Mod526f982014-05-13 14:51:19 -070053 void replaceMacroParams(const Macro &macro,
54 const std::vector<MacroArg> &args,
55 std::vector<Token> *replacements);
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000056
57 struct MacroContext
58 {
Corentin Wallez054f7ed2016-09-20 17:15:59 -040059 MacroContext();
Jamie Madillacf2f3a2017-11-21 19:22:44 -050060 ~MacroContext();
Corentin Wallez054f7ed2016-09-20 17:15:59 -040061 bool empty() const;
62 const Token &get();
63 void unget();
64
Olli Etuaho47c27e82017-01-17 15:29:35 +000065 std::shared_ptr<Macro> macro;
daniel@transgaming.coma16a55f2012-12-20 20:51:54 +000066 std::size_t index;
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000067 std::vector<Token> replacements;
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000068 };
69
Zhenyao Mod526f982014-05-13 14:51:19 -070070 Lexer *mLexer;
71 MacroSet *mMacroSet;
72 Diagnostics *mDiagnostics;
Jamie Madillc3bef3e2018-10-03 07:35:09 -040073 bool mParseDefined;
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000074
Corentin Wallez946903d2016-04-18 17:30:07 -040075 std::unique_ptr<Token> mReserveToken;
Zhenyao Mod526f982014-05-13 14:51:19 -070076 std::vector<MacroContext *> mContextStack;
Corentin Wallez2bd9c442016-09-20 16:39:18 -040077 size_t mTotalTokensInContexts;
Olli Etuaho78b0c912016-11-21 14:23:06 +000078
Jamie Madillc3bef3e2018-10-03 07:35:09 -040079 PreprocessorSettings mSettings;
Olli Etuahof1cf5e62016-11-22 17:36:49 +000080
Olli Etuaho78b0c912016-11-21 14:23:06 +000081 bool mDeferReenablingMacros;
Olli Etuaho47c27e82017-01-17 15:29:35 +000082 std::vector<std::shared_ptr<Macro>> mMacrosToReenable;
Olli Etuaho78b0c912016-11-21 14:23:06 +000083
84 class ScopedMacroReenabler;
alokp@chromium.org04d7d222012-05-16 19:24:07 +000085};
86
87} // namespace pp
alokp@chromium.org04d7d222012-05-16 19:24:07 +000088
Geoff Lang197d5292018-04-25 14:29:00 -040089} // namespace angle
90
Geoff Lang0a73dd82014-11-19 16:18:08 -050091#endif // COMPILER_PREPROCESSOR_MACROEXPANDER_H_