[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

@@ -98,7 +98,8 @@ ParsedSyntaxRecorder::record${node.syntax_kind}(MutableArrayRef<ParsedRawSyntaxN
Parsed${node.name}
ParsedSyntaxRecorder::defer${node.syntax_kind}(MutableArrayRef<ParsedRawSyntaxNode> layout, SyntaxParsingContext &SPCtx) {
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));
}
@@ -132,8 +133,8 @@ Parsed${node.name}
ParsedSyntaxRecorder::defer${node.syntax_kind}(
MutableArrayRef<ParsedRawSyntaxNode> layout,
SyntaxParsingContext &SPCtx) {
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));
}
@@ -157,7 +158,8 @@ ParsedSyntaxRecorder::makeBlank${node.syntax_kind}(SourceLoc loc,
ParsedRawSyntaxNode raw;
if (SPCtx.shouldDefer()) {
// FIXME: 'loc' is not preserved when capturing a deferred layout.
raw = ParsedRawSyntaxNode::makeDeferred(SyntaxKind::${node.syntax_kind}, {}, SPCtx);
raw = SPCtx.getRecorder().makeDeferred(SyntaxKind::${node.syntax_kind},
{}, SPCtx);
} else {
raw = SPCtx.getRecorder().recordEmptyRawSyntaxCollection(SyntaxKind::${node.syntax_kind}, loc);
}