brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.3 KiB · fbfce07 Raw
93 lines · cpp
1//===-- tools/extra/clang-reorder-fields/tool/ClangReorderFields.cpp -*- C++ -*-===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8///9/// \file10/// This file contains the implementation of clang-reorder-fields tool11///12//===----------------------------------------------------------------------===//13 14#include "../ReorderFieldsAction.h"15#include "clang/Basic/Diagnostic.h"16#include "clang/Basic/DiagnosticOptions.h"17#include "clang/Basic/FileManager.h"18#include "clang/Basic/LangOptions.h"19#include "clang/Basic/SourceManager.h"20#include "clang/Frontend/TextDiagnosticPrinter.h"21#include "clang/Rewrite/Core/Rewriter.h"22#include "clang/Tooling/CommonOptionsParser.h"23#include "clang/Tooling/Refactoring.h"24#include "clang/Tooling/Tooling.h"25#include "llvm/ADT/IntrusiveRefCntPtr.h"26#include "llvm/Support/CommandLine.h"27#include "llvm/Support/FileSystem.h"28#include <cstdlib>29#include <string>30#include <system_error>31 32using namespace llvm;33using namespace clang;34 35cl::OptionCategory ClangReorderFieldsCategory("clang-reorder-fields options");36 37static cl::opt<std::string>38    RecordName("record-name", cl::Required,39               cl::desc("The name of the struct/class."),40               cl::cat(ClangReorderFieldsCategory));41 42static cl::list<std::string> FieldsOrder("fields-order", cl::CommaSeparated,43                                         cl::OneOrMore,44                                         cl::desc("The desired fields order."),45                                         cl::cat(ClangReorderFieldsCategory));46 47static cl::opt<bool> Inplace("i", cl::desc("Overwrite edited files."),48                             cl::cat(ClangReorderFieldsCategory));49 50const char Usage[] = "A tool to reorder fields in C/C++ structs/classes.\n";51 52int main(int argc, const char **argv) {53  auto ExpectedParser = tooling::CommonOptionsParser::create(54      argc, argv, ClangReorderFieldsCategory, cl::OneOrMore, Usage);55  if (!ExpectedParser) {56    llvm::errs() << ExpectedParser.takeError();57    return 1;58  }59 60  tooling::CommonOptionsParser &OP = ExpectedParser.get();61 62  auto Files = OP.getSourcePathList();63  tooling::RefactoringTool Tool(OP.getCompilations(), Files);64 65  reorder_fields::ReorderFieldsAction Action(RecordName, FieldsOrder,66                                             Tool.getReplacements());67 68  auto Factory = tooling::newFrontendActionFactory(&Action);69 70  if (Inplace)71    return Tool.runAndSave(Factory.get());72 73  int ExitCode = Tool.run(Factory.get());74  LangOptions DefaultLangOptions;75  DiagnosticOptions DiagOpts;76  TextDiagnosticPrinter DiagnosticPrinter(errs(), DiagOpts);77  DiagnosticsEngine Diagnostics(DiagnosticIDs::create(), DiagOpts,78                                &DiagnosticPrinter, false);79 80  auto &FileMgr = Tool.getFiles();81  SourceManager Sources(Diagnostics, FileMgr);82  Rewriter Rewrite(Sources, DefaultLangOptions);83  Tool.applyAllReplacements(Rewrite);84 85  for (const auto &File : Files) {86    auto Entry = llvm::cantFail(FileMgr.getFileRef(File));87    const auto ID = Sources.getOrCreateFileID(Entry, SrcMgr::C_User);88    Rewrite.getEditBuffer(ID).write(outs());89  }90 91  return ExitCode;92}93