// Returns true on error.
static bool format(StringRef FileName) {
    FileManager Files((FileSystemOptions()));
    DiagnosticsEngine Diagnostics(
        IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs),
        new DiagnosticOptions);
    SourceManager Sources(Diagnostics, Files);
    OwningPtr<MemoryBuffer> Code;
    if (error_code ec = MemoryBuffer::getFileOrSTDIN(FileName, Code)) {
        llvm::errs() << ec.message() << "\n";
        return true;
    }
    if (Code->getBufferSize() == 0)
        return false; // Empty files are formatted correctly.
    FileID ID = createInMemoryFile(FileName, Code.get(), Sources, Files);
    std::vector<CharSourceRange> Ranges;
    if (fillRanges(Sources, ID, Code.get(), Ranges))
        return true;

    FormatStyle FormatStyle = getStyle(
                                  Style, (FileName == "-") ? AssumeFilename : FileName, FallbackStyle);
    Lexer Lex(ID, Sources.getBuffer(ID), Sources,
              getFormattingLangOpts(FormatStyle.Standard));
    tooling::Replacements Replaces = reformat(FormatStyle, Lex, Sources, Ranges);
    if (OutputXML) {
        llvm::outs()
                << "<?xml version='1.0'?>\n<replacements xml:space='preserve'>\n";
        for (tooling::Replacements::const_iterator I = Replaces.begin(),
                E = Replaces.end();
                I != E; ++I) {
            llvm::outs() << "<replacement "
                         << "offset='" << I->getOffset() << "' "
                         << "length='" << I->getLength() << "'>";
            outputReplacementXML(I->getReplacementText());
            llvm::outs() << "</replacement>\n";
        }
        llvm::outs() << "</replacements>\n";
    } else {
        Rewriter Rewrite(Sources, LangOptions());
        tooling::applyAllReplacements(Replaces, Rewrite);
        if (Inplace) {
            if (Rewrite.overwriteChangedFiles())
                return true;
        } else {
            if (Cursor.getNumOccurrences() != 0)
                outs() << "{ \"Cursor\": " << tooling::shiftedCodePosition(
                           Replaces, Cursor) << " }\n";
            Rewrite.getEditBuffer(ID).write(outs());
        }
    }
    return false;
}
Beispiel #2
0
// Returns true on error.
static bool format(std::string FileName) {
  FileManager Files((FileSystemOptions()));
  DiagnosticsEngine Diagnostics(
      IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs),
      new DiagnosticOptions);
  SourceManager Sources(Diagnostics, Files);
  OwningPtr<MemoryBuffer> Code;
  if (error_code ec = MemoryBuffer::getFileOrSTDIN(FileName, Code)) {
    llvm::errs() << ec.message() << "\n";
    return true;
  }
  FileID ID = createInMemoryFile(FileName, Code.get(), Sources, Files);
  Lexer Lex(ID, Sources.getBuffer(ID), Sources, getFormattingLangOpts());
  if (Offsets.empty())
    Offsets.push_back(0);
  if (Offsets.size() != Lengths.size() &&
      !(Offsets.size() == 1 && Lengths.empty())) {
    llvm::errs()
        << "error: number of -offset and -length arguments must match.\n";
    return true;
  }
  std::vector<CharSourceRange> Ranges;
  for (unsigned i = 0, e = Offsets.size(); i != e; ++i) {
    if (Offsets[i] >= Code->getBufferSize()) {
      llvm::errs() << "error: offset " << Offsets[i]
                   << " is outside the file\n";
      return true;
    }
    SourceLocation Start =
        Sources.getLocForStartOfFile(ID).getLocWithOffset(Offsets[i]);
    SourceLocation End;
    if (i < Lengths.size()) {
      if (Offsets[i] + Lengths[i] > Code->getBufferSize()) {
        llvm::errs() << "error: invalid length " << Lengths[i]
                     << ", offset + length (" << Offsets[i] + Lengths[i]
                     << ") is outside the file.\n";
        return true;
      }
      End = Start.getLocWithOffset(Lengths[i]);
    } else {
      End = Sources.getLocForEndOfFile(ID);
    }
    Ranges.push_back(CharSourceRange::getCharRange(Start, End));
  }
  tooling::Replacements Replaces = reformat(getStyle(), Lex, Sources, Ranges);
  if (OutputXML) {
    llvm::outs()
        << "<?xml version='1.0'?>\n<replacements xml:space='preserve'>\n";
    for (tooling::Replacements::const_iterator I = Replaces.begin(),
                                               E = Replaces.end();
         I != E; ++I) {
      llvm::outs() << "<replacement "
                   << "offset='" << I->getOffset() << "' "
                   << "length='" << I->getLength() << "'>"
                   << I->getReplacementText() << "</replacement>\n";
    }
    llvm::outs() << "</replacements>\n";
  } else {
    Rewriter Rewrite(Sources, LangOptions());
    tooling::applyAllReplacements(Replaces, Rewrite);
    if (Inplace) {
      if (Replaces.size() == 0)
        return false; // Nothing changed, don't touch the file.

      std::string ErrorInfo;
      llvm::raw_fd_ostream FileStream(FileName.c_str(), ErrorInfo,
                                      llvm::raw_fd_ostream::F_Binary);
      if (!ErrorInfo.empty()) {
        llvm::errs() << "Error while writing file: " << ErrorInfo << "\n";
        return true;
      }
      Rewrite.getEditBuffer(ID).write(FileStream);
      FileStream.flush();
    } else {
      Rewrite.getEditBuffer(ID).write(outs());
    }
  }
  return false;
}