MyDeveloperDay created this revision. MyDeveloperDay added reviewers: thakis, klimek, mitchell-stellar. MyDeveloperDay added projects: clang, clang-format. Herald added a subscriber: mgorny.
Address review comments from D68554: [clang-format] Proposal for clang-format to give compiler style warnings <https://reviews.llvm.org/D68554> by trying to drop the dependency again on Frontend whilst keeping the same format diagnostic messages Not completely happy with having to do a split in order to get the StringRef for the Line the error occurred on, but could see a way to use SourceManager and SourceLocation to give me a single line? But this removes the dependency on frontend which should keep the binary size down. Repository: rC Clang https://reviews.llvm.org/D68969 Files: clang/tools/clang-format/CMakeLists.txt clang/tools/clang-format/ClangFormat.cpp Index: clang/tools/clang-format/ClangFormat.cpp =================================================================== --- clang/tools/clang-format/ClangFormat.cpp +++ clang/tools/clang-format/ClangFormat.cpp @@ -18,7 +18,6 @@ #include "clang/Basic/SourceManager.h" #include "clang/Basic/Version.h" #include "clang/Format/Format.h" -#include "clang/Frontend/TextDiagnosticPrinter.h" #include "clang/Rewrite/Core/Rewriter.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileSystem.h" @@ -325,12 +324,9 @@ IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions(); DiagOpts->ShowColors = (ShowColors && !NoShowColors); - TextDiagnosticPrinter *DiagsBuffer = - new TextDiagnosticPrinter(llvm::errs(), &*DiagOpts, false); - IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); IntrusiveRefCntPtr<DiagnosticsEngine> Diags( - new DiagnosticsEngine(DiagID, &*DiagOpts, DiagsBuffer)); + new DiagnosticsEngine(DiagID, &*DiagOpts)); IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> InMemoryFileSystem( new llvm::vfs::InMemoryFileSystem); @@ -339,24 +335,35 @@ FileID FileID = createInMemoryFile(AssumedFileName, Code.get(), Sources, Files, InMemoryFileSystem.get()); - const unsigned ID = Diags->getCustomDiagID( - WarningsAsErrors ? clang::DiagnosticsEngine::Error - : clang::DiagnosticsEngine::Warning, - "code should be clang-formatted [-Wclang-format-violations]"); + SmallVector<StringRef, 8> Lines; + Code->getBuffer().split(Lines, "\n", /*MaxSplit=*/-1, + /*KeepEmpty=*/true); unsigned Errors = 0; - DiagsBuffer->BeginSourceFile(LangOptions(), nullptr); if (WarnFormat && !NoWarnFormat) { + ArrayRef<std::pair<unsigned, unsigned>> Ranges; for (const auto &R : Replaces) { - Diags->Report( - Sources.getLocForStartOfFile(FileID).getLocWithOffset(R.getOffset()), - ID); + PresumedLoc PLoc = Sources.getPresumedLoc( + Sources.getLocForStartOfFile(FileID).getLocWithOffset(R.getOffset())); + + StringRef Line; + if (PLoc.getLine() < Lines.size() && PLoc.getLine() > 0) + Line = Lines[PLoc.getLine() - 1]; + + SMDiagnostic Diags( + llvm::SourceMgr(), SMLoc(), AssumedFileName, PLoc.getLine(), + PLoc.getColumn() - 1, + WarningsAsErrors ? SourceMgr::DiagKind::DK_Error + : SourceMgr::DiagKind::DK_Warning, + "code should be clang-formatted [-Wclang-format-violations]", Line, + ArrayRef<std::pair<unsigned, unsigned>>()); + + Diags.print(nullptr, llvm::errs(), (ShowColors && !NoShowColors)); Errors++; if (ErrorLimit && Errors >= ErrorLimit) break; } } - DiagsBuffer->EndSourceFile(); return WarningsAsErrors; } Index: clang/tools/clang-format/CMakeLists.txt =================================================================== --- clang/tools/clang-format/CMakeLists.txt +++ clang/tools/clang-format/CMakeLists.txt @@ -7,7 +7,6 @@ set(CLANG_FORMAT_LIB_DEPS clangBasic clangFormat - clangFrontend clangRewrite clangToolingCore )
Index: clang/tools/clang-format/ClangFormat.cpp =================================================================== --- clang/tools/clang-format/ClangFormat.cpp +++ clang/tools/clang-format/ClangFormat.cpp @@ -18,7 +18,6 @@ #include "clang/Basic/SourceManager.h" #include "clang/Basic/Version.h" #include "clang/Format/Format.h" -#include "clang/Frontend/TextDiagnosticPrinter.h" #include "clang/Rewrite/Core/Rewriter.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileSystem.h" @@ -325,12 +324,9 @@ IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions(); DiagOpts->ShowColors = (ShowColors && !NoShowColors); - TextDiagnosticPrinter *DiagsBuffer = - new TextDiagnosticPrinter(llvm::errs(), &*DiagOpts, false); - IntrusiveRefCntPtr<DiagnosticIDs> DiagID(new DiagnosticIDs()); IntrusiveRefCntPtr<DiagnosticsEngine> Diags( - new DiagnosticsEngine(DiagID, &*DiagOpts, DiagsBuffer)); + new DiagnosticsEngine(DiagID, &*DiagOpts)); IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem> InMemoryFileSystem( new llvm::vfs::InMemoryFileSystem); @@ -339,24 +335,35 @@ FileID FileID = createInMemoryFile(AssumedFileName, Code.get(), Sources, Files, InMemoryFileSystem.get()); - const unsigned ID = Diags->getCustomDiagID( - WarningsAsErrors ? clang::DiagnosticsEngine::Error - : clang::DiagnosticsEngine::Warning, - "code should be clang-formatted [-Wclang-format-violations]"); + SmallVector<StringRef, 8> Lines; + Code->getBuffer().split(Lines, "\n", /*MaxSplit=*/-1, + /*KeepEmpty=*/true); unsigned Errors = 0; - DiagsBuffer->BeginSourceFile(LangOptions(), nullptr); if (WarnFormat && !NoWarnFormat) { + ArrayRef<std::pair<unsigned, unsigned>> Ranges; for (const auto &R : Replaces) { - Diags->Report( - Sources.getLocForStartOfFile(FileID).getLocWithOffset(R.getOffset()), - ID); + PresumedLoc PLoc = Sources.getPresumedLoc( + Sources.getLocForStartOfFile(FileID).getLocWithOffset(R.getOffset())); + + StringRef Line; + if (PLoc.getLine() < Lines.size() && PLoc.getLine() > 0) + Line = Lines[PLoc.getLine() - 1]; + + SMDiagnostic Diags( + llvm::SourceMgr(), SMLoc(), AssumedFileName, PLoc.getLine(), + PLoc.getColumn() - 1, + WarningsAsErrors ? SourceMgr::DiagKind::DK_Error + : SourceMgr::DiagKind::DK_Warning, + "code should be clang-formatted [-Wclang-format-violations]", Line, + ArrayRef<std::pair<unsigned, unsigned>>()); + + Diags.print(nullptr, llvm::errs(), (ShowColors && !NoShowColors)); Errors++; if (ErrorLimit && Errors >= ErrorLimit) break; } } - DiagsBuffer->EndSourceFile(); return WarningsAsErrors; } Index: clang/tools/clang-format/CMakeLists.txt =================================================================== --- clang/tools/clang-format/CMakeLists.txt +++ clang/tools/clang-format/CMakeLists.txt @@ -7,7 +7,6 @@ set(CLANG_FORMAT_LIB_DEPS clangBasic clangFormat - clangFrontend clangRewrite clangToolingCore )
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits