diff options
author | Daniel Jasper <djasper@google.com> | 2012-12-05 09:01:09 +0000 |
---|---|---|
committer | Daniel Jasper <djasper@google.com> | 2012-12-05 09:01:09 +0000 |
commit | ff1491322e02dbf7da545a1543a8c82a22d5273e (patch) | |
tree | 33c4c3b465b51cd6786ae3936e05c76aeb694049 /clang-tools-extra | |
parent | 426702dcd0bf1300800b0c023aff29755a8bdc3c (diff) | |
download | bcm5719-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.txt | 1 | ||||
-rw-r--r-- | clang-tools-extra/Makefile | 2 | ||||
-rw-r--r-- | clang-tools-extra/clang-format/CMakeLists.txt | 13 | ||||
-rw-r--r-- | clang-tools-extra/clang-format/ClangFormat.cpp | 84 | ||||
-rw-r--r-- | clang-tools-extra/clang-format/Makefile | 24 |
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 |