Parser::Parser(std::unique_ptr<Lexer> Lex, SourceFile &SF, SILParserTUStateBase *SIL, PersistentParserState *PersistentState) : SourceMgr(SF.getASTContext().SourceMgr), Diags(SF.getASTContext().Diags), SF(SF), L(Lex.release()), SIL(SIL), CurDeclContext(&SF), Context(SF.getASTContext()), TokReceiver(SF.shouldKeepSyntaxInfo() ? new TokenRecorder(SF) : new ConsumeTokenReceiver()), SyntaxContext(new SyntaxParsingContext(SyntaxContext, SF, Diags, SourceMgr, L->getBufferID())) { State = PersistentState; if (!State) { OwnedState.reset(new PersistentParserState()); State = OwnedState.get(); } // Set the token to a sentinel so that we know the lexer isn't primed yet. // This cannot be tok::unknown, since that is a token the lexer could produce. Tok.setKind(tok::NUM_TOKENS); auto ParserPos = State->takeParserPosition(); if (ParserPos.isValid() && L->isStateForCurrentBuffer(ParserPos.LS)) { restoreParserPosition(ParserPos); InPoundLineEnvironment = State->InPoundLineEnvironment; } }
SyntaxParsingContext::SyntaxParsingContext(SyntaxParsingContext *&CtxtHolder, SourceFile &SF, DiagnosticEngine &Diags, SourceManager &SourceMgr, unsigned BufferID) : RootDataOrParent(new RootContextData(SF, Diags, SourceMgr, BufferID)), CtxtHolder(CtxtHolder), Storage(getRootData().Storage), Offset(0), Mode(AccumulationMode::Root), Enabled(SF.shouldKeepSyntaxInfo()) { CtxtHolder = this; }
Parser::Parser(unsigned BufferID, SourceFile &SF, SILParserTUStateBase *SIL, PersistentParserState *PersistentState) : Parser( std::unique_ptr<Lexer>(new Lexer( SF.getASTContext().LangOpts, SF.getASTContext().SourceMgr, BufferID, &SF.getASTContext().Diags, /*InSILMode=*/SIL != nullptr, SF.getASTContext().LangOpts.AttachCommentsToDecls ? CommentRetentionMode::AttachToNextToken : CommentRetentionMode::None, SF.shouldKeepSyntaxInfo() ? TriviaRetentionMode::WithTrivia : TriviaRetentionMode::WithoutTrivia)), SF, SIL, PersistentState) {}