@@ -52,6 +52,7 @@ class ParsedRawSyntaxNode {
5252 };
5353 struct DeferredLayoutNode {
5454 MutableArrayRef<ParsedRawSyntaxNode> Children;
55+ CharSourceRange Range;
5556 };
5657 struct DeferredTokenNode {
5758 const ParsedTriviaPiece *TriviaPieces;
@@ -72,9 +73,9 @@ class ParsedRawSyntaxNode {
7273 // / Primary used for capturing a deferred missing token.
7374 bool IsMissing = false ;
7475
75- ParsedRawSyntaxNode (syntax::SyntaxKind k,
76+ ParsedRawSyntaxNode (syntax::SyntaxKind k, CharSourceRange r,
7677 MutableArrayRef<ParsedRawSyntaxNode> deferredNodes)
77- : DeferredLayout({deferredNodes}),
78+ : DeferredLayout({deferredNodes, r }),
7879 SynKind (uint16_t (k)), TokKind(uint16_t (tok::unknown)),
7980 DK (DataKind::DeferredLayout) {
8081 assert (getKind () == k && " Syntax kind with too large value!" );
@@ -109,10 +110,12 @@ class ParsedRawSyntaxNode {
109110 }
110111
111112 ParsedRawSyntaxNode (syntax::SyntaxKind k, tok tokKind,
112- CharSourceRange r, OpaqueSyntaxNode n)
113+ CharSourceRange r, OpaqueSyntaxNode n,
114+ bool IsMissing = false )
113115 : RecordedData{n, r},
114116 SynKind (uint16_t (k)), TokKind(uint16_t (tokKind)),
115- DK (DataKind::Recorded) {
117+ DK (DataKind::Recorded),
118+ IsMissing (IsMissing) {
116119 assert (getKind () == k && " Syntax kind with too large value!" );
117120 assert (getTokenKind () == tokKind && " Token kind with too large value!" );
118121 }
@@ -209,9 +212,20 @@ class ParsedRawSyntaxNode {
209212 return copy;
210213 }
211214
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+
212226 // Recorded Data ===========================================================//
213227
214- CharSourceRange getRange () const {
228+ CharSourceRange getRecordedRange () const {
215229 assert (isRecorded ());
216230 return RecordedData.Range ;
217231 }
@@ -228,6 +242,10 @@ class ParsedRawSyntaxNode {
228242
229243 // Deferred Layout Data ====================================================//
230244
245+ CharSourceRange getDeferredLayoutRange () const {
246+ assert (DK == DataKind::DeferredLayout);
247+ return DeferredLayout.Range ;
248+ }
231249 ArrayRef<ParsedRawSyntaxNode> getDeferredChildren () const {
232250 assert (DK == DataKind::DeferredLayout);
233251 return DeferredLayout.Children ;
@@ -259,6 +277,19 @@ class ParsedRawSyntaxNode {
259277
260278 // Deferred Token Data =====================================================//
261279
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+ }
262293 CharSourceRange getDeferredTokenRange () const {
263294 assert (DK == DataKind::DeferredToken);
264295 return CharSourceRange{DeferredToken.TokLoc , DeferredToken.TokLength };
0 commit comments