[clang] 4c264c2 - [Parse] Split incremental-extensions (#65683)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 11 17:40:46 PDT 2023
Author: Ben Barham
Date: 2023-09-11T17:40:43-07:00
New Revision: 4c264c26d726f594c4618e4bfeac93d403de893f
URL: https://github.com/llvm/llvm-project/commit/4c264c26d726f594c4618e4bfeac93d403de893f
DIFF: https://github.com/llvm/llvm-project/commit/4c264c26d726f594c4618e4bfeac93d403de893f.diff
LOG: [Parse] Split incremental-extensions (#65683)
The preprocessor `IncrementalProcessing` option was being used to
control whether or not to teardown the lexer or run the end of
translation unit action. In D127284 this was merged with
`-fincremental-extensions`, which also changes top level parsing.
Split these again so that the former behavior can be achieved without
the latter (ie. to allow managing lifetime without also changing
parsing).
Resolves rdar://113406310.
Added:
Modified:
clang/include/clang/Lex/Preprocessor.h
clang/lib/Lex/PPLexerChange.cpp
clang/lib/Lex/Preprocessor.cpp
clang/lib/Parse/Parser.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/Lex/Preprocessor.h b/clang/include/clang/Lex/Preprocessor.h
index bc1d94a61508d8d..575d08b83fd3a02 100644
--- a/clang/include/clang/Lex/Preprocessor.h
+++ b/clang/include/clang/Lex/Preprocessor.h
@@ -277,6 +277,9 @@ class Preprocessor {
/// Empty line handler.
EmptylineHandler *Emptyline = nullptr;
+ /// True to avoid tearing down the lexer etc on EOF
+ bool IncrementalProcessing = false;
+
public:
/// The kind of translation unit we are processing.
const TranslationUnitKind TUKind;
@@ -1910,14 +1913,11 @@ class Preprocessor {
void recomputeCurLexerKind();
/// Returns true if incremental processing is enabled
- bool isIncrementalProcessingEnabled() const {
- return getLangOpts().IncrementalExtensions;
- }
+ bool isIncrementalProcessingEnabled() const { return IncrementalProcessing; }
/// Enables the incremental processing
void enableIncrementalProcessing(bool value = true) {
- // FIXME: Drop this interface.
- const_cast<LangOptions &>(getLangOpts()).IncrementalExtensions = value;
+ IncrementalProcessing = value;
}
/// Specify the point at which code-completion will be performed.
diff --git a/clang/lib/Lex/PPLexerChange.cpp b/clang/lib/Lex/PPLexerChange.cpp
index ab005381adfaf2c..811a760420e0a2d 100644
--- a/clang/lib/Lex/PPLexerChange.cpp
+++ b/clang/lib/Lex/PPLexerChange.cpp
@@ -541,7 +541,7 @@ bool Preprocessor::HandleEndOfFile(Token &Result, bool isEndOfMacro) {
Result.startToken();
CurLexer->BufferPtr = EndPos;
- if (isIncrementalProcessingEnabled()) {
+ if (getLangOpts().IncrementalExtensions) {
CurLexer->FormTokenWithChars(Result, EndPos, tok::annot_repl_input_end);
Result.setAnnotationEndLoc(Result.getLocation());
Result.setAnnotationValue(nullptr);
diff --git a/clang/lib/Lex/Preprocessor.cpp b/clang/lib/Lex/Preprocessor.cpp
index 8de78a13930ed62..f0381c18a8b6f77 100644
--- a/clang/lib/Lex/Preprocessor.cpp
+++ b/clang/lib/Lex/Preprocessor.cpp
@@ -146,6 +146,10 @@ Preprocessor::Preprocessor(std::shared_ptr<PreprocessorOptions> PPOpts,
Ident_AbnormalTermination = nullptr;
}
+ // Default incremental processing to -fincremental-extensions, clients can
+ // override with `enableIncrementalProcessing` if desired.
+ IncrementalProcessing = LangOpts.IncrementalExtensions;
+
// If using a PCH where a #pragma hdrstop is expected, start skipping tokens.
if (usingPCHWithPragmaHdrStop())
SkippingUntilPragmaHdrStop = true;
diff --git a/clang/lib/Parse/Parser.cpp b/clang/lib/Parse/Parser.cpp
index 09215b8303ecf9c..858b6439df5122a 100644
--- a/clang/lib/Parse/Parser.cpp
+++ b/clang/lib/Parse/Parser.cpp
@@ -615,6 +615,11 @@ bool Parser::ParseTopLevelDecl(DeclGroupPtrTy &Result,
Sema::ModuleImportState &ImportState) {
DestroyTemplateIdAnnotationsRAIIObj CleanupRAII(*this);
+ // Skip over the EOF token, flagging end of previous input for incremental
+ // processing
+ if (PP.isIncrementalProcessingEnabled() && Tok.is(tok::eof))
+ ConsumeToken();
+
Result = nullptr;
switch (Tok.getKind()) {
case tok::annot_pragma_unused:
@@ -706,7 +711,8 @@ bool Parser::ParseTopLevelDecl(DeclGroupPtrTy &Result,
// Late template parsing can begin.
Actions.SetLateTemplateParser(LateTemplateParserCallback, nullptr, this);
- Actions.ActOnEndOfTranslationUnit();
+ if (!PP.isIncrementalProcessingEnabled())
+ Actions.ActOnEndOfTranslationUnit();
//else don't tell Sema that we ended parsing: more input might come.
return true;
@@ -1038,7 +1044,7 @@ Parser::ParseExternalDeclaration(ParsedAttributes &Attrs,
ConsumeToken();
return nullptr;
}
- if (PP.isIncrementalProcessingEnabled() &&
+ if (getLangOpts().IncrementalExtensions &&
!isDeclarationStatement(/*DisambiguatingWithExpression=*/true))
return ParseTopLevelStmtDecl();
More information about the cfe-commits
mailing list