@@ -34,47 +34,49 @@ using RootContextData = SyntaxParsingContext::RootContextData;
34
34
35
35
SyntaxParsingContext::SyntaxParsingContext (SyntaxParsingContext *&CtxtHolder,
36
36
SourceFile &SF, unsigned BufferID)
37
- : RootDataOrParent(new RootContextData(SF, SF.getASTContext().Diags,
38
- SF.getASTContext().SourceMgr,
39
- BufferID)),
40
- CtxtHolder(CtxtHolder), SyntaxParsingCache(SF.SyntaxParsingCache),
41
- Arena(SF.getASTContext().getSyntaxArena()),
42
- Storage(getRootData().Storage), Offset(0 ), Mode(AccumulationMode::Root),
43
- Enabled(SF.shouldBuildSyntaxTree()) {
37
+ : RootDataOrParent(new RootContextData(
38
+ SF, SF.getASTContext().Diags, SF.getASTContext().SourceMgr, BufferID,
39
+ SF.getASTContext().getSyntaxArena(), SF.SyntaxParsingCache)),
40
+ CtxtHolder(CtxtHolder),
41
+ RootData(RootDataOrParent.get<RootContextData *>()), Offset(0 ),
42
+ Mode(AccumulationMode::Root), Enabled(SF.shouldBuildSyntaxTree()) {
44
43
CtxtHolder = this ;
45
- Storage .reserve (128 );
44
+ getStorage () .reserve (128 );
46
45
}
47
46
48
47
size_t SyntaxParsingContext::loadFromCache (size_t LexerOffset) {
49
- assert (Storage.size () == Offset && " Cannot load from cache if nodes have "
50
- " already been gathered" );
48
+ assert (getStorage ().size () == Offset &&
49
+ " Cannot load from cache if nodes have "
50
+ " already been gathered" );
51
51
assert (Mode == AccumulationMode::CreateSyntax &&
52
52
" Loading from cache is only supported for mode CreateSyntax" );
53
- if (!SyntaxParsingCache ) {
53
+ if (!getSyntaxParsingCache () ) {
54
54
// We don't have a cache, so there's nothing to look up
55
55
return 0 ;
56
56
}
57
- auto CacheLookup = SyntaxParsingCache ->lookUp (LexerOffset, SynKind);
57
+ auto CacheLookup = getSyntaxParsingCache () ->lookUp (LexerOffset, SynKind);
58
58
if (!CacheLookup) {
59
59
return 0 ;
60
60
}
61
61
Mode = AccumulationMode::LoadedFromCache;
62
62
RC<RawSyntax> RawLookup = CacheLookup->getRaw ().get ();
63
- Storage .push_back (RawLookup);
63
+ getStorage () .push_back (RawLookup);
64
64
return RawLookup->getTextLength ();
65
65
}
66
66
67
67
RC<RawSyntax>
68
68
SyntaxParsingContext::makeUnknownSyntax (SyntaxKind Kind,
69
69
ArrayRef<RC<RawSyntax>> Parts) {
70
70
assert (isUnknownKind (Kind));
71
+ SyntaxArena &Arena = getArena ();
71
72
return RawSyntax::make (Kind, Parts, SourcePresence::Present, &Arena);
72
73
}
73
74
74
75
RC<RawSyntax>
75
76
SyntaxParsingContext::createSyntaxAs (SyntaxKind Kind,
76
77
ArrayRef<RC<RawSyntax>> Parts) {
77
78
// Try to create the node of the given syntax.
79
+ SyntaxArena &Arena = getArena ();
78
80
if (auto Node = SyntaxFactory::createRaw (Kind, Parts, &Arena))
79
81
return Node;
80
82
@@ -144,10 +146,10 @@ RC<RawSyntax> SyntaxParsingContext::bridgeAs(SyntaxContextKind Kind,
144
146
145
147
// / Add RawSyntax to the parts.
146
148
void SyntaxParsingContext::addRawSyntax (RC<RawSyntax> Raw) {
147
- Storage .emplace_back (Raw);
149
+ getStorage () .emplace_back (Raw);
148
150
}
149
151
150
- SyntaxParsingContext *SyntaxParsingContext::getRoot () {
152
+ const SyntaxParsingContext *SyntaxParsingContext::getRoot () const {
151
153
auto Curr = this ;
152
154
while (!Curr->isRoot ())
153
155
Curr = Curr->getParent ();
@@ -160,6 +162,7 @@ void SyntaxParsingContext::addToken(Token &Tok, Trivia &LeadingTrivia,
160
162
if (!Enabled)
161
163
return ;
162
164
165
+ auto &Arena = getArena ();
163
166
addRawSyntax (RawSyntax::getToken (Arena, Tok.getKind (), Tok.getText (),
164
167
LeadingTrivia.Pieces ,
165
168
TrailingTrivia.Pieces ));
@@ -175,16 +178,16 @@ void SyntaxParsingContext::addSyntax(Syntax Node) {
175
178
void SyntaxParsingContext::createNodeInPlace (SyntaxKind Kind, size_t N) {
176
179
if (N == 0 ) {
177
180
if (!parserShallOmitWhenNoChildren (Kind))
178
- Storage .push_back (createSyntaxAs (Kind, {}));
181
+ getStorage () .push_back (createSyntaxAs (Kind, {}));
179
182
return ;
180
183
}
181
184
182
- auto I = Storage .end () - N;
185
+ auto I = getStorage () .end () - N;
183
186
*I = createSyntaxAs (Kind, getParts ().take_back (N));
184
187
185
188
// Remove consumed parts.
186
189
if (N != 1 )
187
- Storage .erase (I + 1 , Storage .end ());
190
+ getStorage () .erase (I + 1 , getStorage () .end ());
188
191
}
189
192
190
193
void SyntaxParsingContext::createNodeInPlace (SyntaxKind Kind) {
@@ -337,30 +340,30 @@ void SyntaxParsingContext::finalizeRoot() {
337
340
assert (isTopOfContextStack () && " some sub-contexts are not destructed" );
338
341
assert (isRoot () && " only root context can finalize the tree" );
339
342
assert (Mode == AccumulationMode::Root);
340
- finalizeSourceFile (getRootData (), getParts ());
343
+ finalizeSourceFile (* getRootData (), getParts ());
341
344
342
345
// Clear the parts because we will call this function again when destroying
343
346
// the root context.
344
- getRootData (). Storage .clear ();
347
+ getStorage () .clear ();
345
348
}
346
349
347
350
void SyntaxParsingContext::synthesize (tok Kind, StringRef Text) {
348
351
if (!Enabled)
349
352
return ;
350
353
if (Text.empty ())
351
354
Text = getTokenText (Kind);
352
- Storage .push_back (RawSyntax::missing (Kind, Text));
355
+ getStorage () .push_back (RawSyntax::missing (Kind, Text));
353
356
}
354
357
355
358
void SyntaxParsingContext::synthesize (SyntaxKind Kind) {
356
359
if (!Enabled)
357
360
return ;
358
- Storage .push_back (RawSyntax::missing (Kind));
361
+ getStorage () .push_back (RawSyntax::missing (Kind));
359
362
}
360
363
361
364
void SyntaxParsingContext::dumpStorage () const {
362
365
llvm::errs () << " ======================\n " ;
363
- for (auto Node : Storage ) {
366
+ for (auto Node : getStorage () ) {
364
367
Node->dump ();
365
368
llvm::errs () << " \n --------------\n " ;
366
369
}
@@ -380,6 +383,8 @@ SyntaxParsingContext::~SyntaxParsingContext() {
380
383
if (!Enabled)
381
384
return ;
382
385
386
+ auto &Storage = getStorage ();
387
+
383
388
switch (Mode) {
384
389
// Create specified Syntax node from the parts and add it to the parent.
385
390
case AccumulationMode::CreateSyntax:
0 commit comments