17c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper//===-- clang-format/ClangFormat.cpp - Clang format tool ------------------===// 27c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper// 37c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper// The LLVM Compiler Infrastructure 47c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper// 57c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper// This file is distributed under the University of Illinois Open Source 67c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper// License. See LICENSE.TXT for details. 77c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper// 87c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper//===----------------------------------------------------------------------===// 97c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper/// 107c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper/// \file 117c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper/// \brief This file implements a clang-format tool that automatically formats 127c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper/// (fragments of) C++ code. 137c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper/// 147c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper//===----------------------------------------------------------------------===// 157c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper 167c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper#include "clang/Basic/Diagnostic.h" 177c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper#include "clang/Basic/DiagnosticOptions.h" 187c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper#include "clang/Basic/FileManager.h" 197c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper#include "clang/Basic/SourceManager.h" 20651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "clang/Basic/Version.h" 217c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper#include "clang/Format/Format.h" 227c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper#include "clang/Lex/Lexer.h" 237c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper#include "clang/Rewrite/Core/Rewriter.h" 24651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include "llvm/ADT/StringMap.h" 25dd256314cf391063329e504f0ece46ee51bbfa2aAlexander Kornienko#include "llvm/Support/Debug.h" 267c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper#include "llvm/Support/FileSystem.h" 277c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper#include "llvm/Support/Signals.h" 287c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper 297c4a9a04b4b2a44259b34078434e087987872095Daniel Jasperusing namespace llvm; 307c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper 317c4a9a04b4b2a44259b34078434e087987872095Daniel Jasperstatic cl::opt<bool> Help("h", cl::desc("Alias for -help"), cl::Hidden); 327c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper 3346529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko// Mark all our options with this category, everything else (except for -version 3446529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko// and -help) will be hidden. 35651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic cl::OptionCategory ClangFormatCategory("Clang-format options"); 3646529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko 3746529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienkostatic cl::list<unsigned> 3846529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko Offsets("offset", 3946529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko cl::desc("Format a range starting at this byte offset.\n" 4046529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko "Multiple ranges can be formatted by specifying\n" 4146529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko "several -offset and -length pairs.\n" 4246529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko "Can only be used with one input file."), 4346529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko cl::cat(ClangFormatCategory)); 4446529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienkostatic cl::list<unsigned> 4546529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko Lengths("length", 4646529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko cl::desc("Format a range of this length (in bytes).\n" 4746529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko "Multiple ranges can be formatted by specifying\n" 4846529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko "several -offset and -length pairs.\n" 4946529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko "When only a single -offset is specified without\n" 5046529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko "-length, clang-format will format up to the end\n" 5146529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko "of the file.\n" 5246529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko "Can only be used with one input file."), 5346529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko cl::cat(ClangFormatCategory)); 54d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienkostatic cl::list<std::string> 55d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander KornienkoLineRanges("lines", cl::desc("<start line>:<end line> - format a range of\n" 56d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko "lines (both 1-based).\n" 57d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko "Multiple ranges can be formatted by specifying\n" 58d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko "several -lines arguments.\n" 59d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko "Can't be used with -offset and -length.\n" 60d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko "Can only be used with one input file."), 61d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko cl::cat(ClangFormatCategory)); 6246529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienkostatic cl::opt<std::string> 6346529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko Style("style", 64f4e12c8c1325ea04b54ed0b5869258254458b091Edwin Vane cl::desc(clang::format::StyleOptionHelpDescription), 65439fc85f4663810984962a8346d000be79df6bdcChandler Carruth cl::init("file"), cl::cat(ClangFormatCategory)); 66651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic cl::opt<std::string> 67651f13cea278ec967336033dd032faef0e9fc2ecStephen HinesFallbackStyle("fallback-style", 68651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines cl::desc("The name of the predefined style used as a\n" 69651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "fallback in case clang-format is invoked with\n" 70651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines "-style=file, but can not find the .clang-format\n" 716bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "file to use.\n" 726bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines "Use -fallback-style=none to skip formatting."), 73651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines cl::init("LLVM"), cl::cat(ClangFormatCategory)); 7462df7ef28c5a1ed3f5ffd1036162cafe0e1fcd4cDaniel Jasper 7562df7ef28c5a1ed3f5ffd1036162cafe0e1fcd4cDaniel Jasperstatic cl::opt<std::string> 7662df7ef28c5a1ed3f5ffd1036162cafe0e1fcd4cDaniel JasperAssumeFilename("assume-filename", 7762df7ef28c5a1ed3f5ffd1036162cafe0e1fcd4cDaniel Jasper cl::desc("When reading from stdin, clang-format assumes this\n" 7862df7ef28c5a1ed3f5ffd1036162cafe0e1fcd4cDaniel Jasper "filename to look for a style config file (with\n" 7962df7ef28c5a1ed3f5ffd1036162cafe0e1fcd4cDaniel Jasper "-style=file)."), 8062df7ef28c5a1ed3f5ffd1036162cafe0e1fcd4cDaniel Jasper cl::cat(ClangFormatCategory)); 8162df7ef28c5a1ed3f5ffd1036162cafe0e1fcd4cDaniel Jasper 827c4a9a04b4b2a44259b34078434e087987872095Daniel Jasperstatic cl::opt<bool> Inplace("i", 8346529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko cl::desc("Inplace edit <file>s, if specified."), 8446529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko cl::cat(ClangFormatCategory)); 857c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper 8646529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienkostatic cl::opt<bool> OutputXML("output-replacements-xml", 8746529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko cl::desc("Output replacements as XML."), 8846529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko cl::cat(ClangFormatCategory)); 89dd256314cf391063329e504f0ece46ee51bbfa2aAlexander Kornienkostatic cl::opt<bool> 90dd256314cf391063329e504f0ece46ee51bbfa2aAlexander Kornienko DumpConfig("dump-config", 9146529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko cl::desc("Dump configuration options to stdout and exit.\n" 9246529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko "Can be used with -style option."), 9346529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko cl::cat(ClangFormatCategory)); 946bd3b93200c6ae141d0f7444ffb4cacd52b183edDaniel Jasperstatic cl::opt<unsigned> 956bd3b93200c6ae141d0f7444ffb4cacd52b183edDaniel Jasper Cursor("cursor", 967de13bb716a76cf4c0d6593bd06d53a480a8980eAlexander Kornienko cl::desc("The position of the cursor when invoking\n" 977de13bb716a76cf4c0d6593bd06d53a480a8980eAlexander Kornienko "clang-format from an editor integration"), 986bd3b93200c6ae141d0f7444ffb4cacd52b183edDaniel Jasper cl::init(0), cl::cat(ClangFormatCategory)); 997c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper 10046529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienkostatic cl::list<std::string> FileNames(cl::Positional, cl::desc("[<file> ...]"), 10146529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko cl::cat(ClangFormatCategory)); 1027c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper 1037c4a9a04b4b2a44259b34078434e087987872095Daniel Jaspernamespace clang { 1047c4a9a04b4b2a44259b34078434e087987872095Daniel Jaspernamespace format { 1057c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper 106ef8225444452a1486bd721f3285301fe84643b00Stephen Hinesstatic FileID createInMemoryFile(StringRef FileName, MemoryBuffer *Source, 1077c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper SourceManager &Sources, FileManager &Files) { 1087c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper const FileEntry *Entry = Files.getVirtualFile(FileName == "-" ? "<stdin>" : 1097c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper FileName, 1107c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper Source->getBufferSize(), 0); 1117c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper Sources.overrideFileContents(Entry, Source, true); 1127c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper return Sources.createFileID(Entry, SourceLocation(), SrcMgr::C_User); 1137c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper} 1147c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper 115d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko// Parses <start line>:<end line> input to a pair of line numbers. 1164cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko// Returns true on error. 117d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienkostatic bool parseLineRange(StringRef Input, unsigned &FromLine, 118d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko unsigned &ToLine) { 119d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko std::pair<StringRef, StringRef> LineRange = Input.split(':'); 120d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko return LineRange.first.getAsInteger(0, FromLine) || 121d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko LineRange.second.getAsInteger(0, ToLine); 122d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko} 123d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko 124d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienkostatic bool fillRanges(SourceManager &Sources, FileID ID, 125d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko const MemoryBuffer *Code, 126d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko std::vector<CharSourceRange> &Ranges) { 127d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko if (!LineRanges.empty()) { 128d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko if (!Offsets.empty() || !Lengths.empty()) { 129d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko llvm::errs() << "error: cannot use -lines with -offset/-length\n"; 130d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko return true; 131d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko } 132d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko 133d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko for (unsigned i = 0, e = LineRanges.size(); i < e; ++i) { 134d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko unsigned FromLine, ToLine; 135d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko if (parseLineRange(LineRanges[i], FromLine, ToLine)) { 136d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko llvm::errs() << "error: invalid <start line>:<end line> pair\n"; 137d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko return true; 138d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko } 139d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko if (FromLine > ToLine) { 140d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko llvm::errs() << "error: start line should be less than end line\n"; 141d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko return true; 142d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko } 143d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko SourceLocation Start = Sources.translateLineCol(ID, FromLine, 1); 144d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko SourceLocation End = Sources.translateLineCol(ID, ToLine, UINT_MAX); 145d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko if (Start.isInvalid() || End.isInvalid()) 146d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko return true; 147d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko Ranges.push_back(CharSourceRange::getCharRange(Start, End)); 148d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko } 149d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko return false; 1507c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper } 151d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko 1527c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper if (Offsets.empty()) 1537c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper Offsets.push_back(0); 1547c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper if (Offsets.size() != Lengths.size() && 1557c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper !(Offsets.size() == 1 && Lengths.empty())) { 1564cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko llvm::errs() 1574cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko << "error: number of -offset and -length arguments must match.\n"; 1584cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko return true; 1597c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper } 1604cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko for (unsigned i = 0, e = Offsets.size(); i != e; ++i) { 1614cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko if (Offsets[i] >= Code->getBufferSize()) { 1624cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko llvm::errs() << "error: offset " << Offsets[i] 1634cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko << " is outside the file\n"; 1644cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko return true; 1654cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko } 1667c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper SourceLocation Start = 1677c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper Sources.getLocForStartOfFile(ID).getLocWithOffset(Offsets[i]); 1687c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper SourceLocation End; 1697c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper if (i < Lengths.size()) { 1704cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko if (Offsets[i] + Lengths[i] > Code->getBufferSize()) { 1714cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko llvm::errs() << "error: invalid length " << Lengths[i] 1724cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko << ", offset + length (" << Offsets[i] + Lengths[i] 1734cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko << ") is outside the file.\n"; 1744cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko return true; 1754cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko } 1767c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper End = Start.getLocWithOffset(Lengths[i]); 1777c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper } else { 1787c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper End = Sources.getLocForEndOfFile(ID); 1797c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper } 1807c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper Ranges.push_back(CharSourceRange::getCharRange(Start, End)); 1817c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper } 182d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko return false; 183d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko} 184d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko 185651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic void outputReplacementXML(StringRef Text) { 186651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines size_t From = 0; 187651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines size_t Index; 188651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines while ((Index = Text.find_first_of("\n\r", From)) != StringRef::npos) { 189651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::outs() << Text.substr(From, Index - From); 190651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines switch (Text[Index]) { 191651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case '\n': 192651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::outs() << " "; 193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines case '\r': 195651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::outs() << " "; 196651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines break; 197651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines default: 198651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm_unreachable("Unexpected character encountered!"); 199651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 200651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines From = Index + 1; 201651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines } 202651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::outs() << Text.substr(From); 203651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 204651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 205d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko// Returns true on error. 20611d10c32c9f2a893dc101cb9ed12bcd30d9cf1f8Bill Wendlingstatic bool format(StringRef FileName) { 207d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko FileManager Files((FileSystemOptions())); 208d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko DiagnosticsEngine Diagnostics( 209d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs), 210d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko new DiagnosticOptions); 211d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko SourceManager Sources(Diagnostics, Files); 212ef8225444452a1486bd721f3285301fe84643b00Stephen Hines ErrorOr<std::unique_ptr<MemoryBuffer>> CodeOrErr = 213ef8225444452a1486bd721f3285301fe84643b00Stephen Hines MemoryBuffer::getFileOrSTDIN(FileName); 214ef8225444452a1486bd721f3285301fe84643b00Stephen Hines if (std::error_code EC = CodeOrErr.getError()) { 215ef8225444452a1486bd721f3285301fe84643b00Stephen Hines llvm::errs() << EC.message() << "\n"; 216d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko return true; 217d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko } 218ef8225444452a1486bd721f3285301fe84643b00Stephen Hines std::unique_ptr<llvm::MemoryBuffer> Code = std::move(CodeOrErr.get()); 219d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko if (Code->getBufferSize() == 0) 220f7d9e63858138134953e713f948b20a8b8c9a872Daniel Jasper return false; // Empty files are formatted correctly. 221d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko FileID ID = createInMemoryFile(FileName, Code.get(), Sources, Files); 222d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko std::vector<CharSourceRange> Ranges; 223d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko if (fillRanges(Sources, ID, Code.get(), Ranges)) 224d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko return true; 225d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko 226651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FormatStyle FormatStyle = getStyle( 227651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Style, (FileName == "-") ? AssumeFilename : FileName, FallbackStyle); 228a1753f4be12737f36ce9c6eccccddd3be1ec514bAlexander Kornienko Lexer Lex(ID, Sources.getBuffer(ID), Sources, 229a1753f4be12737f36ce9c6eccccddd3be1ec514bAlexander Kornienko getFormattingLangOpts(FormatStyle.Standard)); 230a1753f4be12737f36ce9c6eccccddd3be1ec514bAlexander Kornienko tooling::Replacements Replaces = reformat(FormatStyle, Lex, Sources, Ranges); 2317c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper if (OutputXML) { 2324cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko llvm::outs() 2334cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko << "<?xml version='1.0'?>\n<replacements xml:space='preserve'>\n"; 2347c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper for (tooling::Replacements::const_iterator I = Replaces.begin(), 2357c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper E = Replaces.end(); 2367c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper I != E; ++I) { 2377c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper llvm::outs() << "<replacement " 2387c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper << "offset='" << I->getOffset() << "' " 239651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines << "length='" << I->getLength() << "'>"; 240651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines outputReplacementXML(I->getReplacementText()); 241651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines llvm::outs() << "</replacement>\n"; 2427c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper } 2437c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper llvm::outs() << "</replacements>\n"; 2447c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper } else { 2457c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper Rewriter Rewrite(Sources, LangOptions()); 2467c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper tooling::applyAllReplacements(Replaces, Rewrite); 2477c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper if (Inplace) { 2484a795861e1288de4ac888e787c9e466df21b82b3Alp Toker if (Rewrite.overwriteChangedFiles()) 2494cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko return true; 2507c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper } else { 25133886c7345397058096697a8a031a688a7bef762Daniel Jasper if (Cursor.getNumOccurrences() != 0) 2526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines outs() << "{ \"Cursor\": " 2536bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines << tooling::shiftedCodePosition(Replaces, Cursor) << " }\n"; 2547c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper Rewrite.getEditBuffer(ID).write(outs()); 2557c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper } 2567c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper } 2574cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko return false; 2587c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper} 2597c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper 2607c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper} // namespace format 2617c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper} // namespace clang 2627c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper 263651f13cea278ec967336033dd032faef0e9fc2ecStephen Hinesstatic void PrintVersion() { 264651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines raw_ostream &OS = outs(); 265651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines OS << clang::getClangToolFullVersion("clang-format") << '\n'; 266651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines} 267651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines 2687c4a9a04b4b2a44259b34078434e087987872095Daniel Jasperint main(int argc, const char **argv) { 2697c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper llvm::sys::PrintStackTraceOnErrorSignal(); 27046529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko 27146529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko // Hide unrelated options. 27246529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko StringMap<cl::Option*> Options; 27346529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko cl::getRegisteredOptions(Options); 27446529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko for (StringMap<cl::Option *>::iterator I = Options.begin(), E = Options.end(); 27546529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko I != E; ++I) { 27646529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko if (I->second->Category != &ClangFormatCategory && I->first() != "help" && 27746529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko I->first() != "version") 27846529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko I->second->setHiddenFlag(cl::ReallyHidden); 27946529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko } 28046529e5bf7f46ec8771a091ff3ab9877620f7036Alexander Kornienko 281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines cl::SetVersionPrinter(PrintVersion); 2827c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper cl::ParseCommandLineOptions( 2837c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper argc, argv, 2847c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper "A tool to format C/C++/Obj-C code.\n\n" 2857c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper "If no arguments are specified, it formats the code from standard input\n" 2867c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper "and writes the result to the standard output.\n" 2877de13bb716a76cf4c0d6593bd06d53a480a8980eAlexander Kornienko "If <file>s are given, it reformats the files. If -i is specified\n" 2887de13bb716a76cf4c0d6593bd06d53a480a8980eAlexander Kornienko "together with <file>s, the files are edited in-place. Otherwise, the\n" 2894cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko "result is written to the standard output.\n"); 2904cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko 2917c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper if (Help) 2927c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper cl::PrintHelpMessage(); 2934cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko 294dd256314cf391063329e504f0ece46ee51bbfa2aAlexander Kornienko if (DumpConfig) { 295f4e12c8c1325ea04b54ed0b5869258254458b091Edwin Vane std::string Config = 296f4e12c8c1325ea04b54ed0b5869258254458b091Edwin Vane clang::format::configurationAsText(clang::format::getStyle( 297651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines Style, FileNames.empty() ? AssumeFilename : FileNames[0], 298651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines FallbackStyle)); 299dd256314cf391063329e504f0ece46ee51bbfa2aAlexander Kornienko llvm::outs() << Config << "\n"; 300dd256314cf391063329e504f0ece46ee51bbfa2aAlexander Kornienko return 0; 301dd256314cf391063329e504f0ece46ee51bbfa2aAlexander Kornienko } 302dd256314cf391063329e504f0ece46ee51bbfa2aAlexander Kornienko 3034cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko bool Error = false; 3044cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko switch (FileNames.size()) { 3054cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko case 0: 3064cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko Error = clang::format::format("-"); 3074cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko break; 3084cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko case 1: 3094cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko Error = clang::format::format(FileNames[0]); 3104cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko break; 3114cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko default: 312d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko if (!Offsets.empty() || !Lengths.empty() || !LineRanges.empty()) { 313d95f88a616952ec36d065748f72f75f4d97d6ee7Alexander Kornienko llvm::errs() << "error: -offset, -length and -lines can only be used for " 3144cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko "single file.\n"; 3154cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko return 1; 3164cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko } 3174cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko for (unsigned i = 0; i < FileNames.size(); ++i) 3184cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko Error |= clang::format::format(FileNames[i]); 3194cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko break; 3204cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko } 3214cdc0cde1396df5d937c39c626abe99760197654Alexander Kornienko return Error ? 1 : 0; 3227c4a9a04b4b2a44259b34078434e087987872095Daniel Jasper} 323