|
20 | 20 | #include "swift/Parse/ParsedRawSyntaxNode.h"
|
21 | 21 | #include "swift/Parse/ParsedTrivia.h"
|
22 | 22 | #include "swift/Parse/SyntaxParseActions.h"
|
| 23 | +#include "swift/Parse/SyntaxParsingContext.h" |
23 | 24 | #include "swift/Parse/Token.h"
|
24 | 25 | #include "swift/Syntax/SyntaxKind.h"
|
25 | 26 |
|
@@ -112,6 +113,59 @@ ParsedRawSyntaxRecorder::recordEmptyRawSyntaxCollection(SyntaxKind kind,
|
112 | 113 | return ParsedRawSyntaxNode{kind, tok::unknown, range, n};
|
113 | 114 | }
|
114 | 115 |
|
| 116 | +/// Create a deferred layout node. |
| 117 | +ParsedRawSyntaxNode ParsedRawSyntaxRecorder::makeDeferred( |
| 118 | + syntax::SyntaxKind k, MutableArrayRef<ParsedRawSyntaxNode> deferredNodes, |
| 119 | + SyntaxParsingContext &ctx) { |
| 120 | + CharSourceRange range; |
| 121 | + if (deferredNodes.empty()) { |
| 122 | + return ParsedRawSyntaxNode(k, range, {}); |
| 123 | + } |
| 124 | + ParsedRawSyntaxNode *newPtr = |
| 125 | + ctx.getScratchAlloc().Allocate<ParsedRawSyntaxNode>(deferredNodes.size()); |
| 126 | + |
| 127 | +#ifndef NDEBUG |
| 128 | + ParsedRawSyntaxRecorder::verifyElementRanges(deferredNodes); |
| 129 | +#endif |
| 130 | + auto ptr = newPtr; |
| 131 | + for (auto &node : deferredNodes) { |
| 132 | + // Cached range. |
| 133 | + if (!node.isNull() && !node.isMissing()) { |
| 134 | + auto nodeRange = node.getDeferredRange(); |
| 135 | + if (nodeRange.isValid()) { |
| 136 | + if (range.isInvalid()) |
| 137 | + range = nodeRange; |
| 138 | + else |
| 139 | + range.widen(nodeRange); |
| 140 | + } |
| 141 | + } |
| 142 | + |
| 143 | + // uninitialized move; |
| 144 | + ::new (static_cast<void *>(ptr++)) ParsedRawSyntaxNode(std::move(node)); |
| 145 | + } |
| 146 | + return ParsedRawSyntaxNode( |
| 147 | + k, range, llvm::makeMutableArrayRef(newPtr, deferredNodes.size())); |
| 148 | +} |
| 149 | + |
| 150 | +/// Create a deferred token node. |
| 151 | +ParsedRawSyntaxNode |
| 152 | +ParsedRawSyntaxRecorder::makeDeferred(Token tok, StringRef leadingTrivia, |
| 153 | + StringRef trailingTrivia) { |
| 154 | + CharSourceRange tokRange = tok.getRange(); |
| 155 | + return ParsedRawSyntaxNode(tok.getKind(), tokRange.getStart(), |
| 156 | + tokRange.getByteLength(), leadingTrivia, |
| 157 | + trailingTrivia); |
| 158 | +} |
| 159 | + |
| 160 | +ParsedRawSyntaxNode |
| 161 | +ParsedRawSyntaxRecorder::makeDeferredMissing(tok tokKind, SourceLoc loc) { |
| 162 | + auto raw = ParsedRawSyntaxNode(tokKind, loc, /*tokLength=*/0, |
| 163 | + /*leadingTrivia=*/StringRef(), |
| 164 | + /*trailingTrivia=*/StringRef()); |
| 165 | + raw.IsMissing = true; |
| 166 | + return raw; |
| 167 | +} |
| 168 | + |
115 | 169 | ParsedRawSyntaxNode
|
116 | 170 | ParsedRawSyntaxRecorder::lookupNode(size_t lexerOffset, SourceLoc loc,
|
117 | 171 | SyntaxKind kind) {
|
|
0 commit comments