[libSyntax] Store Range of ParsedRawSyntaxNode in dedicated field

Essentially all ParsedRawSyntaxNode types have a range associated with
them, so let's just store it in a dedicated field with a common getter.

Additionally, this cleans up the recorded storage to just contain an
OpaqueSyntaxNode. When deferred nodes are being handled by
SyntaxParseActions, we can use this OpaqueNode storage to store either
recorded or deferred node data, which is left to be interpreted by the
SyntaxParseAction.
This commit is contained in:
Alex Hoppen
2021-02-26 14:26:24 +01:00
parent ffaf8679c0
commit 7be748dbda
3 changed files with 24 additions and 52 deletions

View File

@@ -85,11 +85,11 @@ ParsedRawSyntaxRecorder::recordRawSyntax(SyntaxKind kind,
if (subnode.isNull()) {
subnodes.push_back(nullptr);
} else if (subnode.isRecorded()) {
localRange = subnode.getRecordedRange();
localRange = subnode.getRange();
subnodes.push_back(subnode.takeOpaqueNode());
} else {
auto recorded = getRecordedNode(subnode.copyDeferred(), *this);
localRange = recorded.getRecordedRange();
localRange = recorded.getRange();
subnodes.push_back(recorded.takeOpaqueNode());
}
@@ -131,7 +131,7 @@ ParsedRawSyntaxNode ParsedRawSyntaxRecorder::makeDeferred(
for (auto &node : deferredNodes) {
// Cached range.
if (!node.isNull() && !node.isMissing()) {
auto nodeRange = node.getDeferredRange();
auto nodeRange = node.getRange();
if (nodeRange.isValid()) {
if (range.isInvalid())
range = nodeRange;
@@ -185,9 +185,7 @@ void ParsedRawSyntaxRecorder::verifyElementRanges(ArrayRef<ParsedRawSyntaxNode>
for (const auto &elem: elements) {
if (elem.isMissing() || elem.isNull())
continue;
CharSourceRange range = elem.isRecorded()
? elem.getRecordedRange()
: elem.getDeferredRange();
CharSourceRange range = elem.getRange();
if (range.isValid()) {
assert((prevEndLoc.isInvalid() || range.getStart() == prevEndLoc)
&& "Non-contiguous child ranges?");