From: Daniel Jasper Date: Wed, 5 Dec 2012 09:01:09 +0000 (+0000) Subject: First version of a command line clang-format tool. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ff1491322e02dbf7da545a1543a8c82a22d5273e;p=platform%2Fupstream%2Fllvm.git 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 --- diff --git a/clang-tools-extra/CMakeLists.txt b/clang-tools-extra/CMakeLists.txt index 50cbb36..6a3ee68 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 cf919a5..940387e 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 0000000..218e52a --- /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 0000000..a42d650 --- /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 Offset( + "offset", cl::desc("Format a range starting at this file offset."), + cl::init(0)); +static cl::opt Length( + "length", cl::desc("Format a range of this length, -1 for end of file."), + cl::init(-1)); +static cl::opt 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("", 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( + new DiagnosticIDs), new DiagnosticOptions); + SourceManager Sources(Diagnostics, Files); + OwningPtr 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 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 0000000..4836a5db --- /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