https://github.com/owenca updated https://github.com/llvm/llvm-project/pull/81390
>From 37a6723b2c9b95c0556ca53992192795e74c27ce Mon Sep 17 00:00:00 2001 From: Owen Pan <owenpi...@gmail.com> Date: Sat, 10 Feb 2024 17:14:19 -0800 Subject: [PATCH 1/3] [clang-format][NFC] Make LangOpts global in namespace Format --- clang/include/clang/Format/Format.h | 6 +--- clang/lib/Format/Format.cpp | 30 ---------------- clang/lib/Format/FormatTokenLexer.cpp | 6 ++-- clang/lib/Format/FormatTokenLexer.h | 2 -- .../Format/IntegerLiteralSeparatorFixer.cpp | 2 +- clang/lib/Format/TokenAnalyzer.cpp | 36 ++++++++++++++++++- clang/unittests/Format/TestLexer.h | 4 ++- 7 files changed, 43 insertions(+), 43 deletions(-) diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h index ab56cc8b6f9135..bede7e88cdbc7a 100644 --- a/clang/include/clang/Format/Format.h +++ b/clang/include/clang/Format/Format.h @@ -14,7 +14,6 @@ #ifndef LLVM_CLANG_FORMAT_FORMAT_H #define LLVM_CLANG_FORMAT_FORMAT_H -#include "clang/Basic/LangOptions.h" #include "clang/Tooling/Core/Replacement.h" #include "clang/Tooling/Inclusions/IncludeStyle.h" #include "llvm/ADT/ArrayRef.h" @@ -5179,10 +5178,7 @@ tooling::Replacements sortUsingDeclarations(const FormatStyle &Style, ArrayRef<tooling::Range> Ranges, StringRef FileName = "<stdin>"); -/// Returns the ``LangOpts`` that the formatter expects you to set. -/// -/// \param Style determines specific settings for lexing mode. -LangOptions getFormattingLangOpts(const FormatStyle &Style = getLLVMStyle()); +extern LangOptions LangOpts; /// Description to be used for help text for a ``llvm::cl`` option for /// specifying format style. The description is closely related to the operation diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index d2cc466744acbd..8431d3cfb14432 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -3823,36 +3823,6 @@ tooling::Replacements sortUsingDeclarations(const FormatStyle &Style, return UsingDeclarationsSorter(*Env, Style).process().first; } -LangOptions getFormattingLangOpts(const FormatStyle &Style) { - LangOptions LangOpts; - - FormatStyle::LanguageStandard LexingStd = Style.Standard; - if (LexingStd == FormatStyle::LS_Auto) - LexingStd = FormatStyle::LS_Latest; - if (LexingStd == FormatStyle::LS_Latest) - LexingStd = FormatStyle::LS_Cpp20; - LangOpts.CPlusPlus = 1; - LangOpts.CPlusPlus11 = LexingStd >= FormatStyle::LS_Cpp11; - LangOpts.CPlusPlus14 = LexingStd >= FormatStyle::LS_Cpp14; - LangOpts.CPlusPlus17 = LexingStd >= FormatStyle::LS_Cpp17; - LangOpts.CPlusPlus20 = LexingStd >= FormatStyle::LS_Cpp20; - LangOpts.Char8 = LexingStd >= FormatStyle::LS_Cpp20; - // Turning on digraphs in standards before C++0x is error-prone, because e.g. - // the sequence "<::" will be unconditionally treated as "[:". - // Cf. Lexer::LexTokenInternal. - LangOpts.Digraphs = LexingStd >= FormatStyle::LS_Cpp11; - - LangOpts.LineComment = 1; - bool AlternativeOperators = Style.isCpp(); - LangOpts.CXXOperatorNames = AlternativeOperators ? 1 : 0; - LangOpts.Bool = 1; - LangOpts.ObjC = 1; - LangOpts.MicrosoftExt = 1; // To get kw___try, kw___finally. - LangOpts.DeclSpecKeyword = 1; // To get __declspec. - LangOpts.C99 = 1; // To get kw_restrict for non-underscore-prefixed restrict. - return LangOpts; -} - const char *StyleOptionHelpDescription = "Set coding style. <string> can be:\n" "1. A preset: LLVM, GNU, Google, Chromium, Microsoft,\n" diff --git a/clang/lib/Format/FormatTokenLexer.cpp b/clang/lib/Format/FormatTokenLexer.cpp index a87d0ba3dbbf9b..e517e413ec91fb 100644 --- a/clang/lib/Format/FormatTokenLexer.cpp +++ b/clang/lib/Format/FormatTokenLexer.cpp @@ -28,12 +28,12 @@ FormatTokenLexer::FormatTokenLexer( llvm::SpecificBumpPtrAllocator<FormatToken> &Allocator, IdentifierTable &IdentTable) : FormatTok(nullptr), IsFirstToken(true), StateStack({LexerState::NORMAL}), - Column(Column), TrailingWhitespace(0), - LangOpts(getFormattingLangOpts(Style)), SourceMgr(SourceMgr), ID(ID), + Column(Column), TrailingWhitespace(0), SourceMgr(SourceMgr), ID(ID), Style(Style), IdentTable(IdentTable), Keywords(IdentTable), Encoding(Encoding), Allocator(Allocator), FirstInLineIndex(0), FormattingDisabled(false), MacroBlockBeginRegex(Style.MacroBlockBegin), MacroBlockEndRegex(Style.MacroBlockEnd) { + assert(LangOpts.CPlusPlus); Lex.reset(new Lexer(ID, SourceMgr.getBufferOrFake(ID), SourceMgr, LangOpts)); Lex->SetKeepWhitespaceMode(true); @@ -1442,7 +1442,7 @@ void FormatTokenLexer::readRawToken(FormatToken &Tok) { void FormatTokenLexer::resetLexer(unsigned Offset) { StringRef Buffer = SourceMgr.getBufferData(ID); - LangOpts = getFormattingLangOpts(Style); + assert(LangOpts.CPlusPlus); Lex.reset(new Lexer(SourceMgr.getLocForStartOfFile(ID), LangOpts, Buffer.begin(), Buffer.begin() + Offset, Buffer.end())); Lex->SetKeepWhitespaceMode(true); diff --git a/clang/lib/Format/FormatTokenLexer.h b/clang/lib/Format/FormatTokenLexer.h index 65dd733bd53352..0d0f36f1ea5308 100644 --- a/clang/lib/Format/FormatTokenLexer.h +++ b/clang/lib/Format/FormatTokenLexer.h @@ -17,7 +17,6 @@ #include "Encoding.h" #include "FormatToken.h" -#include "clang/Basic/LangOptions.h" #include "clang/Basic/SourceLocation.h" #include "clang/Basic/SourceManager.h" #include "clang/Format/Format.h" @@ -120,7 +119,6 @@ class FormatTokenLexer { unsigned Column; unsigned TrailingWhitespace; std::unique_ptr<Lexer> Lex; - LangOptions LangOpts; const SourceManager &SourceMgr; FileID ID; const FormatStyle &Style; diff --git a/clang/lib/Format/IntegerLiteralSeparatorFixer.cpp b/clang/lib/Format/IntegerLiteralSeparatorFixer.cpp index 87823ae32b1138..3c2ceddd5599cf 100644 --- a/clang/lib/Format/IntegerLiteralSeparatorFixer.cpp +++ b/clang/lib/Format/IntegerLiteralSeparatorFixer.cpp @@ -79,7 +79,7 @@ IntegerLiteralSeparatorFixer::process(const Environment &Env, AffectedRangeManager AffectedRangeMgr(SourceMgr, Env.getCharRanges()); const auto ID = Env.getFileID(); - const auto LangOpts = getFormattingLangOpts(Style); + assert(LangOpts.CPlusPlus); Lexer Lex(ID, SourceMgr.getBufferOrFake(ID), SourceMgr, LangOpts); Lex.SetCommentRetentionState(true); diff --git a/clang/lib/Format/TokenAnalyzer.cpp b/clang/lib/Format/TokenAnalyzer.cpp index bd648c430f9b0a..4e7768332b41d5 100644 --- a/clang/lib/Format/TokenAnalyzer.cpp +++ b/clang/lib/Format/TokenAnalyzer.cpp @@ -35,6 +35,38 @@ namespace clang { namespace format { +LangOptions LangOpts; + +/// Sets `LangOpts` for the formatter. +/// +/// \param `Style` determines specific settings for lexing mode. +static void setFormattingLangOpts(const FormatStyle &Style) { + FormatStyle::LanguageStandard LexingStd = Style.Standard; + if (LexingStd == FormatStyle::LS_Auto) + LexingStd = FormatStyle::LS_Latest; + if (LexingStd == FormatStyle::LS_Latest) + LexingStd = FormatStyle::LS_Cpp20; + LangOpts.CPlusPlus = 1; + LangOpts.CPlusPlus11 = LexingStd >= FormatStyle::LS_Cpp11; + LangOpts.CPlusPlus14 = LexingStd >= FormatStyle::LS_Cpp14; + LangOpts.CPlusPlus17 = LexingStd >= FormatStyle::LS_Cpp17; + LangOpts.CPlusPlus20 = LexingStd >= FormatStyle::LS_Cpp20; + LangOpts.Char8 = LexingStd >= FormatStyle::LS_Cpp20; + // Turning on digraphs in standards before C++0x is error-prone, because e.g. + // the sequence "<::" will be unconditionally treated as "[:". + // Cf. Lexer::LexTokenInternal. + LangOpts.Digraphs = LexingStd >= FormatStyle::LS_Cpp11; + + LangOpts.LineComment = 1; + bool AlternativeOperators = Style.isCpp(); + LangOpts.CXXOperatorNames = AlternativeOperators ? 1 : 0; + LangOpts.Bool = 1; + LangOpts.ObjC = 1; + LangOpts.MicrosoftExt = 1; // To get kw___try, kw___finally. + LangOpts.DeclSpecKeyword = 1; // To get __declspec. + LangOpts.C99 = 1; // To get kw_restrict for non-underscore-prefixed restrict. +} + // FIXME: Instead of printing the diagnostic we should store it and have a // better way to return errors through the format APIs. class FatalDiagnosticConsumer : public DiagnosticConsumer { @@ -99,9 +131,11 @@ TokenAnalyzer::TokenAnalyzer(const Environment &Env, const FormatStyle &Style) std::pair<tooling::Replacements, unsigned> TokenAnalyzer::process(bool SkipAnnotation) { + setFormattingLangOpts(Style); + tooling::Replacements Result; llvm::SpecificBumpPtrAllocator<FormatToken> Allocator; - IdentifierTable IdentTable(getFormattingLangOpts(Style)); + IdentifierTable IdentTable(LangOpts); FormatTokenLexer Lex(Env.getSourceManager(), Env.getFileID(), Env.getFirstStartColumn(), Style, Encoding, Allocator, IdentTable); diff --git a/clang/unittests/Format/TestLexer.h b/clang/unittests/Format/TestLexer.h index 8b5949b32fc9ed..6a3d0bdedcee0a 100644 --- a/clang/unittests/Format/TestLexer.h +++ b/clang/unittests/Format/TestLexer.h @@ -61,7 +61,9 @@ class TestLexer : public UnwrappedLineConsumer { std::vector<std::unique_ptr<llvm::MemoryBuffer>> &Buffers, FormatStyle Style = getLLVMStyle()) : Allocator(Allocator), Buffers(Buffers), Style(Style), - SourceMgr("test.cpp", ""), IdentTable(getFormattingLangOpts(Style)) {} + SourceMgr("test.cpp", ""), IdentTable(LangOpts) { + assert(LangOpts.CPlusPlus); + } TokenList lex(llvm::StringRef Code) { FormatTokenLexer Lex = getNewLexer(Code); >From 44f0695fb21bfc1929a8b7b4070ca5f789046ec6 Mon Sep 17 00:00:00 2001 From: Owen Pan <owenpi...@gmail.com> Date: Sat, 10 Feb 2024 17:41:09 -0800 Subject: [PATCH 2/3] Move the declaration of LangOpts from Format.h to TokenAnalyzer.h --- clang/include/clang/Format/Format.h | 2 -- clang/lib/Format/FormatTokenLexer.cpp | 1 + clang/lib/Format/TokenAnalyzer.h | 2 ++ 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h index bede7e88cdbc7a..b78b82a2ec6cc3 100644 --- a/clang/include/clang/Format/Format.h +++ b/clang/include/clang/Format/Format.h @@ -5178,8 +5178,6 @@ tooling::Replacements sortUsingDeclarations(const FormatStyle &Style, ArrayRef<tooling::Range> Ranges, StringRef FileName = "<stdin>"); -extern LangOptions LangOpts; - /// Description to be used for help text for a ``llvm::cl`` option for /// specifying format style. The description is closely related to the operation /// of ``getStyle()``. diff --git a/clang/lib/Format/FormatTokenLexer.cpp b/clang/lib/Format/FormatTokenLexer.cpp index e517e413ec91fb..bcc763613439c1 100644 --- a/clang/lib/Format/FormatTokenLexer.cpp +++ b/clang/lib/Format/FormatTokenLexer.cpp @@ -14,6 +14,7 @@ #include "FormatTokenLexer.h" #include "FormatToken.h" +#include "TokenAnalyzer.h" #include "clang/Basic/SourceLocation.h" #include "clang/Basic/SourceManager.h" #include "clang/Format/Format.h" diff --git a/clang/lib/Format/TokenAnalyzer.h b/clang/lib/Format/TokenAnalyzer.h index 4086dab1c94c3a..18c1431eb37612 100644 --- a/clang/lib/Format/TokenAnalyzer.h +++ b/clang/lib/Format/TokenAnalyzer.h @@ -34,6 +34,8 @@ namespace clang { namespace format { +extern LangOptions LangOpts; + class Environment { public: // This sets up an virtual file system with file \p FileName containing the >From df7b65ee3ffb2a3a07079dbde610daaeda4d0085 Mon Sep 17 00:00:00 2001 From: Owen Pan <owenpi...@gmail.com> Date: Sat, 10 Feb 2024 23:24:45 -0800 Subject: [PATCH 3/3] Remove redundant #include lines. --- clang/lib/Format/FormatTokenLexer.cpp | 5 ----- 1 file changed, 5 deletions(-) diff --git a/clang/lib/Format/FormatTokenLexer.cpp b/clang/lib/Format/FormatTokenLexer.cpp index bcc763613439c1..a57659fd422720 100644 --- a/clang/lib/Format/FormatTokenLexer.cpp +++ b/clang/lib/Format/FormatTokenLexer.cpp @@ -13,12 +13,7 @@ //===----------------------------------------------------------------------===// #include "FormatTokenLexer.h" -#include "FormatToken.h" #include "TokenAnalyzer.h" -#include "clang/Basic/SourceLocation.h" -#include "clang/Basic/SourceManager.h" -#include "clang/Format/Format.h" -#include "llvm/Support/Regex.h" namespace clang { namespace format { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits