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
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits