Skip to content

Commit ad7f3b9

Browse files
committed
Metafunctions have now the ability to add declarations after the class.
1 parent 4d2e31c commit ad7f3b9

File tree

4 files changed

+297
-142
lines changed

4 files changed

+297
-142
lines changed

source/parse.h

+60-8
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)