From 0b57cec536236d46e3dba9bd041533462f33dbb7 Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Fri, 20 Dec 2019 19:53:05 +0000 Subject: Move all sources from the llvm project into contrib/llvm-project. This uses the new layout of the upstream repository, which was recently migrated to GitHub, and converted into a "monorepo". That is, most of the earlier separate sub-projects with their own branches and tags were consolidated into one top-level directory, and are now branched and tagged together. Updating the vendor area to match this layout is next. --- .../llvm-project/clang/lib/Tooling/Refactoring.cpp | 103 +++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 contrib/llvm-project/clang/lib/Tooling/Refactoring.cpp (limited to 'contrib/llvm-project/clang/lib/Tooling/Refactoring.cpp') diff --git a/contrib/llvm-project/clang/lib/Tooling/Refactoring.cpp b/contrib/llvm-project/clang/lib/Tooling/Refactoring.cpp new file mode 100644 index 000000000000..f379a9c3bcf6 --- /dev/null +++ b/contrib/llvm-project/clang/lib/Tooling/Refactoring.cpp @@ -0,0 +1,103 @@ +//===--- Refactoring.cpp - Framework for clang refactoring tools ----------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// Implements tools to support refactorings. +// +//===----------------------------------------------------------------------===// + +#include "clang/Tooling/Refactoring.h" +#include "clang/Basic/DiagnosticOptions.h" +#include "clang/Basic/FileManager.h" +#include "clang/Basic/SourceManager.h" +#include "clang/Format/Format.h" +#include "clang/Frontend/TextDiagnosticPrinter.h" +#include "clang/Lex/Lexer.h" +#include "clang/Rewrite/Core/Rewriter.h" +#include "llvm/Support/Path.h" +#include "llvm/Support/raw_os_ostream.h" + +namespace clang { +namespace tooling { + +RefactoringTool::RefactoringTool( + const CompilationDatabase &Compilations, ArrayRef SourcePaths, + std::shared_ptr PCHContainerOps) + : ClangTool(Compilations, SourcePaths, std::move(PCHContainerOps)) {} + +std::map &RefactoringTool::getReplacements() { + return FileToReplaces; +} + +int RefactoringTool::runAndSave(FrontendActionFactory *ActionFactory) { + if (int Result = run(ActionFactory)) { + return Result; + } + + LangOptions DefaultLangOptions; + IntrusiveRefCntPtr DiagOpts = new DiagnosticOptions(); + TextDiagnosticPrinter DiagnosticPrinter(llvm::errs(), &*DiagOpts); + DiagnosticsEngine Diagnostics( + IntrusiveRefCntPtr(new DiagnosticIDs()), + &*DiagOpts, &DiagnosticPrinter, false); + SourceManager Sources(Diagnostics, getFiles()); + Rewriter Rewrite(Sources, DefaultLangOptions); + + if (!applyAllReplacements(Rewrite)) { + llvm::errs() << "Skipped some replacements.\n"; + } + + return saveRewrittenFiles(Rewrite); +} + +bool RefactoringTool::applyAllReplacements(Rewriter &Rewrite) { + bool Result = true; + for (const auto &Entry : groupReplacementsByFile( + Rewrite.getSourceMgr().getFileManager(), FileToReplaces)) + Result = tooling::applyAllReplacements(Entry.second, Rewrite) && Result; + return Result; +} + +int RefactoringTool::saveRewrittenFiles(Rewriter &Rewrite) { + return Rewrite.overwriteChangedFiles() ? 1 : 0; +} + +bool formatAndApplyAllReplacements( + const std::map &FileToReplaces, + Rewriter &Rewrite, StringRef Style) { + SourceManager &SM = Rewrite.getSourceMgr(); + FileManager &Files = SM.getFileManager(); + + bool Result = true; + for (const auto &FileAndReplaces : groupReplacementsByFile( + Rewrite.getSourceMgr().getFileManager(), FileToReplaces)) { + const std::string &FilePath = FileAndReplaces.first; + auto &CurReplaces = FileAndReplaces.second; + + const FileEntry *Entry = Files.getFile(FilePath); + FileID ID = SM.getOrCreateFileID(Entry, SrcMgr::C_User); + StringRef Code = SM.getBufferData(ID); + + auto CurStyle = format::getStyle(Style, FilePath, "LLVM"); + if (!CurStyle) { + llvm::errs() << llvm::toString(CurStyle.takeError()) << "\n"; + return false; + } + + auto NewReplacements = + format::formatReplacements(Code, CurReplaces, *CurStyle); + if (!NewReplacements) { + llvm::errs() << llvm::toString(NewReplacements.takeError()) << "\n"; + return false; + } + Result = applyAllReplacements(*NewReplacements, Rewrite) && Result; + } + return Result; +} + +} // end namespace tooling +} // end namespace clang -- cgit v1.2.3