@@ -4981,6 +4981,10 @@ class parser
49814981
49824982 std::unique_ptr<translation_unit_node> parse_tree = {};
49834983
4984+ // Store declarations generated in a metafunction. Append them after the declaration for the meta function has been
4985+ // finished.
4986+ std::vector<std::unique_ptr<declaration_node>> metafunction_declarations = {};
4987+
49844988 // Keep a stack of current capture groups (contracts/decls still being parsed)
49854989 std::vector<capture_group*> current_capture_groups = {};
49864990
@@ -5152,6 +5156,22 @@ class parser
51525156 }
51535157
51545158
5159+ auto parse_one_prepare (
5160+ std::vector<token> const & tokens_,
5161+ std::deque<token>& generated_tokens_
5162+ )
5163+ -> void
5164+ {
5165+ parse_kind = " source string during code generation" ;
5166+
5167+ // Set per-parse state for the duration of this call
5168+ tokens = &tokens_;
5169+ generated_tokens = &generated_tokens_;
5170+
5171+ pos = 0 ;
5172+ }
5173+
5174+
51555175 // -----------------------------------------------------------------------
51565176 // parse_one_statement
51575177 //
@@ -5160,22 +5180,17 @@ class parser
51605180 //
51615181 // Each call parses one statement and returns its parse tree.
51625182 //
5163- auto parse_one_declaration (
5183+ auto parse_one_statement (
51645184 std::vector<token> const & tokens_,
51655185 std::deque<token>& generated_tokens_
51665186 )
51675187 -> std::unique_ptr<statement_node>
51685188 {
5169- parse_kind = " source string during code generation" ;
5170-
5171- // Set per-parse state for the duration of this call
5172- tokens = &tokens_;
5173- generated_tokens = &generated_tokens_;
5189+ parse_one_prepare (tokens_, generated_tokens_);
51745190
51755191 // Parse one declaration - we succeed if the parse succeeded,
51765192 // and there were no new errors, and all tokens were consumed
51775193 auto errors_size = std::ssize (errors);
5178- pos = 0 ;
51795194 if (auto d = statement ();
51805195 d
51815196 && std::ssize (errors) == errors_size
@@ -5188,6 +5203,35 @@ class parser
51885203 return {};
51895204 }
51905205
5206+ // -----------------------------------------------------------------------
5207+ // parse_one_declaration
5208+ //
5209+ // tokens input tokens for this section of Cpp2 source code
5210+ // generated_tokens a shared place to store generated tokens
5211+ //
5212+ // Each call parses one declaration and returns its parse tree.
5213+ //
5214+ auto parse_one_declaration (
5215+ std::vector<token> const & tokens_,
5216+ std::deque<token>& generated_tokens_
5217+ )
5218+ -> std::unique_ptr<declaration_node>
5219+ {
5220+ parse_one_prepare (tokens_, generated_tokens_);
5221+
5222+ auto errors_size = std::ssize (errors);
5223+ if (auto d = declaration ();
5224+ d
5225+ && std::ssize (errors) == errors_size
5226+ && done ()
5227+ )
5228+ {
5229+ return d;
5230+ }
5231+
5232+ return {};
5233+ }
5234+
51915235
51925236 // -----------------------------------------------------------------------
51935237 // Get a set of pointers to just the declarations in the given token map section
@@ -5210,7 +5254,8 @@ class parser
52105254 if (decl->position ().lineno > last_line) {
52115255 break ;
52125256 }
5213- if (decl->position ().lineno >= first_line) {
5257+ if (decl->position ().lineno >= first_line ||
5258+ decl->position ().lineno < 0 ) { // Add generated declarations from metafunctions
52145259 ret.push_back ( decl.get () );
52155260 }
52165261 }
@@ -8720,6 +8765,13 @@ class parser
87208765 auto n = std::make_unique<translation_unit_node>();
87218766 for (auto d = declaration (); d; d = declaration ()) {
87228767 n->declarations .push_back ( std::move (d) );
8768+
8769+ // Add declarations generated by metafunctions.
8770+ for (auto & md : metafunction_declarations) {
8771+ n->declarations .push_back ( std::move (md));
8772+ }
8773+
8774+ metafunction_declarations.clear ();
87238775 }
87248776 return n;
87258777 }
0 commit comments