diff --git a/clang/include/clang/Format/Format.h b/clang/include/clang/Format/Format.h index e3a066e9d83a..aac552b602ee 100644 --- a/clang/include/clang/Format/Format.h +++ b/clang/include/clang/Format/Format.h @@ -25,6 +25,7 @@ namespace clang { class Lexer; class SourceManager; +class DiagnosticConsumer; namespace format { @@ -57,7 +58,7 @@ struct FormatStyle { unsigned SpacesBeforeTrailingComments; /// \brief If the constructor initializers don't fit on a line, put each - /// initializer on its own line. + /// initializer on its own line. bool ConstructorInitializerAllOnOneLineOrOnePerLine; /// \brief Add a space in front of an Objective-C protocol list, i.e. use @@ -84,11 +85,15 @@ FormatStyle getGoogleStyle(); /// everything that might influence its formatting or might be influenced by its /// formatting. /// +/// \param DiagClient A custom DiagnosticConsumer. Can be 0, in this case +/// diagnostic is output to llvm::errs(). +/// /// Returns the \c Replacements necessary to make all \p Ranges comply with /// \p Style. tooling::Replacements reformat(const FormatStyle &Style, Lexer &Lex, SourceManager &SourceMgr, - std::vector Ranges); + std::vector Ranges, + DiagnosticConsumer *DiagClient = 0); /// \brief Returns the \c LangOpts that the formatter expects you to set. LangOptions getFormattingLangOpts(); diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp index 67a5b8c4cd6a..548bdee2b2d4 100644 --- a/clang/lib/Format/Format.cpp +++ b/clang/lib/Format/Format.cpp @@ -1331,7 +1331,7 @@ private: class Formatter : public UnwrappedLineConsumer { public: - Formatter(clang::DiagnosticsEngine &Diag, const FormatStyle &Style, + Formatter(DiagnosticsEngine &Diag, const FormatStyle &Style, Lexer &Lex, SourceManager &SourceMgr, const std::vector &Ranges) : Diag(Diag), Style(Style), Lex(Lex), SourceMgr(SourceMgr), @@ -1517,7 +1517,7 @@ private: return Indent; } - clang::DiagnosticsEngine &Diag; + DiagnosticsEngine &Diag; FormatStyle Style; Lexer &Lex; SourceManager &SourceMgr; @@ -1529,13 +1529,18 @@ private: tooling::Replacements reformat(const FormatStyle &Style, Lexer &Lex, SourceManager &SourceMgr, - std::vector Ranges) { + std::vector Ranges, + DiagnosticConsumer *DiagClient) { IntrusiveRefCntPtr DiagOpts = new DiagnosticOptions(); - TextDiagnosticPrinter DiagnosticPrinter(llvm::errs(), &*DiagOpts); - DiagnosticPrinter.BeginSourceFile(Lex.getLangOpts(), Lex.getPP()); + OwningPtr DiagPrinter; + if (DiagClient == 0) { + DiagPrinter.reset(new TextDiagnosticPrinter(llvm::errs(), &*DiagOpts)); + DiagPrinter->BeginSourceFile(Lex.getLangOpts(), Lex.getPP()); + DiagClient = DiagPrinter.get(); + } DiagnosticsEngine Diagnostics( IntrusiveRefCntPtr(new DiagnosticIDs()), &*DiagOpts, - &DiagnosticPrinter, false); + DiagClient, false); Diagnostics.setSourceManager(&SourceMgr); Formatter formatter(Diagnostics, Style, Lex, SourceMgr, Ranges); return formatter.format(); diff --git a/clang/unittests/Format/FormatTest.cpp b/clang/unittests/Format/FormatTest.cpp index 2f66e5454cb3..eb87a3b96571 100644 --- a/clang/unittests/Format/FormatTest.cpp +++ b/clang/unittests/Format/FormatTest.cpp @@ -29,7 +29,8 @@ protected: Lexer Lex(ID, Context.Sources.getBuffer(ID), Context.Sources, getFormattingLangOpts()); tooling::Replacements Replace = reformat(Style, Lex, Context.Sources, - Ranges); + Ranges, + new IgnoringDiagConsumer()); EXPECT_TRUE(applyAllReplacements(Replace, Context.Rewrite)); return Context.getRewrittenText(ID); } @@ -1206,8 +1207,6 @@ TEST_F(FormatTest, IncorrectCodeErrorDetection) { EXPECT_EQ("{\n {}\n", format("{\n {\n }\n")); EXPECT_EQ("{\n {}\n }\n}\n", format("{\n {\n }\n }\n}\n")); - FormatStyle Style = getLLVMStyle(); - Style.ColumnLimit = 10; EXPECT_EQ("{\n" " {\n" " breakme(\n" @@ -1215,8 +1214,7 @@ TEST_F(FormatTest, IncorrectCodeErrorDetection) { "}\n", format("{\n" " {\n" " breakme(qwe);\n" - "}\n", Style)); - + "}\n", getLLVMStyleWithColumns(10))); } TEST_F(FormatTest, LayoutCallsInsideBraceInitializers) {