Skip to content

Commit dfb1113

Browse files
committed
Metafunctions have now the ability to add declarations after the class.
1 parent 083c8a0 commit dfb1113

File tree

4 files changed

+300
-142
lines changed

4 files changed

+300
-142
lines changed

source/parse.h

Lines changed: 62 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)