[libSyntax] Create deferred nodes in the ParsedRawSyntaxRecorder

This is a multi-commit effort to push the responsibility of deferred
node handling to the SyntaxParseActions which have more detailed
knowledge of their requirements on deferred nodes and might perform
additional optimisations. For example, the SyntaxTreeCreator can always
create RawSyntax nodes (even for deferred nodes) and decide to simply
not use them, should the deferred nodes not get recorded.
This commit is contained in:
Alex Hoppen
2021-02-26 12:54:08 +01:00
parent 68877f987f
commit ef485d405e
7 changed files with 84 additions and 77 deletions

View File

@@ -67,8 +67,8 @@ Parsed${node.name}Builder::record() {
Parsed${node.name}
Parsed${node.name}Builder::makeDeferred() {
finishLayout(/*deferred=*/true);
auto raw = ParsedRawSyntaxNode::makeDeferred(SyntaxKind::${node.syntax_kind},
Layout, SPCtx);
auto raw = SPCtx.getRecorder().makeDeferred(SyntaxKind::${node.syntax_kind},
Layout, SPCtx);
return Parsed${node.name}(std::move(raw));
}
@@ -91,7 +91,7 @@ void Parsed${node.name}Builder::finishLayout(bool deferred) {
% if child_elt:
if (!${child_elt_name}s.empty()) {
if (deferred) {
Layout[${idx}] = ParsedRawSyntaxNode::makeDeferred(SyntaxKind::${child_node.syntax_kind},
Layout[${idx}] = Rec.makeDeferred(SyntaxKind::${child_node.syntax_kind},
${child_elt_name}s, SPCtx);
} else {
Layout[${idx}] = Rec.recordRawSyntax(SyntaxKind::${child_node.syntax_kind}, ${child_elt_name}s);
@@ -104,13 +104,13 @@ void Parsed${node.name}Builder::finishLayout(bool deferred) {
% token = child.main_token()
% tok_kind = token.kind if token else "unknown"
if (deferred) {
Layout[${idx}] = ParsedRawSyntaxNode::makeDeferredMissing(tok::${tok_kind}, SourceLoc());
Layout[${idx}] = Rec.makeDeferredMissing(tok::${tok_kind}, SourceLoc());
} else {
Layout[${idx}] = Rec.recordMissingToken(tok::${tok_kind}, SourceLoc());
}
% elif child_elt:
if (deferred) {
Layout[${idx}] = ParsedRawSyntaxNode::makeDeferred(SyntaxKind::${child_node.syntax_kind}, {}, SPCtx);
Layout[${idx}] = Rec.makeDeferred(SyntaxKind::${child_node.syntax_kind}, {}, SPCtx);
} else {
Layout[${idx}] = Rec.recordRawSyntax(SyntaxKind::${child_node.syntax_kind}, {});
}