@@ -34,47 +34,49 @@ using RootContextData = SyntaxParsingContext::RootContextData;
3434
3535SyntaxParsingContext::SyntaxParsingContext (SyntaxParsingContext *&CtxtHolder,
3636 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()) {
4443 CtxtHolder = this ;
45- Storage .reserve (128 );
44+ getStorage () .reserve (128 );
4645}
4746
4847size_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" );
5151 assert (Mode == AccumulationMode::CreateSyntax &&
5252 " Loading from cache is only supported for mode CreateSyntax" );
53- if (!SyntaxParsingCache ) {
53+ if (!getSyntaxParsingCache () ) {
5454 // We don't have a cache, so there's nothing to look up
5555 return 0 ;
5656 }
57- auto CacheLookup = SyntaxParsingCache ->lookUp (LexerOffset, SynKind);
57+ auto CacheLookup = getSyntaxParsingCache () ->lookUp (LexerOffset, SynKind);
5858 if (!CacheLookup) {
5959 return 0 ;
6060 }
6161 Mode = AccumulationMode::LoadedFromCache;
6262 RC<RawSyntax> RawLookup = CacheLookup->getRaw ().get ();
63- Storage .push_back (RawLookup);
63+ getStorage () .push_back (RawLookup);
6464 return RawLookup->getTextLength ();
6565}
6666
6767RC<RawSyntax>
6868SyntaxParsingContext::makeUnknownSyntax (SyntaxKind Kind,
6969 ArrayRef<RC<RawSyntax>> Parts) {
7070 assert (isUnknownKind (Kind));
71+ SyntaxArena &Arena = getArena ();
7172 return RawSyntax::make (Kind, Parts, SourcePresence::Present, &Arena);
7273}
7374
7475RC<RawSyntax>
7576SyntaxParsingContext::createSyntaxAs (SyntaxKind Kind,
7677 ArrayRef<RC<RawSyntax>> Parts) {
7778 // Try to create the node of the given syntax.
79+ SyntaxArena &Arena = getArena ();
7880 if (auto Node = SyntaxFactory::createRaw (Kind, Parts, &Arena))
7981 return Node;
8082
@@ -144,10 +146,10 @@ RC<RawSyntax> SyntaxParsingContext::bridgeAs(SyntaxContextKind Kind,
144146
145147// / Add RawSyntax to the parts.
146148void SyntaxParsingContext::addRawSyntax (RC<RawSyntax> Raw) {
147- Storage .emplace_back (Raw);
149+ getStorage () .emplace_back (Raw);
148150}
149151
150- SyntaxParsingContext *SyntaxParsingContext::getRoot () {
152+ const SyntaxParsingContext *SyntaxParsingContext::getRoot () const {
151153 auto Curr = this ;
152154 while (!Curr->isRoot ())
153155 Curr = Curr->getParent ();
@@ -160,6 +162,7 @@ void SyntaxParsingContext::addToken(Token &Tok, Trivia &LeadingTrivia,
160162 if (!Enabled)
161163 return ;
162164
165+ auto &Arena = getArena ();
163166 addRawSyntax (RawSyntax::getToken (Arena, Tok.getKind (), Tok.getText (),
164167 LeadingTrivia.Pieces ,
165168 TrailingTrivia.Pieces ));
@@ -175,16 +178,16 @@ void SyntaxParsingContext::addSyntax(Syntax Node) {
175178void SyntaxParsingContext::createNodeInPlace (SyntaxKind Kind, size_t N) {
176179 if (N == 0 ) {
177180 if (!parserShallOmitWhenNoChildren (Kind))
178- Storage .push_back (createSyntaxAs (Kind, {}));
181+ getStorage () .push_back (createSyntaxAs (Kind, {}));
179182 return ;
180183 }
181184
182- auto I = Storage .end () - N;
185+ auto I = getStorage () .end () - N;
183186 *I = createSyntaxAs (Kind, getParts ().take_back (N));
184187
185188 // Remove consumed parts.
186189 if (N != 1 )
187- Storage .erase (I + 1 , Storage .end ());
190+ getStorage () .erase (I + 1 , getStorage () .end ());
188191}
189192
190193void SyntaxParsingContext::createNodeInPlace (SyntaxKind Kind) {
@@ -337,30 +340,30 @@ void SyntaxParsingContext::finalizeRoot() {
337340 assert (isTopOfContextStack () && " some sub-contexts are not destructed" );
338341 assert (isRoot () && " only root context can finalize the tree" );
339342 assert (Mode == AccumulationMode::Root);
340- finalizeSourceFile (getRootData (), getParts ());
343+ finalizeSourceFile (* getRootData (), getParts ());
341344
342345 // Clear the parts because we will call this function again when destroying
343346 // the root context.
344- getRootData (). Storage .clear ();
347+ getStorage () .clear ();
345348}
346349
347350void SyntaxParsingContext::synthesize (tok Kind, StringRef Text) {
348351 if (!Enabled)
349352 return ;
350353 if (Text.empty ())
351354 Text = getTokenText (Kind);
352- Storage .push_back (RawSyntax::missing (Kind, Text));
355+ getStorage () .push_back (RawSyntax::missing (Kind, Text));
353356}
354357
355358void SyntaxParsingContext::synthesize (SyntaxKind Kind) {
356359 if (!Enabled)
357360 return ;
358- Storage .push_back (RawSyntax::missing (Kind));
361+ getStorage () .push_back (RawSyntax::missing (Kind));
359362}
360363
361364void SyntaxParsingContext::dumpStorage () const {
362365 llvm::errs () << " ======================\n " ;
363- for (auto Node : Storage ) {
366+ for (auto Node : getStorage () ) {
364367 Node->dump ();
365368 llvm::errs () << " \n --------------\n " ;
366369 }
@@ -380,6 +383,8 @@ SyntaxParsingContext::~SyntaxParsingContext() {
380383 if (!Enabled)
381384 return ;
382385
386+ auto &Storage = getStorage ();
387+
383388 switch (Mode) {
384389 // Create specified Syntax node from the parts and add it to the parent.
385390 case AccumulationMode::CreateSyntax:
0 commit comments