forked from OSchip/llvm-project
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
This commit is contained in:
parent
426702dcd0
commit
ff1491322e
|
@ -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)
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
)
|
|
@ -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;
|
||||
}
|
|
@ -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
|
Loading…
Reference in New Issue