@@ -150,8 +150,7 @@ typedef unsigned SyntaxNodeId;
150
150
// /
151
151
// / This is implementation detail - do not expose it in public API.
152
152
class RawSyntax final
153
- : private llvm::TrailingObjects<RawSyntax, RC<RawSyntax>, OwnedString,
154
- TriviaPiece> {
153
+ : private llvm::TrailingObjects<RawSyntax, RC<RawSyntax>, OwnedString> {
155
154
friend TrailingObjects;
156
155
157
156
// / The ID that shall be used for the next node that is created and does not
@@ -198,10 +197,8 @@ class RawSyntax final
198
197
uint64_t : bitmax(NumRawSyntaxBits, 64 ); // align to 16 bits
199
198
// / The kind of token this "token" node represents.
200
199
unsigned TokenKind : 16 ;
201
- // / Number of leading trivia pieces.
202
- unsigned NumLeadingTrivia : 16 ;
203
- // / Number of trailing trivia pieces.
204
- unsigned NumTrailingTrivia : 16 ;
200
+ StringRef LeadingTrivia;
201
+ StringRef TrailingTrivia;
205
202
} Token;
206
203
} Bits;
207
204
@@ -211,11 +208,6 @@ class RawSyntax final
211
208
size_t numTrailingObjects (OverloadToken<OwnedString>) const {
212
209
return isToken () ? 1 : 0 ;
213
210
}
214
- size_t numTrailingObjects (OverloadToken<TriviaPiece>) const {
215
- return isToken ()
216
- ? Bits.Token .NumLeadingTrivia + Bits.Token .NumTrailingTrivia
217
- : 0 ;
218
- }
219
211
220
212
// / Constructor for creating layout nodes.
221
213
// / If the node has been allocated inside the bump allocator of a
@@ -232,9 +224,9 @@ class RawSyntax final
232
224
// / If \p NodeId is \c None, the next free NodeId is used, if it is passed,
233
225
// / the caller needs to assure that the NodeId has not been used yet.
234
226
RawSyntax (tok TokKind, OwnedString Text, size_t TextLength,
235
- ArrayRef<TriviaPiece> LeadingTrivia,
236
- ArrayRef<TriviaPiece> TrailingTrivia, SourcePresence Presence ,
237
- const RC<SyntaxArena> &Arena, llvm::Optional<SyntaxNodeId> NodeId);
227
+ StringRef LeadingTrivia, StringRef TrailingTrivia ,
228
+ SourcePresence Presence, const RC<SyntaxArena> &Arena ,
229
+ llvm::Optional<SyntaxNodeId> NodeId);
238
230
239
231
// / Compute the node's text length by summing up the length of its childern
240
232
size_t computeTextLength () {
@@ -295,27 +287,22 @@ class RawSyntax final
295
287
296
288
// / Make a raw "token" syntax node.
297
289
static RC<RawSyntax> make (tok TokKind, OwnedString Text, size_t TextLength,
298
- ArrayRef<TriviaPiece> LeadingTrivia,
299
- ArrayRef<TriviaPiece> TrailingTrivia,
290
+ StringRef LeadingTrivia, StringRef TrailingTrivia,
300
291
SourcePresence Presence,
301
292
const RC<SyntaxArena> &Arena = SyntaxArena::make(),
302
293
llvm::Optional<SyntaxNodeId> NodeId = llvm::None);
303
294
304
295
// / Make a raw "token" syntax node that was allocated in \p Arena.
305
- static RC<RawSyntax> makeAndCalcLength (
306
- tok TokKind, OwnedString Text, ArrayRef<TriviaPiece> LeadingTrivia,
307
- ArrayRef<TriviaPiece> TrailingTrivia, SourcePresence Presence,
308
- const RC<SyntaxArena> &Arena = SyntaxArena::make(),
309
- llvm::Optional<SyntaxNodeId> NodeId = llvm::None) {
296
+ static RC<RawSyntax>
297
+ makeAndCalcLength ( tok TokKind, OwnedString Text, StringRef LeadingTrivia,
298
+ StringRef TrailingTrivia, SourcePresence Presence,
299
+ const RC<SyntaxArena> &Arena = SyntaxArena::make(),
300
+ llvm::Optional<SyntaxNodeId> NodeId = llvm::None) {
310
301
size_t TextLength = 0 ;
311
302
if (Presence != SourcePresence::Missing) {
312
- for (auto Trivia : LeadingTrivia) {
313
- TextLength += Trivia.getTextLength ();
314
- }
303
+ TextLength += LeadingTrivia.size ();
315
304
TextLength += Text.size ();
316
- for (auto Trivia : TrailingTrivia) {
317
- TextLength += Trivia.getTextLength ();
318
- }
305
+ TextLength += TrailingTrivia.size ();
319
306
}
320
307
return make (TokKind, Text, TextLength, LeadingTrivia, TrailingTrivia,
321
308
Presence, Arena, NodeId);
@@ -414,18 +401,28 @@ class RawSyntax final
414
401
// / disappear when the syntax node gets freed.
415
402
StringRef getTokenText () const { return getOwnedTokenText ().str (); }
416
403
417
- // / Return the leading trivia list of the token.
418
- ArrayRef<TriviaPiece> getLeadingTrivia () const {
404
+ // / Return the unparsed leading trivia of the token.
405
+ StringRef getLeadingTrivia () const {
419
406
assert (isToken ());
420
- return {getTrailingObjects<TriviaPiece>(), Bits.Token .NumLeadingTrivia } ;
407
+ return Bits.Token .LeadingTrivia ;
421
408
}
422
- // / Return the trailing trivia list of the token.
423
- ArrayRef<TriviaPiece> getTrailingTrivia () const {
409
+
410
+ // / Return the unparsed trailing trivia of the token.
411
+ StringRef getTrailingTrivia () const {
424
412
assert (isToken ());
425
- return {getTrailingObjects<TriviaPiece>() + Bits.Token .NumLeadingTrivia ,
426
- Bits.Token .NumTrailingTrivia };
413
+ return Bits.Token .TrailingTrivia ;
427
414
}
428
415
416
+ // / Return pieces that make up the leading trivia of the token.
417
+ // / Note that this triggers trivia parsing which may be expensive. If the
418
+ // / trivia pieces are required multiple times, consider caching them.
419
+ Trivia getLeadingTriviaPieces () const ;
420
+
421
+ // / Return the trailing trivia list of the token.
422
+ // / Note that this triggers trivia parsing which may be expensive. If the
423
+ // / trivia pieces are required multiple times, consider caching them.
424
+ Trivia getTrailingTriviaPieces () const ;
425
+
429
426
// / Return \c true if this is the given kind of token.
430
427
bool isToken (tok K) const { return isToken () && getTokenKind () == K; }
431
428
@@ -436,30 +433,20 @@ class RawSyntax final
436
433
437
434
// / Return a new token like this one, but with the given leading
438
435
// / trivia instead.
439
- RC<RawSyntax>
440
- withLeadingTrivia (ArrayRef<TriviaPiece> NewLeadingTrivia) const {
436
+ RC<RawSyntax> withLeadingTrivia (StringRef NewLeadingTrivia) const {
441
437
return makeAndCalcLength (getTokenKind (), getOwnedTokenText (),
442
438
NewLeadingTrivia, getTrailingTrivia (),
443
439
getPresence ());
444
440
}
445
441
446
- RC<RawSyntax> withLeadingTrivia (Trivia NewLeadingTrivia) const {
447
- return withLeadingTrivia (NewLeadingTrivia.Pieces );
448
- }
449
-
450
442
// / Return a new token like this one, but with the given trailing
451
443
// / trivia instead.
452
- RC<RawSyntax>
453
- withTrailingTrivia (ArrayRef<TriviaPiece> NewTrailingTrivia) const {
444
+ RC<RawSyntax> withTrailingTrivia (StringRef NewTrailingTrivia) const {
454
445
return makeAndCalcLength (getTokenKind (), getOwnedTokenText (),
455
446
getLeadingTrivia (), NewTrailingTrivia,
456
447
getPresence ());
457
448
}
458
449
459
- RC<RawSyntax> withTrailingTrivia (Trivia NewTrailingTrivia) const {
460
- return withTrailingTrivia (NewTrailingTrivia.Pieces );
461
- }
462
-
463
450
// / @}
464
451
465
452
// / \name Getter routines for "layout" nodes.
@@ -503,21 +490,9 @@ class RawSyntax final
503
490
504
491
// / @}
505
492
506
- size_t getLeadingTriviaLength () {
507
- size_t Length = 0 ;
508
- for (auto Trivia : getLeadingTrivia ()) {
509
- Length += Trivia.getTextLength ();
510
- }
511
- return Length;
512
- }
493
+ size_t getLeadingTriviaLength () const { return getLeadingTrivia ().size (); }
513
494
514
- size_t getTrailingTriviaLength () {
515
- size_t Length = 0 ;
516
- for (auto Trivia : getTrailingTrivia ()) {
517
- Length += Trivia.getTextLength ();
518
- }
519
- return Length;
520
- }
495
+ size_t getTrailingTriviaLength () const { return getTrailingTrivia ().size (); }
521
496
522
497
// / Print this piece of syntax recursively.
523
498
void print (llvm::raw_ostream &OS, SyntaxPrintOptions Opts) const ;
@@ -529,8 +504,7 @@ class RawSyntax final
529
504
void dump (llvm::raw_ostream &OS, unsigned Indent = 0 ) const ;
530
505
531
506
static void Profile (llvm::FoldingSetNodeID &ID, tok TokKind, OwnedString Text,
532
- ArrayRef<TriviaPiece> LeadingTrivia,
533
- ArrayRef<TriviaPiece> TrailingTrivia);
507
+ StringRef LeadingTrivia, StringRef TrailingTrivia);
534
508
};
535
509
536
510
} // end namespace syntax
0 commit comments