@@ -4916,6 +4916,10 @@ class parser
49164916
49174917 std::unique_ptr<translation_unit_node> parse_tree = {};
49184918
4919+ // Store declarations generated in a metafunction. Append them after the declaration for the meta function has been
4920+ // finished.
4921+ std::vector<std::unique_ptr<declaration_node>> metafunction_declarations = {};
4922+
49194923 // Keep a stack of current capture groups (contracts/decls still being parsed)
49204924 std::vector<capture_group*> current_capture_groups = {};
49214925
@@ -5087,6 +5091,22 @@ class parser
50875091 }
50885092
50895093
5094+ auto parse_one_prepare (
5095+ std::vector<token> const & tokens_,
5096+ std::deque<token>& generated_tokens_
5097+ )
5098+ -> void
5099+ {
5100+ parse_kind = " source string during code generation" ;
5101+
5102+ // Set per-parse state for the duration of this call
5103+ tokens = &tokens_;
5104+ generated_tokens = &generated_tokens_;
5105+
5106+ pos = 0 ;
5107+ }
5108+
5109+
50905110 // -----------------------------------------------------------------------
50915111 // parse_one_statement
50925112 //
@@ -5095,22 +5115,17 @@ class parser
50955115 //
50965116 // Each call parses one statement and returns its parse tree.
50975117 //
5098- auto parse_one_declaration (
5118+ auto parse_one_statement (
50995119 std::vector<token> const & tokens_,
51005120 std::deque<token>& generated_tokens_
51015121 )
51025122 -> std::unique_ptr<statement_node>
51035123 {
5104- parse_kind = " source string during code generation" ;
5105-
5106- // Set per-parse state for the duration of this call
5107- tokens = &tokens_;
5108- generated_tokens = &generated_tokens_;
5124+ parse_one_prepare (tokens_, generated_tokens_);
51095125
51105126 // Parse one declaration - we succeed if the parse succeeded,
51115127 // and there were no new errors, and all tokens were consumed
51125128 auto errors_size = std::ssize (errors);
5113- pos = 0 ;
51145129 if (auto d = statement ();
51155130 d
51165131 && std::ssize (errors) == errors_size
@@ -5123,6 +5138,35 @@ class parser
51235138 return {};
51245139 }
51255140
5141+ // -----------------------------------------------------------------------
5142+ // parse_one_declaration
5143+ //
5144+ // tokens input tokens for this section of Cpp2 source code
5145+ // generated_tokens a shared place to store generated tokens
5146+ //
5147+ // Each call parses one declaration and returns its parse tree.
5148+ //
5149+ auto parse_one_declaration (
5150+ std::vector<token> const & tokens_,
5151+ std::deque<token>& generated_tokens_
5152+ )
5153+ -> std::unique_ptr<declaration_node>
5154+ {
5155+ parse_one_prepare (tokens_, generated_tokens_);
5156+
5157+ auto errors_size = std::ssize (errors);
5158+ if (auto d = declaration ();
5159+ d
5160+ && std::ssize (errors) == errors_size
5161+ && done ()
5162+ )
5163+ {
5164+ return d;
5165+ }
5166+
5167+ return {};
5168+ }
5169+
51265170
51275171 // -----------------------------------------------------------------------
51285172 // Get a set of pointers to just the declarations in the given token map section
@@ -5145,7 +5189,8 @@ class parser
51455189 if (decl->position ().lineno > last_line) {
51465190 break ;
51475191 }
5148- if (decl->position ().lineno >= first_line) {
5192+ if (decl->position ().lineno >= first_line ||
5193+ decl->position ().lineno < 0 ) { // Add generated declarations from metafunctions
51495194 ret.push_back ( decl.get () );
51505195 }
51515196 }
@@ -8647,6 +8692,15 @@ class parser
86478692 auto n = std::make_unique<translation_unit_node>();
86488693 for (auto d = declaration (); d; d = declaration ()) {
86498694 n->declarations .push_back ( std::move (d) );
8695+
8696+ // Add declarations generated by metafunctions.
8697+ if (!metafunction_declarations.empty ()) {
8698+ for (auto & md : metafunction_declarations) {
8699+ n->declarations .push_back ( std::move (md));
8700+ }
8701+
8702+ metafunction_declarations.clear ();
8703+ }
86508704 }
86518705 return n;
86528706 }
0 commit comments