summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra
diff options
context:
space:
mode:
authorDaniel Jasper <djasper@google.com>2012-12-05 09:01:09 +0000
committerDaniel Jasper <djasper@google.com>2012-12-05 09:01:09 +0000
commitff1491322e02dbf7da545a1543a8c82a22d5273e (patch)
tree33c4c3b465b51cd6786ae3936e05c76aeb694049 /clang-tools-extra
parent426702dcd0bf1300800b0c023aff29755a8bdc3c (diff)
downloadbcm5719-llvm-ff1491322e02dbf7da545a1543a8c82a22d5273e.tar.gz
bcm5719-llvm-ff1491322e02dbf7da545a1543a8c82a22d5273e.zip
First version of a command line clang-format tool.
Reads a single source range (offset, length) as well as the style guide as parameters and then reformats everything it receives from stdin. llvm-svn: 169364
Diffstat (limited to 'clang-tools-extra')
-rw-r--r--clang-tools-extra/CMakeLists.txt1
-rw-r--r--clang-tools-extra/Makefile2
-rw-r--r--clang-tools-extra/clang-format/CMakeLists.txt13
-rw-r--r--clang-tools-extra/clang-format/ClangFormat.cpp84
-rw-r--r--clang-tools-extra/clang-format/Makefile24
5 files changed, 123 insertions, 1 deletions
diff --git a/clang-tools-extra/CMakeLists.txt b/clang-tools-extra/CMakeLists.txt
index 50cbb36aae9..6a3ee68462c 100644
--- a/clang-tools-extra/CMakeLists.txt
+++ b/clang-tools-extra/CMakeLists.txt
@@ -1,6 +1,7 @@
add_subdirectory(remove-cstr-calls)
add_subdirectory(tool-template)
add_subdirectory(loop-convert)
+add_subdirectory(clang-format)
# Add the common testsuite after all the tools.
add_subdirectory(test)
diff --git a/clang-tools-extra/Makefile b/clang-tools-extra/Makefile
index cf919a599d0..940387ebb46 100644
--- a/clang-tools-extra/Makefile
+++ b/clang-tools-extra/Makefile
@@ -11,7 +11,7 @@ CLANG_LEVEL := ../..
include $(CLANG_LEVEL)/../../Makefile.config
-PARALLEL_DIRS := remove-cstr-calls tool-template loop-convert
+PARALLEL_DIRS := remove-cstr-calls tool-template loop-convert clang-format
include $(CLANG_LEVEL)/Makefile
diff --git a/clang-tools-extra/clang-format/CMakeLists.txt b/clang-tools-extra/clang-format/CMakeLists.txt
new file mode 100644
index 00000000000..218e52abab1
--- /dev/null
+++ b/clang-tools-extra/clang-format/CMakeLists.txt
@@ -0,0 +1,13 @@
+set(LLVM_LINK_COMPONENTS support)
+set(LLVM_USED_LIBS clangFormat clangTooling clangBasic clangAST)
+
+add_clang_executable(clang-format
+ ClangFormat.cpp
+ )
+
+target_link_libraries(clang-format
+ clangFormat
+ clangTooling
+ clangBasic
+ clangRewriteFrontend
+ )
diff --git a/clang-tools-extra/clang-format/ClangFormat.cpp b/clang-tools-extra/clang-format/ClangFormat.cpp
new file mode 100644
index 00000000000..a42d6506561
--- /dev/null
+++ b/clang-tools-extra/clang-format/ClangFormat.cpp
@@ -0,0 +1,84 @@
+//===-- clang-format/ClangFormat.cpp - Clang format tool ------------------===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// \brief This file implements a clang-format tool that automatically formats
+/// (fragments of) C++ code.
+///
+//===----------------------------------------------------------------------===//
+
+#include "clang/Basic/Diagnostic.h"
+#include "clang/Basic/DiagnosticOptions.h"
+#include "clang/Basic/FileManager.h"
+#include "clang/Basic/SourceManager.h"
+#include "clang/Lex/Lexer.h"
+#include "clang/Rewrite/Core/Rewriter.h"
+#include "clang/Format/Format.h"
+#include "llvm/Support/FileSystem.h"
+
+using namespace llvm;
+
+static cl::opt<int> Offset(
+ "offset", cl::desc("Format a range starting at this file offset."),
+ cl::init(0));
+static cl::opt<int> Length(
+ "length", cl::desc("Format a range of this length, -1 for end of file."),
+ cl::init(-1));
+static cl::opt<std::string> Style(
+ "style", cl::desc("Coding style, currently supports: LLVM, Google."),
+ cl::init("LLVM"));
+
+namespace clang {
+namespace format {
+
+static FileID createInMemoryFile(const MemoryBuffer *Source,
+ SourceManager &Sources,
+ FileManager &Files) {
+ const FileEntry *Entry =
+ Files.getVirtualFile("<stdio>", Source->getBufferSize(), 0);
+ Sources.overrideFileContents(Entry, Source, true);
+ return Sources.createFileID(Entry, SourceLocation(), SrcMgr::C_User);
+}
+
+static void format() {
+ FileManager Files((FileSystemOptions()));
+ DiagnosticsEngine Diagnostics(IntrusiveRefCntPtr<DiagnosticIDs>(
+ new DiagnosticIDs), new DiagnosticOptions);
+ SourceManager Sources(Diagnostics, Files);
+ OwningPtr<MemoryBuffer> Code;
+ if (error_code ec = MemoryBuffer::getSTDIN(Code)) {
+ llvm::errs() << ec.message() << "\n";
+ return;
+ }
+ FileID ID = createInMemoryFile(Code.get(), Sources, Files);
+ LangOptions LangOpts;
+ LangOpts.CPlusPlus = 1;
+ Lexer Lex(ID, Sources.getBuffer(ID), Sources, LangOpts);
+ SourceLocation Start =
+ Sources.getLocForStartOfFile(ID).getLocWithOffset(Offset);
+ SourceLocation End = Sources.getLocForEndOfFile(ID);
+ if (Length != -1)
+ End = Start.getLocWithOffset(Length);
+ std::vector<CharSourceRange> Ranges(
+ 1, CharSourceRange::getCharRange(Start, End));
+ FormatStyle FStyle = Style == "LLVM" ? getLLVMStyle() : getGoogleStyle();
+ tooling::Replacements Replaces = reformat(FStyle, Lex, Sources, Ranges);
+ Rewriter Rewrite(Sources, LangOptions());
+ tooling::applyAllReplacements(Replaces, Rewrite);
+ Rewrite.getEditBuffer(ID).write(outs());
+}
+
+} // namespace format
+} // namespace clang
+
+int main(int argc, const char **argv) {
+ cl::ParseCommandLineOptions(argc, argv);
+ clang::format::format();
+ return 0;
+}
diff --git a/clang-tools-extra/clang-format/Makefile b/clang-tools-extra/clang-format/Makefile
new file mode 100644
index 00000000000..4836a5db6b5
--- /dev/null
+++ b/clang-tools-extra/clang-format/Makefile
@@ -0,0 +1,24 @@
+##===- clang-format/Makefile -------------------------------*- Makefile -*-===##
+#
+# The LLVM Compiler Infrastructure
+#
+# This file is distributed under the University of Illinois Open Source
+# License. See LICENSE.TXT for details.
+#
+##===----------------------------------------------------------------------===##
+
+CLANG_LEVEL := ../../..
+
+TOOLNAME = clang-format
+
+# No plugins, optimize startup time.
+TOOL_NO_EXPORTS = 1
+
+include $(CLANG_LEVEL)/../../Makefile.config
+LINK_COMPONENTS := $(TARGETS_TO_BUILD) asmparser support mc
+USEDLIBS = clangFrontend.a clangSerialization.a clangDriver.a \
+ clangTooling.a clangParse.a clangSema.a clangAnalysis.a \
+ clangRewriteFrontend.a clangRewriteCore.a clangEdit.a clangAST.a \
+ clangLex.a clangBasic.a clangFormat.a
+
+include $(CLANG_LEVEL)/Makefile
OpenPOWER on IntegriCloud