@@ -4916,6 +4916,10 @@ class parser
4916
4916
4917
4917
std::unique_ptr<translation_unit_node> parse_tree = {};
4918
4918
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
+
4919
4923
// Keep a stack of current capture groups (contracts/decls still being parsed)
4920
4924
std::vector<capture_group*> current_capture_groups = {};
4921
4925
@@ -5087,6 +5091,22 @@ class parser
5087
5091
}
5088
5092
5089
5093
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
+
5090
5110
// -----------------------------------------------------------------------
5091
5111
// parse_one_statement
5092
5112
//
@@ -5095,22 +5115,17 @@ class parser
5095
5115
//
5096
5116
// Each call parses one statement and returns its parse tree.
5097
5117
//
5098
- auto parse_one_declaration (
5118
+ auto parse_one_statement (
5099
5119
std::vector<token> const & tokens_,
5100
5120
std::deque<token>& generated_tokens_
5101
5121
)
5102
5122
-> std::unique_ptr<statement_node>
5103
5123
{
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_);
5109
5125
5110
5126
// Parse one declaration - we succeed if the parse succeeded,
5111
5127
// and there were no new errors, and all tokens were consumed
5112
5128
auto errors_size = std::ssize (errors);
5113
- pos = 0 ;
5114
5129
if (auto d = statement ();
5115
5130
d
5116
5131
&& std::ssize (errors) == errors_size
@@ -5123,6 +5138,35 @@ class parser
5123
5138
return {};
5124
5139
}
5125
5140
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
+
5126
5170
5127
5171
// -----------------------------------------------------------------------
5128
5172
// Get a set of pointers to just the declarations in the given token map section
@@ -5145,7 +5189,8 @@ class parser
5145
5189
if (decl->position ().lineno > last_line) {
5146
5190
break ;
5147
5191
}
5148
- if (decl->position ().lineno >= first_line) {
5192
+ if (decl->position ().lineno >= first_line ||
5193
+ decl->position ().lineno < 0 ) { // Add generated declarations from metafunctions
5149
5194
ret.push_back ( decl.get () );
5150
5195
}
5151
5196
}
@@ -8647,6 +8692,15 @@ class parser
8647
8692
auto n = std::make_unique<translation_unit_node>();
8648
8693
for (auto d = declaration (); d; d = declaration ()) {
8649
8694
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
+ }
8650
8704
}
8651
8705
return n;
8652
8706
}
0 commit comments