MyDeveloperDay updated this revision to Diff 225320. MyDeveloperDay added a comment.
Remove need to split lines or search for `\n` General Algorithm 1. take Location of Replacement line and column 2. make a new SourceLocation of line and column =0 (beginning of that replacement line) 3. make a new SourceLocation of line+1 and column = 0 (beginning of the next line) 4. use `getCharacterData()` to get pointers to beginning of each line 5. make a String from those begin and end ptrs Seems very much faster when run over clang source tree (removal of noticeable pauses on large files) That should equal the line CHANGES SINCE LAST ACTION https://reviews.llvm.org/D68969/new/ 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,8 +18,8 @@ #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/Demangle/StringView.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/InitLLVM.h" @@ -325,12 +325,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 +336,41 @@ 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]"); + FileManager &FileMgr = Sources.getFileManager(); + llvm::ErrorOr<const FileEntry *> FileEntryPtr = + FileMgr.getFile(AssumedFileName); 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())); + + SourceLocation LineBegin = Sources.translateFileLineCol( + FileEntryPtr.get(), PLoc.getLine() - 1, 0); + SourceLocation NextLineBegin = + Sources.translateFileLineCol(FileEntryPtr.get(), PLoc.getLine(), 0); + + const char *StartBuf = Sources.getCharacterData(LineBegin); + const char *EndBuf = Sources.getCharacterData(NextLineBegin); + + StringRef Line(StartBuf, (EndBuf - StartBuf)); + + 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,8 +18,8 @@ #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/Demangle/StringView.h" #include "llvm/Support/CommandLine.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/InitLLVM.h" @@ -325,12 +325,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 +336,41 @@ 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]"); + FileManager &FileMgr = Sources.getFileManager(); + llvm::ErrorOr<const FileEntry *> FileEntryPtr = + FileMgr.getFile(AssumedFileName); 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())); + + SourceLocation LineBegin = Sources.translateFileLineCol( + FileEntryPtr.get(), PLoc.getLine() - 1, 0); + SourceLocation NextLineBegin = + Sources.translateFileLineCol(FileEntryPtr.get(), PLoc.getLine(), 0); + + const char *StartBuf = Sources.getCharacterData(LineBegin); + const char *EndBuf = Sources.getCharacterData(NextLineBegin); + + StringRef Line(StartBuf, (EndBuf - StartBuf)); + + 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