blob: dbf980308b79b768726c6c7cef3fb51ad99ed351 [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
maxvujovic@gmail.com433f4aa2012-07-18 17:29:52 +000010#include <cassert>
alokp@chromium.orga19572c2012-06-15 16:30:08 +000011#include <memory>
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000012#include <vector>
13
alokp@chromium.org04d7d222012-05-16 19:24:07 +000014#include "Lexer.h"
alokp@chromium.org98d04ec2012-05-21 22:47:20 +000015#include "Macro.h"
alokp@chromium.org04d7d222012-05-16 19:24:07 +000016#include "pp_utils.h"
17
18namespace pp
19{
20
alokp@chromium.org2c958ee2012-05-17 20:35:42 +000021class Diagnostics;
Olli Etuahoe6432c82015-09-08 14:21:38 +030022struct SourceLocation;
alokp@chromium.org2c958ee2012-05-17 20:35:42 +000023
alokp@chromium.org04d7d222012-05-16 19:24:07 +000024class MacroExpander : public Lexer
25{
26 public:
Olli Etuaho1b2f1622016-03-04 15:06:51 +020027 MacroExpander(Lexer *lexer, MacroSet *macroSet, Diagnostics *diagnostics);
Corentin Walleze5a1f272015-08-21 02:58:25 +020028 ~MacroExpander() override;
alokp@chromium.org04d7d222012-05-16 19:24:07 +000029
Corentin Walleze5a1f272015-08-21 02:58:25 +020030 void lex(Token *token) override;
alokp@chromium.org04d7d222012-05-16 19:24:07 +000031
32 private:
33 PP_DISALLOW_COPY_AND_ASSIGN(MacroExpander);
alokp@chromium.org2c958ee2012-05-17 20:35:42 +000034
Zhenyao Mod526f982014-05-13 14:51:19 -070035 void getToken(Token *token);
36 void ungetToken(const Token &token);
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000037 bool isNextTokenLeftParen();
38
Zhenyao Mod526f982014-05-13 14:51:19 -070039 bool pushMacro(const Macro &macro, const Token &identifier);
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000040 void popMacro();
41
Zhenyao Mod526f982014-05-13 14:51:19 -070042 bool expandMacro(const Macro &macro,
43 const Token &identifier,
44 std::vector<Token> *replacements);
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000045
46 typedef std::vector<Token> MacroArg;
Zhenyao Mod526f982014-05-13 14:51:19 -070047 bool collectMacroArgs(const Macro &macro,
48 const Token &identifier,
Olli Etuahoe6432c82015-09-08 14:21:38 +030049 std::vector<MacroArg> *args,
50 SourceLocation *closingParenthesisLocation);
Zhenyao Mod526f982014-05-13 14:51:19 -070051 void replaceMacroParams(const Macro &macro,
52 const std::vector<MacroArg> &args,
53 std::vector<Token> *replacements);
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000054
55 struct MacroContext
56 {
Zhenyao Mod526f982014-05-13 14:51:19 -070057 const Macro *macro;
daniel@transgaming.coma16a55f2012-12-20 20:51:54 +000058 std::size_t index;
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000059 std::vector<Token> replacements;
60
Zhenyao Mod526f982014-05-13 14:51:19 -070061 MacroContext()
62 : macro(0),
63 index(0)
64 {
65 }
66 bool empty() const
67 {
68 return index == replacements.size();
69 }
70 const Token &get()
71 {
72 return replacements[index++];
73 }
74 void unget()
75 {
76 assert(index > 0);
77 --index;
78 }
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000079 };
80
Zhenyao Mod526f982014-05-13 14:51:19 -070081 Lexer *mLexer;
82 MacroSet *mMacroSet;
83 Diagnostics *mDiagnostics;
alokp@chromium.org7fc38dd2012-06-14 18:23:23 +000084
Corentin Wallez946903d2016-04-18 17:30:07 -040085 std::unique_ptr<Token> mReserveToken;
Zhenyao Mod526f982014-05-13 14:51:19 -070086 std::vector<MacroContext *> mContextStack;
alokp@chromium.org04d7d222012-05-16 19:24:07 +000087};
88
89} // namespace pp
alokp@chromium.org04d7d222012-05-16 19:24:07 +000090
Geoff Lang0a73dd82014-11-19 16:18:08 -050091#endif // COMPILER_PREPROCESSOR_MACROEXPANDER_H_