Skip to content

Commit 6f0593a

Browse files
authored
Merge pull request #21770 from nkcsgexi/cherry-pick-parser-flag
[5.0][Parser] Expose a flag to allow users explicitly disable delayed parsing. NFC
2 parents 2bf3893 + 3583dea commit 6f0593a

File tree

5 files changed

+28
-11
lines changed

5 files changed

+28
-11
lines changed

include/swift/Parse/Parser.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -206,6 +206,9 @@ class Parser {
206206
/// Always empty if !SF.shouldBuildSyntaxTree().
207207
syntax::Trivia TrailingTrivia;
208208

209+
/// Whether we should disable delayed parsing.
210+
bool DisableDelayedParsing;
211+
209212
/// \brief The receiver to collect all consumed tokens.
210213
ConsumeTokenReceiver *TokReceiver;
211214

@@ -351,12 +354,15 @@ class Parser {
351354
public:
352355
Parser(unsigned BufferID, SourceFile &SF, DiagnosticEngine* LexerDiags,
353356
SILParserTUStateBase *SIL,
354-
PersistentParserState *PersistentState);
357+
PersistentParserState *PersistentState,
358+
bool DisableDelayedParsing = false);
355359
Parser(unsigned BufferID, SourceFile &SF, SILParserTUStateBase *SIL,
356-
PersistentParserState *PersistentState = nullptr);
360+
PersistentParserState *PersistentState = nullptr,
361+
bool DisableDelayedParsing = false);
357362
Parser(std::unique_ptr<Lexer> Lex, SourceFile &SF,
358363
SILParserTUStateBase *SIL = nullptr,
359-
PersistentParserState *PersistentState = nullptr);
364+
PersistentParserState *PersistentState = nullptr,
365+
bool DisableDelayedParsing = false);
360366
~Parser();
361367

362368
bool isInSILMode() const { return SIL != nullptr; }

include/swift/Subsystems.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,8 @@ namespace swift {
119119
bool parseIntoSourceFile(SourceFile &SF, unsigned BufferID, bool *Done,
120120
SILParserState *SIL = nullptr,
121121
PersistentParserState *PersistentState = nullptr,
122-
DelayedParsingCallbacks *DelayedParseCB = nullptr);
122+
DelayedParsingCallbacks *DelayedParseCB = nullptr,
123+
bool DisableDelayedParsing = false);
123124

124125
/// \brief Finish the parsing by going over the nodes that were delayed
125126
/// during the first parsing pass.

lib/Parse/ParseDecl.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3469,6 +3469,9 @@ bool Parser::parseDeclList(SourceLoc LBLoc, SourceLoc &RBLoc,
34693469
}
34703470

34713471
bool Parser::canDelayMemberDeclParsing() {
3472+
// If explicitly disabled, respect the flag.
3473+
if (DisableDelayedParsing)
3474+
return false;
34723475
// There's no fundamental reasons that SIL cannnot be lasily parsed. We need
34733476
// to keep SILParserTUStateBase persistent to make it happen.
34743477
if (isInSILMode())

lib/Parse/Parser.cpp

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -333,12 +333,15 @@ swift::tokenizeWithTrivia(const LangOptions &LangOpts, const SourceManager &SM,
333333

334334

335335
Parser::Parser(unsigned BufferID, SourceFile &SF, SILParserTUStateBase *SIL,
336-
PersistentParserState *PersistentState)
337-
: Parser(BufferID, SF, &SF.getASTContext().Diags, SIL, PersistentState) {}
336+
PersistentParserState *PersistentState,
337+
bool DisableDelayedParsing)
338+
: Parser(BufferID, SF, &SF.getASTContext().Diags, SIL, PersistentState,
339+
DisableDelayedParsing) {}
338340

339341
Parser::Parser(unsigned BufferID, SourceFile &SF, DiagnosticEngine* LexerDiags,
340342
SILParserTUStateBase *SIL,
341-
PersistentParserState *PersistentState)
343+
PersistentParserState *PersistentState,
344+
bool DisableDelayedParsing)
342345
: Parser(
343346
std::unique_ptr<Lexer>(new Lexer(
344347
SF.getASTContext().LangOpts, SF.getASTContext().SourceMgr,
@@ -353,7 +356,7 @@ Parser::Parser(unsigned BufferID, SourceFile &SF, DiagnosticEngine* LexerDiags,
353356
SF.shouldBuildSyntaxTree()
354357
? TriviaRetentionMode::WithTrivia
355358
: TriviaRetentionMode::WithoutTrivia)),
356-
SF, SIL, PersistentState) {}
359+
SF, SIL, PersistentState, DisableDelayedParsing) {}
357360

358361
namespace {
359362

@@ -472,14 +475,16 @@ class TokenRecorder: public ConsumeTokenReceiver {
472475

473476
Parser::Parser(std::unique_ptr<Lexer> Lex, SourceFile &SF,
474477
SILParserTUStateBase *SIL,
475-
PersistentParserState *PersistentState)
478+
PersistentParserState *PersistentState,
479+
bool DisableDelayedParsing)
476480
: SourceMgr(SF.getASTContext().SourceMgr),
477481
Diags(SF.getASTContext().Diags),
478482
SF(SF),
479483
L(Lex.release()),
480484
SIL(SIL),
481485
CurDeclContext(&SF),
482486
Context(SF.getASTContext()),
487+
DisableDelayedParsing(DisableDelayedParsing),
483488
TokReceiver(SF.shouldCollectToken() ?
484489
new TokenRecorder(SF) :
485490
new ConsumeTokenReceiver()),

lib/ParseSIL/ParseSIL.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,9 +112,11 @@ bool swift::parseIntoSourceFile(SourceFile &SF,
112112
bool *Done,
113113
SILParserState *SIL,
114114
PersistentParserState *PersistentState,
115-
DelayedParsingCallbacks *DelayedParseCB) {
115+
DelayedParsingCallbacks *DelayedParseCB,
116+
bool DisableDelayedParsing) {
116117
SharedTimer timer("Parsing");
117-
Parser P(BufferID, SF, SIL ? SIL->Impl.get() : nullptr, PersistentState);
118+
Parser P(BufferID, SF, SIL ? SIL->Impl.get() : nullptr, PersistentState,
119+
DisableDelayedParsing);
118120
PrettyStackTraceParser StackTrace(P);
119121

120122
llvm::SaveAndRestore<bool> S(P.IsParsingInterfaceTokens,

0 commit comments

Comments
 (0)