@@ -52,6 +52,7 @@ class ParsedRawSyntaxNode {
52
52
};
53
53
struct DeferredLayoutNode {
54
54
MutableArrayRef<ParsedRawSyntaxNode> Children;
55
+ CharSourceRange Range;
55
56
};
56
57
struct DeferredTokenNode {
57
58
const ParsedTriviaPiece *TriviaPieces;
@@ -72,9 +73,9 @@ class ParsedRawSyntaxNode {
72
73
// / Primary used for capturing a deferred missing token.
73
74
bool IsMissing = false ;
74
75
75
- ParsedRawSyntaxNode (syntax::SyntaxKind k,
76
+ ParsedRawSyntaxNode (syntax::SyntaxKind k, CharSourceRange r,
76
77
MutableArrayRef<ParsedRawSyntaxNode> deferredNodes)
77
- : DeferredLayout({deferredNodes}),
78
+ : DeferredLayout({deferredNodes, r }),
78
79
SynKind (uint16_t (k)), TokKind(uint16_t (tok::unknown)),
79
80
DK (DataKind::DeferredLayout) {
80
81
assert (getKind () == k && " Syntax kind with too large value!" );
@@ -109,10 +110,12 @@ class ParsedRawSyntaxNode {
109
110
}
110
111
111
112
ParsedRawSyntaxNode (syntax::SyntaxKind k, tok tokKind,
112
- CharSourceRange r, OpaqueSyntaxNode n)
113
+ CharSourceRange r, OpaqueSyntaxNode n,
114
+ bool IsMissing = false )
113
115
: RecordedData{n, r},
114
116
SynKind (uint16_t (k)), TokKind(uint16_t (tokKind)),
115
- DK (DataKind::Recorded) {
117
+ DK (DataKind::Recorded),
118
+ IsMissing (IsMissing) {
116
119
assert (getKind () == k && " Syntax kind with too large value!" );
117
120
assert (getTokenKind () == tokKind && " Token kind with too large value!" );
118
121
}
@@ -209,9 +212,20 @@ class ParsedRawSyntaxNode {
209
212
return copy;
210
213
}
211
214
215
+ CharSourceRange getDeferredRange () const {
216
+ switch (DK) {
217
+ case DataKind::DeferredLayout:
218
+ return getDeferredLayoutRange ();
219
+ case DataKind::DeferredToken:
220
+ return getDeferredTokenRangeWithTrivia ();
221
+ default :
222
+ llvm_unreachable (" node not deferred" );
223
+ }
224
+ }
225
+
212
226
// Recorded Data ===========================================================//
213
227
214
- CharSourceRange getRange () const {
228
+ CharSourceRange getRecordedRange () const {
215
229
assert (isRecorded ());
216
230
return RecordedData.Range ;
217
231
}
@@ -228,6 +242,10 @@ class ParsedRawSyntaxNode {
228
242
229
243
// Deferred Layout Data ====================================================//
230
244
245
+ CharSourceRange getDeferredLayoutRange () const {
246
+ assert (DK == DataKind::DeferredLayout);
247
+ return DeferredLayout.Range ;
248
+ }
231
249
ArrayRef<ParsedRawSyntaxNode> getDeferredChildren () const {
232
250
assert (DK == DataKind::DeferredLayout);
233
251
return DeferredLayout.Children ;
@@ -259,6 +277,19 @@ class ParsedRawSyntaxNode {
259
277
260
278
// Deferred Token Data =====================================================//
261
279
280
+ CharSourceRange getDeferredTokenRangeWithTrivia () const {
281
+ assert (DK == DataKind::DeferredToken);
282
+ auto leadTriviaPieces = getDeferredLeadingTriviaPieces ();
283
+ auto trailTriviaPieces = getDeferredTrailingTriviaPieces ();
284
+
285
+ auto leadTriviaLen = ParsedTriviaPiece::getTotalLength (leadTriviaPieces);
286
+ auto trailTriviaLen = ParsedTriviaPiece::getTotalLength (trailTriviaPieces);
287
+
288
+ SourceLoc begin = DeferredToken.TokLoc .getAdvancedLoc (-leadTriviaLen);
289
+ unsigned len = leadTriviaLen + DeferredToken.TokLength + trailTriviaLen;
290
+
291
+ return CharSourceRange{begin, len};
292
+ }
262
293
CharSourceRange getDeferredTokenRange () const {
263
294
assert (DK == DataKind::DeferredToken);
264
295
return CharSourceRange{DeferredToken.TokLoc , DeferredToken.TokLength };
0 commit comments