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