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() << "&#10;";
193651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      break;
194651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines    case '\r':
195651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines      llvm::outs() << "&#13;";
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