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/clang-format/ClangFormat.cpp | |
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/clang-format/ClangFormat.cpp')
-rw-r--r-- | clang-tools-extra/clang-format/ClangFormat.cpp | 84 |
1 files changed, 84 insertions, 0 deletions
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; +} |