[PATCH] D68969: [clang-format] Remove the dependency on frontend

MyDeveloperDay via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 16 15:36:54 PDT 2019


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
   )


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D68969.225320.patch
Type: text/x-patch
Size: 3596 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20191016/a8e7b1c8/attachment-0001.bin>


More information about the cfe-commits mailing list