summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra')
-rw-r--r--clang-tools-extra/CMakeLists.txt1
-rw-r--r--clang-tools-extra/clang-rename/CMakeLists.txt19
-rw-r--r--clang-tools-extra/clang-rename/RenamingAction.cpp134
-rw-r--r--clang-tools-extra/clang-rename/RenamingAction.h70
-rw-r--r--clang-tools-extra/clang-rename/USRFinder.cpp213
-rw-r--r--clang-tools-extra/clang-rename/USRFinder.h84
-rw-r--r--clang-tools-extra/clang-rename/USRFindingAction.cpp236
-rw-r--r--clang-tools-extra/clang-rename/USRFindingAction.h54
-rw-r--r--clang-tools-extra/clang-rename/USRLocFinder.cpp509
-rw-r--r--clang-tools-extra/clang-rename/USRLocFinder.h49
-rw-r--r--clang-tools-extra/clang-rename/tool/CMakeLists.txt19
-rw-r--r--clang-tools-extra/clang-rename/tool/ClangRename.cpp240
-rw-r--r--clang-tools-extra/clang-rename/tool/clang-rename.el79
-rw-r--r--clang-tools-extra/clang-rename/tool/clang-rename.py61
-rw-r--r--clang-tools-extra/test/CMakeLists.txt1
-rw-r--r--clang-tools-extra/test/clang-rename/ClassAsTemplateArgument.cpp21
-rw-r--r--clang-tools-extra/test/clang-rename/ClassFindByName.cpp10
-rw-r--r--clang-tools-extra/test/clang-rename/ClassReplacements.cpp11
-rw-r--r--clang-tools-extra/test/clang-rename/ClassSimpleRenaming.cpp14
-rw-r--r--clang-tools-extra/test/clang-rename/ClassTestMulti.cpp11
-rw-r--r--clang-tools-extra/test/clang-rename/ClassTestMultiByName.cpp8
-rw-r--r--clang-tools-extra/test/clang-rename/ComplexFunctionOverride.cpp47
-rw-r--r--clang-tools-extra/test/clang-rename/ComplicatedClassType.cpp63
-rw-r--r--clang-tools-extra/test/clang-rename/Ctor.cpp14
-rw-r--r--clang-tools-extra/test/clang-rename/CtorInitializer.cpp17
-rw-r--r--clang-tools-extra/test/clang-rename/DeclRefExpr.cpp24
-rw-r--r--clang-tools-extra/test/clang-rename/Field.cpp15
-rw-r--r--clang-tools-extra/test/clang-rename/FunctionMacro.cpp20
-rw-r--r--clang-tools-extra/test/clang-rename/FunctionOverride.cpp13
-rw-r--r--clang-tools-extra/test/clang-rename/FunctionWithClassFindByName.cpp12
-rw-r--r--clang-tools-extra/test/clang-rename/IncludeHeaderWithSymbol.cpp10
-rw-r--r--clang-tools-extra/test/clang-rename/Inputs/HeaderWithSymbol.h1
-rw-r--r--clang-tools-extra/test/clang-rename/Inputs/OffsetToNewName.yaml6
-rw-r--r--clang-tools-extra/test/clang-rename/Inputs/QualifiedNameToNewName.yaml6
-rw-r--r--clang-tools-extra/test/clang-rename/InvalidNewName.cpp2
-rw-r--r--clang-tools-extra/test/clang-rename/InvalidOffset.cpp9
-rw-r--r--clang-tools-extra/test/clang-rename/InvalidQualifiedName.cpp4
-rw-r--r--clang-tools-extra/test/clang-rename/MemberExprMacro.cpp22
-rw-r--r--clang-tools-extra/test/clang-rename/Namespace.cpp13
-rw-r--r--clang-tools-extra/test/clang-rename/NoNewName.cpp4
-rw-r--r--clang-tools-extra/test/clang-rename/TemplateClassInstantiation.cpp42
-rw-r--r--clang-tools-extra/test/clang-rename/TemplateTypename.cpp24
-rw-r--r--clang-tools-extra/test/clang-rename/TemplatedClassFunction.cpp22
-rw-r--r--clang-tools-extra/test/clang-rename/UserDefinedConversion.cpp26
-rw-r--r--clang-tools-extra/test/clang-rename/Variable.cpp33
-rw-r--r--clang-tools-extra/test/clang-rename/VariableMacro.cpp21
-rw-r--r--clang-tools-extra/test/clang-rename/YAMLInput.cpp10
-rw-r--r--clang-tools-extra/unittests/CMakeLists.txt1
-rw-r--r--clang-tools-extra/unittests/clang-rename/CMakeLists.txt28
-rw-r--r--clang-tools-extra/unittests/clang-rename/ClangRenameTest.h112
-rw-r--r--clang-tools-extra/unittests/clang-rename/RenameClassTest.cpp684
51 files changed, 0 insertions, 3149 deletions
diff --git a/clang-tools-extra/CMakeLists.txt b/clang-tools-extra/CMakeLists.txt
index ec70fd180fc..ac8f16ba4fc 100644
--- a/clang-tools-extra/CMakeLists.txt
+++ b/clang-tools-extra/CMakeLists.txt
@@ -1,5 +1,4 @@
add_subdirectory(clang-apply-replacements)
-add_subdirectory(clang-rename)
add_subdirectory(clang-reorder-fields)
add_subdirectory(modularize)
if(CLANG_ENABLE_STATIC_ANALYZER)
diff --git a/clang-tools-extra/clang-rename/CMakeLists.txt b/clang-tools-extra/clang-rename/CMakeLists.txt
deleted file mode 100644
index 84e7951e120..00000000000
--- a/clang-tools-extra/clang-rename/CMakeLists.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-set(LLVM_LINK_COMPONENTS support)
-
-add_clang_library(clangRename
- USRFinder.cpp
- USRFindingAction.cpp
- USRLocFinder.cpp
- RenamingAction.cpp
-
- LINK_LIBS
- clangAST
- clangASTMatchers
- clangBasic
- clangIndex
- clangLex
- clangToolingCore
- clangToolingRefactor
- )
-
-add_subdirectory(tool)
diff --git a/clang-tools-extra/clang-rename/RenamingAction.cpp b/clang-tools-extra/clang-rename/RenamingAction.cpp
deleted file mode 100644
index fac04168a0b..00000000000
--- a/clang-tools-extra/clang-rename/RenamingAction.cpp
+++ /dev/null
@@ -1,134 +0,0 @@
-//===--- tools/extra/clang-rename/RenamingAction.cpp - Clang rename tool --===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// \brief Provides an action to rename every symbol at a point.
-///
-//===----------------------------------------------------------------------===//
-
-#include "RenamingAction.h"
-#include "USRLocFinder.h"
-#include "clang/AST/ASTConsumer.h"
-#include "clang/AST/ASTContext.h"
-#include "clang/Basic/FileManager.h"
-#include "clang/Frontend/CompilerInstance.h"
-#include "clang/Frontend/FrontendAction.h"
-#include "clang/Lex/Lexer.h"
-#include "clang/Lex/Preprocessor.h"
-#include "clang/Tooling/CommonOptionsParser.h"
-#include "clang/Tooling/Refactoring.h"
-#include "clang/Tooling/Tooling.h"
-#include <string>
-#include <vector>
-
-using namespace llvm;
-
-namespace clang {
-namespace rename {
-
-class RenamingASTConsumer : public ASTConsumer {
-public:
- RenamingASTConsumer(
- const std::vector<std::string> &NewNames,
- const std::vector<std::string> &PrevNames,
- const std::vector<std::vector<std::string>> &USRList,
- std::map<std::string, tooling::Replacements> &FileToReplaces,
- bool PrintLocations)
- : NewNames(NewNames), PrevNames(PrevNames), USRList(USRList),
- FileToReplaces(FileToReplaces), PrintLocations(PrintLocations) {}
-
- void HandleTranslationUnit(ASTContext &Context) override {
- for (unsigned I = 0; I < NewNames.size(); ++I)
- HandleOneRename(Context, NewNames[I], PrevNames[I], USRList[I]);
- }
-
- void HandleOneRename(ASTContext &Context, const std::string &NewName,
- const std::string &PrevName,
- const std::vector<std::string> &USRs) {
- const SourceManager &SourceMgr = Context.getSourceManager();
- std::vector<SourceLocation> RenamingCandidates;
- std::vector<SourceLocation> NewCandidates;
-
- NewCandidates =
- getLocationsOfUSRs(USRs, PrevName, Context.getTranslationUnitDecl());
- RenamingCandidates.insert(RenamingCandidates.end(), NewCandidates.begin(),
- NewCandidates.end());
-
- unsigned PrevNameLen = PrevName.length();
- for (const auto &Loc : RenamingCandidates) {
- if (PrintLocations) {
- FullSourceLoc FullLoc(Loc, SourceMgr);
- errs() << "clang-rename: renamed at: " << SourceMgr.getFilename(Loc)
- << ":" << FullLoc.getSpellingLineNumber() << ":"
- << FullLoc.getSpellingColumnNumber() << "\n";
- }
- // FIXME: better error handling.
- tooling::Replacement Replace(SourceMgr, Loc, PrevNameLen, NewName);
- llvm::Error Err = FileToReplaces[Replace.getFilePath()].add(Replace);
- if (Err)
- llvm::errs() << "Renaming failed in " << Replace.getFilePath() << "! "
- << llvm::toString(std::move(Err)) << "\n";
- }
- }
-
-private:
- const std::vector<std::string> &NewNames, &PrevNames;
- const std::vector<std::vector<std::string>> &USRList;
- std::map<std::string, tooling::Replacements> &FileToReplaces;
- bool PrintLocations;
-};
-
-// A renamer to rename symbols which are identified by a give USRList to
-// new name.
-//
-// FIXME: Merge with the above RenamingASTConsumer.
-class USRSymbolRenamer : public ASTConsumer {
-public:
- USRSymbolRenamer(const std::vector<std::string> &NewNames,
- const std::vector<std::vector<std::string>> &USRList,
- std::map<std::string, tooling::Replacements> &FileToReplaces)
- : NewNames(NewNames), USRList(USRList), FileToReplaces(FileToReplaces) {
- assert(USRList.size() == NewNames.size());
- }
-
- void HandleTranslationUnit(ASTContext &Context) override {
- for (unsigned I = 0; I < NewNames.size(); ++I) {
- // FIXME: Apply AtomicChanges directly once the refactoring APIs are
- // ready.
- auto AtomicChanges = createRenameAtomicChanges(
- USRList[I], NewNames[I], Context.getTranslationUnitDecl());
- for (const auto AtomicChange : AtomicChanges) {
- for (const auto &Replace : AtomicChange.getReplacements()) {
- llvm::Error Err = FileToReplaces[Replace.getFilePath()].add(Replace);
- if (Err) {
- llvm::errs() << "Renaming failed in " << Replace.getFilePath()
- << "! " << llvm::toString(std::move(Err)) << "\n";
- }
- }
- }
- }
- }
-
-private:
- const std::vector<std::string> &NewNames;
- const std::vector<std::vector<std::string>> &USRList;
- std::map<std::string, tooling::Replacements> &FileToReplaces;
-};
-
-std::unique_ptr<ASTConsumer> RenamingAction::newASTConsumer() {
- return llvm::make_unique<RenamingASTConsumer>(NewNames, PrevNames, USRList,
- FileToReplaces, PrintLocations);
-}
-
-std::unique_ptr<ASTConsumer> QualifiedRenamingAction::newASTConsumer() {
- return llvm::make_unique<USRSymbolRenamer>(NewNames, USRList, FileToReplaces);
-}
-
-} // namespace rename
-} // namespace clang
diff --git a/clang-tools-extra/clang-rename/RenamingAction.h b/clang-tools-extra/clang-rename/RenamingAction.h
deleted file mode 100644
index e8b98b20c50..00000000000
--- a/clang-tools-extra/clang-rename/RenamingAction.h
+++ /dev/null
@@ -1,70 +0,0 @@
-//===--- tools/extra/clang-rename/RenamingAction.h - Clang rename tool ----===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// \brief Provides an action to rename every symbol at a point.
-///
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_RENAME_RENAMING_ACTION_H
-#define LLVM_CLANG_TOOLS_EXTRA_CLANG_RENAME_RENAMING_ACTION_H
-
-#include "clang/Tooling/Refactoring.h"
-
-namespace clang {
-class ASTConsumer;
-class CompilerInstance;
-
-namespace rename {
-
-class RenamingAction {
-public:
- RenamingAction(const std::vector<std::string> &NewNames,
- const std::vector<std::string> &PrevNames,
- const std::vector<std::vector<std::string>> &USRList,
- std::map<std::string, tooling::Replacements> &FileToReplaces,
- bool PrintLocations = false)
- : NewNames(NewNames), PrevNames(PrevNames), USRList(USRList),
- FileToReplaces(FileToReplaces), PrintLocations(PrintLocations) {}
-
- std::unique_ptr<ASTConsumer> newASTConsumer();
-
-private:
- const std::vector<std::string> &NewNames, &PrevNames;
- const std::vector<std::vector<std::string>> &USRList;
- std::map<std::string, tooling::Replacements> &FileToReplaces;
- bool PrintLocations;
-};
-
-/// Rename all symbols identified by the given USRs.
-class QualifiedRenamingAction {
-public:
- QualifiedRenamingAction(
- const std::vector<std::string> &NewNames,
- const std::vector<std::vector<std::string>> &USRList,
- std::map<std::string, tooling::Replacements> &FileToReplaces)
- : NewNames(NewNames), USRList(USRList), FileToReplaces(FileToReplaces) {}
-
- std::unique_ptr<ASTConsumer> newASTConsumer();
-
-private:
- /// New symbol names.
- const std::vector<std::string> &NewNames;
-
- /// A list of USRs. Each element represents USRs of a symbol being renamed.
- const std::vector<std::vector<std::string>> &USRList;
-
- /// A file path to replacements map.
- std::map<std::string, tooling::Replacements> &FileToReplaces;
-};
-
-} // namespace rename
-} // namespace clang
-
-#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_RENAME_RENAMING_ACTION_H
diff --git a/clang-tools-extra/clang-rename/USRFinder.cpp b/clang-tools-extra/clang-rename/USRFinder.cpp
deleted file mode 100644
index 901e402ac17..00000000000
--- a/clang-tools-extra/clang-rename/USRFinder.cpp
+++ /dev/null
@@ -1,213 +0,0 @@
-//===--- tools/extra/clang-rename/USRFinder.cpp - Clang rename tool -------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file Implements a recursive AST visitor that finds the USR of a symbol at a
-/// point.
-///
-//===----------------------------------------------------------------------===//
-
-#include "USRFinder.h"
-#include "clang/AST/AST.h"
-#include "clang/AST/ASTContext.h"
-#include "clang/AST/RecursiveASTVisitor.h"
-#include "clang/Index/USRGeneration.h"
-#include "clang/Lex/Lexer.h"
-#include "llvm/ADT/SmallVector.h"
-
-using namespace llvm;
-
-namespace clang {
-namespace rename {
-
-// NamedDeclFindingASTVisitor recursively visits each AST node to find the
-// symbol underneath the cursor.
-// FIXME: move to separate .h/.cc file if this gets too large.
-namespace {
-class NamedDeclFindingASTVisitor
- : public clang::RecursiveASTVisitor<NamedDeclFindingASTVisitor> {
-public:
- // \brief Finds the NamedDecl at a point in the source.
- // \param Point the location in the source to search for the NamedDecl.
- explicit NamedDeclFindingASTVisitor(const SourceLocation Point,
- const ASTContext &Context)
- : Result(nullptr), Point(Point), Context(Context) {}
-
- // \brief Finds the NamedDecl for a name in the source.
- // \param Name the fully qualified name.
- explicit NamedDeclFindingASTVisitor(const std::string &Name,
- const ASTContext &Context)
- : Result(nullptr), Name(Name), Context(Context) {}
-
- // Declaration visitors:
-
- // \brief Checks if the point falls within the NameDecl. This covers every
- // declaration of a named entity that we may come across. Usually, just
- // checking if the point lies within the length of the name of the declaration
- // and the start location is sufficient.
- bool VisitNamedDecl(const NamedDecl *Decl) {
- return dyn_cast<CXXConversionDecl>(Decl)
- ? true
- : setResult(Decl, Decl->getLocation(),
- Decl->getNameAsString().length());
- }
-
- // Expression visitors:
-
- bool VisitDeclRefExpr(const DeclRefExpr *Expr) {
- const NamedDecl *Decl = Expr->getFoundDecl();
- return setResult(Decl, Expr->getLocation(),
- Decl->getNameAsString().length());
- }
-
- bool VisitMemberExpr(const MemberExpr *Expr) {
- const NamedDecl *Decl = Expr->getFoundDecl().getDecl();
- return setResult(Decl, Expr->getMemberLoc(),
- Decl->getNameAsString().length());
- }
-
- // Other visitors:
-
- bool VisitTypeLoc(const TypeLoc Loc) {
- const SourceLocation TypeBeginLoc = Loc.getBeginLoc();
- const SourceLocation TypeEndLoc = Lexer::getLocForEndOfToken(
- TypeBeginLoc, 0, Context.getSourceManager(), Context.getLangOpts());
- if (const auto *TemplateTypeParm =
- dyn_cast<TemplateTypeParmType>(Loc.getType()))
- return setResult(TemplateTypeParm->getDecl(), TypeBeginLoc, TypeEndLoc);
- if (const auto *TemplateSpecType =
- dyn_cast<TemplateSpecializationType>(Loc.getType())) {
- return setResult(TemplateSpecType->getTemplateName().getAsTemplateDecl(),
- TypeBeginLoc, TypeEndLoc);
- }
- return setResult(Loc.getType()->getAsCXXRecordDecl(), TypeBeginLoc,
- TypeEndLoc);
- }
-
- bool VisitCXXConstructorDecl(clang::CXXConstructorDecl *ConstructorDecl) {
- for (const auto *Initializer : ConstructorDecl->inits()) {
- // Ignore implicit initializers.
- if (!Initializer->isWritten())
- continue;
- if (const clang::FieldDecl *FieldDecl = Initializer->getMember()) {
- const SourceLocation InitBeginLoc = Initializer->getSourceLocation(),
- InitEndLoc = Lexer::getLocForEndOfToken(
- InitBeginLoc, 0, Context.getSourceManager(),
- Context.getLangOpts());
- if (!setResult(FieldDecl, InitBeginLoc, InitEndLoc))
- return false;
- }
- }
- return true;
- }
-
- // Other:
-
- const NamedDecl *getNamedDecl() { return Result; }
-
- // \brief Determines if a namespace qualifier contains the point.
- // \returns false on success and sets Result.
- void handleNestedNameSpecifierLoc(NestedNameSpecifierLoc NameLoc) {
- while (NameLoc) {
- const NamespaceDecl *Decl =
- NameLoc.getNestedNameSpecifier()->getAsNamespace();
- setResult(Decl, NameLoc.getLocalBeginLoc(), NameLoc.getLocalEndLoc());
- NameLoc = NameLoc.getPrefix();
- }
- }
-
-private:
- // \brief Sets Result to Decl if the Point is within Start and End.
- // \returns false on success.
- bool setResult(const NamedDecl *Decl, SourceLocation Start,
- SourceLocation End) {
- if (!Decl)
- return true;
- if (Name.empty()) {
- // Offset is used to find the declaration.
- if (!Start.isValid() || !Start.isFileID() || !End.isValid() ||
- !End.isFileID() || !isPointWithin(Start, End))
- return true;
- } else {
- // Fully qualified name is used to find the declaration.
- if (Name != Decl->getQualifiedNameAsString() &&
- Name != "::" + Decl->getQualifiedNameAsString())
- return true;
- }
- Result = Decl;
- return false;
- }
-
- // \brief Sets Result to Decl if Point is within Loc and Loc + Offset.
- // \returns false on success.
- bool setResult(const NamedDecl *Decl, SourceLocation Loc, unsigned Offset) {
- // FIXME: Add test for Offset == 0. Add test for Offset - 1 (vs -2 etc).
- return Offset == 0 ||
- setResult(Decl, Loc, Loc.getLocWithOffset(Offset - 1));
- }
-
- // \brief Determines if the Point is within Start and End.
- bool isPointWithin(const SourceLocation Start, const SourceLocation End) {
- // FIXME: Add tests for Point == End.
- return Point == Start || Point == End ||
- (Context.getSourceManager().isBeforeInTranslationUnit(Start,
- Point) &&
- Context.getSourceManager().isBeforeInTranslationUnit(Point, End));
- }
-
- const NamedDecl *Result;
- const SourceLocation Point; // The location to find the NamedDecl.
- const std::string Name;
- const ASTContext &Context;
-};
-} // namespace
-
-const NamedDecl *getNamedDeclAt(const ASTContext &Context,
- const SourceLocation Point) {
- const SourceManager &SM = Context.getSourceManager();
- NamedDeclFindingASTVisitor Visitor(Point, Context);
-
- // Try to be clever about pruning down the number of top-level declarations we
- // see. If both start and end is either before or after the point we're
- // looking for the point cannot be inside of this decl. Don't even look at it.
- for (auto *CurrDecl : Context.getTranslationUnitDecl()->decls()) {
- SourceLocation StartLoc = CurrDecl->getLocStart();
- SourceLocation EndLoc = CurrDecl->getLocEnd();
- if (StartLoc.isValid() && EndLoc.isValid() &&
- SM.isBeforeInTranslationUnit(StartLoc, Point) !=
- SM.isBeforeInTranslationUnit(EndLoc, Point))
- Visitor.TraverseDecl(CurrDecl);
- }
-
- NestedNameSpecifierLocFinder Finder(const_cast<ASTContext &>(Context));
- for (const auto &Location : Finder.getNestedNameSpecifierLocations())
- Visitor.handleNestedNameSpecifierLoc(Location);
-
- return Visitor.getNamedDecl();
-}
-
-const NamedDecl *getNamedDeclFor(const ASTContext &Context,
- const std::string &Name) {
- NamedDeclFindingASTVisitor Visitor(Name, Context);
- Visitor.TraverseDecl(Context.getTranslationUnitDecl());
-
- return Visitor.getNamedDecl();
-}
-
-std::string getUSRForDecl(const Decl *Decl) {
- llvm::SmallVector<char, 128> Buff;
-
- // FIXME: Add test for the nullptr case.
- if (Decl == nullptr || index::generateUSRForDecl(Decl, Buff))
- return "";
-
- return std::string(Buff.data(), Buff.size());
-}
-
-} // namespace rename
-} // namespace clang
diff --git a/clang-tools-extra/clang-rename/USRFinder.h b/clang-tools-extra/clang-rename/USRFinder.h
deleted file mode 100644
index 99ecda0dd4a..00000000000
--- a/clang-tools-extra/clang-rename/USRFinder.h
+++ /dev/null
@@ -1,84 +0,0 @@
-//===--- tools/extra/clang-rename/USRFinder.h - Clang rename tool ---------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// \brief Methods for determining the USR of a symbol at a location in source
-/// code.
-///
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_RENAME_USR_FINDER_H
-#define LLVM_CLANG_TOOLS_EXTRA_CLANG_RENAME_USR_FINDER_H
-
-#include "clang/AST/AST.h"
-#include "clang/AST/ASTContext.h"
-#include "clang/ASTMatchers/ASTMatchFinder.h"
-#include <string>
-#include <vector>
-
-using namespace llvm;
-using namespace clang::ast_matchers;
-
-namespace clang {
-
-class ASTContext;
-class Decl;
-class SourceLocation;
-class NamedDecl;
-
-namespace rename {
-
-// Given an AST context and a point, returns a NamedDecl identifying the symbol
-// at the point. Returns null if nothing is found at the point.
-const NamedDecl *getNamedDeclAt(const ASTContext &Context,
- const SourceLocation Point);
-
-// Given an AST context and a fully qualified name, returns a NamedDecl
-// identifying the symbol with a matching name. Returns null if nothing is
-// found for the name.
-const NamedDecl *getNamedDeclFor(const ASTContext &Context,
- const std::string &Name);
-
-// Converts a Decl into a USR.
-std::string getUSRForDecl(const Decl *Decl);
-
-// FIXME: Implement RecursiveASTVisitor<T>::VisitNestedNameSpecifier instead.
-class NestedNameSpecifierLocFinder : public MatchFinder::MatchCallback {
-public:
- explicit NestedNameSpecifierLocFinder(ASTContext &Context)
- : Context(Context) {}
-
- std::vector<NestedNameSpecifierLoc> getNestedNameSpecifierLocations() {
- addMatchers();
- Finder.matchAST(Context);
- return Locations;
- }
-
-private:
- void addMatchers() {
- const auto NestedNameSpecifierLocMatcher =
- nestedNameSpecifierLoc().bind("nestedNameSpecifierLoc");
- Finder.addMatcher(NestedNameSpecifierLocMatcher, this);
- }
-
- void run(const MatchFinder::MatchResult &Result) override {
- const auto *NNS = Result.Nodes.getNodeAs<NestedNameSpecifierLoc>(
- "nestedNameSpecifierLoc");
- Locations.push_back(*NNS);
- }
-
- ASTContext &Context;
- std::vector<NestedNameSpecifierLoc> Locations;
- MatchFinder Finder;
-};
-
-} // namespace rename
-} // namespace clang
-
-#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_RENAME_USR_FINDER_H
diff --git a/clang-tools-extra/clang-rename/USRFindingAction.cpp b/clang-tools-extra/clang-rename/USRFindingAction.cpp
deleted file mode 100644
index 515acfbd508..00000000000
--- a/clang-tools-extra/clang-rename/USRFindingAction.cpp
+++ /dev/null
@@ -1,236 +0,0 @@
-//===--- tools/extra/clang-rename/USRFindingAction.cpp - Clang rename tool ===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// \brief Provides an action to find USR for the symbol at <offset>, as well as
-/// all additional USRs.
-///
-//===----------------------------------------------------------------------===//
-
-#include "USRFindingAction.h"
-#include "USRFinder.h"
-#include "clang/AST/AST.h"
-#include "clang/AST/ASTConsumer.h"
-#include "clang/AST/ASTContext.h"
-#include "clang/AST/Decl.h"
-#include "clang/AST/RecursiveASTVisitor.h"
-#include "clang/Basic/FileManager.h"
-#include "clang/Frontend/CompilerInstance.h"
-#include "clang/Frontend/FrontendAction.h"
-#include "clang/Lex/Lexer.h"
-#include "clang/Lex/Preprocessor.h"
-#include "clang/Tooling/CommonOptionsParser.h"
-#include "clang/Tooling/Refactoring.h"
-#include "clang/Tooling/Tooling.h"
-
-#include <algorithm>
-#include <set>
-#include <string>
-#include <vector>
-
-using namespace llvm;
-
-namespace clang {
-namespace rename {
-
-namespace {
-// \brief NamedDeclFindingConsumer should delegate finding USRs of given Decl to
-// AdditionalUSRFinder. AdditionalUSRFinder adds USRs of ctor and dtor if given
-// Decl refers to class and adds USRs of all overridden methods if Decl refers
-// to virtual method.
-class AdditionalUSRFinder : public RecursiveASTVisitor<AdditionalUSRFinder> {
-public:
- AdditionalUSRFinder(const Decl *FoundDecl, ASTContext &Context)
- : FoundDecl(FoundDecl), Context(Context) {}
-
- std::vector<std::string> Find() {
- // Fill OverriddenMethods and PartialSpecs storages.
- TraverseDecl(Context.getTranslationUnitDecl());
- if (const auto *MethodDecl = dyn_cast<CXXMethodDecl>(FoundDecl)) {
- addUSRsOfOverridenFunctions(MethodDecl);
- for (const auto &OverriddenMethod : OverriddenMethods) {
- if (checkIfOverriddenFunctionAscends(OverriddenMethod))
- USRSet.insert(getUSRForDecl(OverriddenMethod));
- }
- } else if (const auto *RecordDecl = dyn_cast<CXXRecordDecl>(FoundDecl)) {
- handleCXXRecordDecl(RecordDecl);
- } else if (const auto *TemplateDecl =
- dyn_cast<ClassTemplateDecl>(FoundDecl)) {
- handleClassTemplateDecl(TemplateDecl);
- } else {
- USRSet.insert(getUSRForDecl(FoundDecl));
- }
- return std::vector<std::string>(USRSet.begin(), USRSet.end());
- }
-
- bool VisitCXXMethodDecl(const CXXMethodDecl *MethodDecl) {
- if (MethodDecl->isVirtual())
- OverriddenMethods.push_back(MethodDecl);
- return true;
- }
-
- bool VisitClassTemplatePartialSpecializationDecl(
- const ClassTemplatePartialSpecializationDecl *PartialSpec) {
- PartialSpecs.push_back(PartialSpec);
- return true;
- }
-
-private:
- void handleCXXRecordDecl(const CXXRecordDecl *RecordDecl) {
- RecordDecl = RecordDecl->getDefinition();
- if (const auto *ClassTemplateSpecDecl =
- dyn_cast<ClassTemplateSpecializationDecl>(RecordDecl))
- handleClassTemplateDecl(ClassTemplateSpecDecl->getSpecializedTemplate());
- addUSRsOfCtorDtors(RecordDecl);
- }
-
- void handleClassTemplateDecl(const ClassTemplateDecl *TemplateDecl) {
- for (const auto *Specialization : TemplateDecl->specializations())
- addUSRsOfCtorDtors(Specialization);
-
- for (const auto *PartialSpec : PartialSpecs) {
- if (PartialSpec->getSpecializedTemplate() == TemplateDecl)
- addUSRsOfCtorDtors(PartialSpec);
- }
- addUSRsOfCtorDtors(TemplateDecl->getTemplatedDecl());
- }
-
- void addUSRsOfCtorDtors(const CXXRecordDecl *RecordDecl) {
- RecordDecl = RecordDecl->getDefinition();
-
- // Skip if the CXXRecordDecl doesn't have definition.
- if (!RecordDecl)
- return;
-
- for (const auto *CtorDecl : RecordDecl->ctors())
- USRSet.insert(getUSRForDecl(CtorDecl));
-
- USRSet.insert(getUSRForDecl(RecordDecl->getDestructor()));
- USRSet.insert(getUSRForDecl(RecordDecl));
- }
-
- void addUSRsOfOverridenFunctions(const CXXMethodDecl *MethodDecl) {
- USRSet.insert(getUSRForDecl(MethodDecl));
- // Recursively visit each OverridenMethod.
- for (const auto &OverriddenMethod : MethodDecl->overridden_methods())
- addUSRsOfOverridenFunctions(OverriddenMethod);
- }
-
- bool checkIfOverriddenFunctionAscends(const CXXMethodDecl *MethodDecl) {
- for (const auto &OverriddenMethod : MethodDecl->overridden_methods()) {
- if (USRSet.find(getUSRForDecl(OverriddenMethod)) != USRSet.end())
- return true;
- return checkIfOverriddenFunctionAscends(OverriddenMethod);
- }
- return false;
- }
-
- const Decl *FoundDecl;
- ASTContext &Context;
- std::set<std::string> USRSet;
- std::vector<const CXXMethodDecl *> OverriddenMethods;
- std::vector<const ClassTemplatePartialSpecializationDecl *> PartialSpecs;
-};
-} // namespace
-
-class NamedDeclFindingConsumer : public ASTConsumer {
-public:
- NamedDeclFindingConsumer(ArrayRef<unsigned> SymbolOffsets,
- ArrayRef<std::string> QualifiedNames,
- std::vector<std::string> &SpellingNames,
- std::vector<std::vector<std::string>> &USRList,
- bool Force, bool &ErrorOccurred)
- : SymbolOffsets(SymbolOffsets), QualifiedNames(QualifiedNames),
- SpellingNames(SpellingNames), USRList(USRList), Force(Force),
- ErrorOccurred(ErrorOccurred) {}
-
-private:
- bool FindSymbol(ASTContext &Context, const SourceManager &SourceMgr,
- unsigned SymbolOffset, const std::string &QualifiedName) {
- DiagnosticsEngine &Engine = Context.getDiagnostics();
- const FileID MainFileID = SourceMgr.getMainFileID();
-
- if (SymbolOffset >= SourceMgr.getFileIDSize(MainFileID)) {
- ErrorOccurred = true;
- unsigned InvalidOffset = Engine.getCustomDiagID(
- DiagnosticsEngine::Error,
- "SourceLocation in file %0 at offset %1 is invalid");
- Engine.Report(SourceLocation(), InvalidOffset)
- << SourceMgr.getFileEntryForID(MainFileID)->getName() << SymbolOffset;
- return false;
- }
-
- const SourceLocation Point = SourceMgr.getLocForStartOfFile(MainFileID)
- .getLocWithOffset(SymbolOffset);
- const NamedDecl *FoundDecl = QualifiedName.empty()
- ? getNamedDeclAt(Context, Point)
- : getNamedDeclFor(Context, QualifiedName);
-
- if (FoundDecl == nullptr) {
- if (QualifiedName.empty()) {
- FullSourceLoc FullLoc(Point, SourceMgr);
- unsigned CouldNotFindSymbolAt = Engine.getCustomDiagID(
- DiagnosticsEngine::Error,
- "clang-rename could not find symbol (offset %0)");
- Engine.Report(Point, CouldNotFindSymbolAt) << SymbolOffset;
- ErrorOccurred = true;
- return false;
- }
-
- if (Force)
- return true;
-
- unsigned CouldNotFindSymbolNamed = Engine.getCustomDiagID(
- DiagnosticsEngine::Error, "clang-rename could not find symbol %0");
- Engine.Report(CouldNotFindSymbolNamed) << QualifiedName;
- ErrorOccurred = true;
- return false;
- }
-
- // If FoundDecl is a constructor or destructor, we want to instead take
- // the Decl of the corresponding class.
- if (const auto *CtorDecl = dyn_cast<CXXConstructorDecl>(FoundDecl))
- FoundDecl = CtorDecl->getParent();
- else if (const auto *DtorDecl = dyn_cast<CXXDestructorDecl>(FoundDecl))
- FoundDecl = DtorDecl->getParent();
-
- SpellingNames.push_back(FoundDecl->getNameAsString());
- AdditionalUSRFinder Finder(FoundDecl, Context);
- USRList.push_back(Finder.Find());
- return true;
- }
-
- void HandleTranslationUnit(ASTContext &Context) override {
- const SourceManager &SourceMgr = Context.getSourceManager();
- for (unsigned Offset : SymbolOffsets) {
- if (!FindSymbol(Context, SourceMgr, Offset, ""))
- return;
- }
- for (const std::string &QualifiedName : QualifiedNames) {
- if (!FindSymbol(Context, SourceMgr, 0, QualifiedName))
- return;
- }
- }
-
- ArrayRef<unsigned> SymbolOffsets;
- ArrayRef<std::string> QualifiedNames;
- std::vector<std::string> &SpellingNames;
- std::vector<std::vector<std::string>> &USRList;
- bool Force;
- bool &ErrorOccurred;
-};
-
-std::unique_ptr<ASTConsumer> USRFindingAction::newASTConsumer() {
- return llvm::make_unique<NamedDeclFindingConsumer>(
- SymbolOffsets, QualifiedNames, SpellingNames, USRList, Force,
- ErrorOccurred);
-}
-
-} // namespace rename
-} // namespace clang
diff --git a/clang-tools-extra/clang-rename/USRFindingAction.h b/clang-tools-extra/clang-rename/USRFindingAction.h
deleted file mode 100644
index ac27daddff2..00000000000
--- a/clang-tools-extra/clang-rename/USRFindingAction.h
+++ /dev/null
@@ -1,54 +0,0 @@
-//===--- tools/extra/clang-rename/USRFindingAction.h - Clang rename tool --===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// \brief Provides an action to find all relevant USRs at a point.
-///
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_RENAME_USR_FINDING_ACTION_H
-#define LLVM_CLANG_TOOLS_EXTRA_CLANG_RENAME_USR_FINDING_ACTION_H
-
-#include "clang/Basic/LLVM.h"
-#include "llvm/ADT/ArrayRef.h"
-
-#include <string>
-#include <vector>
-
-namespace clang {
-class ASTConsumer;
-class CompilerInstance;
-class NamedDecl;
-
-namespace rename {
-
-struct USRFindingAction {
- USRFindingAction(ArrayRef<unsigned> SymbolOffsets,
- ArrayRef<std::string> QualifiedNames, bool Force)
- : SymbolOffsets(SymbolOffsets), QualifiedNames(QualifiedNames),
- ErrorOccurred(false), Force(Force) {}
- std::unique_ptr<ASTConsumer> newASTConsumer();
-
- ArrayRef<std::string> getUSRSpellings() { return SpellingNames; }
- ArrayRef<std::vector<std::string>> getUSRList() { return USRList; }
- bool errorOccurred() { return ErrorOccurred; }
-
-private:
- std::vector<unsigned> SymbolOffsets;
- std::vector<std::string> QualifiedNames;
- std::vector<std::string> SpellingNames;
- std::vector<std::vector<std::string>> USRList;
- bool ErrorOccurred;
- bool Force;
-};
-
-} // namespace rename
-} // namespace clang
-
-#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_RENAME_USR_FINDING_ACTION_H
diff --git a/clang-tools-extra/clang-rename/USRLocFinder.cpp b/clang-tools-extra/clang-rename/USRLocFinder.cpp
deleted file mode 100644
index 06afb013c51..00000000000
--- a/clang-tools-extra/clang-rename/USRLocFinder.cpp
+++ /dev/null
@@ -1,509 +0,0 @@
-//===--- tools/extra/clang-rename/USRLocFinder.cpp - Clang rename tool ----===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// \brief Mehtods for finding all instances of a USR. Our strategy is very
-/// simple; we just compare the USR at every relevant AST node with the one
-/// provided.
-///
-//===----------------------------------------------------------------------===//
-
-#include "USRLocFinder.h"
-#include "USRFinder.h"
-#include "clang/AST/ASTContext.h"
-#include "clang/AST/RecursiveASTVisitor.h"
-#include "clang/Basic/LLVM.h"
-#include "clang/Basic/SourceLocation.h"
-#include "clang/Basic/SourceManager.h"
-#include "clang/Lex/Lexer.h"
-#include "clang/Tooling/Core/Lookup.h"
-#include "llvm/ADT/StringRef.h"
-#include "llvm/Support/Casting.h"
-#include <cstddef>
-#include <set>
-#include <string>
-#include <vector>
-
-using namespace llvm;
-
-namespace clang {
-namespace rename {
-
-namespace {
-
-// \brief This visitor recursively searches for all instances of a USR in a
-// translation unit and stores them for later usage.
-class USRLocFindingASTVisitor
- : public clang::RecursiveASTVisitor<USRLocFindingASTVisitor> {
-public:
- explicit USRLocFindingASTVisitor(const std::vector<std::string> &USRs,
- StringRef PrevName,
- const ASTContext &Context)
- : USRSet(USRs.begin(), USRs.end()), PrevName(PrevName), Context(Context) {
- }
-
- // Declaration visitors:
-
- bool VisitCXXConstructorDecl(clang::CXXConstructorDecl *ConstructorDecl) {
- for (const auto *Initializer : ConstructorDecl->inits()) {
- // Ignore implicit initializers.
- if (!Initializer->isWritten())
- continue;
- if (const clang::FieldDecl *FieldDecl = Initializer->getMember()) {
- if (USRSet.find(getUSRForDecl(FieldDecl)) != USRSet.end())
- LocationsFound.push_back(Initializer->getSourceLocation());
- }
- }
- return true;
- }
-
- bool VisitNamedDecl(const NamedDecl *Decl) {
- if (USRSet.find(getUSRForDecl(Decl)) != USRSet.end())
- checkAndAddLocation(Decl->getLocation());
- return true;
- }
-
- // Expression visitors:
-
- bool VisitDeclRefExpr(const DeclRefExpr *Expr) {
- const NamedDecl *Decl = Expr->getFoundDecl();
-
- if (USRSet.find(getUSRForDecl(Decl)) != USRSet.end()) {
- const SourceManager &Manager = Decl->getASTContext().getSourceManager();
- SourceLocation Location = Manager.getSpellingLoc(Expr->getLocation());
- checkAndAddLocation(Location);
- }
-
- return true;
- }
-
- bool VisitMemberExpr(const MemberExpr *Expr) {
- const NamedDecl *Decl = Expr->getFoundDecl().getDecl();
- if (USRSet.find(getUSRForDecl(Decl)) != USRSet.end()) {
- const SourceManager &Manager = Decl->getASTContext().getSourceManager();
- SourceLocation Location = Manager.getSpellingLoc(Expr->getMemberLoc());
- checkAndAddLocation(Location);
- }
- return true;
- }
-
- // Other visitors:
-
- bool VisitTypeLoc(const TypeLoc Loc) {
- if (USRSet.find(getUSRForDecl(Loc.getType()->getAsCXXRecordDecl())) !=
- USRSet.end())
- checkAndAddLocation(Loc.getBeginLoc());
- if (const auto *TemplateTypeParm =
- dyn_cast<TemplateTypeParmType>(Loc.getType())) {
- if (USRSet.find(getUSRForDecl(TemplateTypeParm->getDecl())) !=
- USRSet.end())
- checkAndAddLocation(Loc.getBeginLoc());
- }
- return true;
- }
-
- // Non-visitors:
-
- // \brief Returns a list of unique locations. Duplicate or overlapping
- // locations are erroneous and should be reported!
- const std::vector<clang::SourceLocation> &getLocationsFound() const {
- return LocationsFound;
- }
-
- // Namespace traversal:
- void handleNestedNameSpecifierLoc(NestedNameSpecifierLoc NameLoc) {
- while (NameLoc) {
- const NamespaceDecl *Decl =
- NameLoc.getNestedNameSpecifier()->getAsNamespace();
- if (Decl && USRSet.find(getUSRForDecl(Decl)) != USRSet.end())
- checkAndAddLocation(NameLoc.getLocalBeginLoc());
- NameLoc = NameLoc.getPrefix();
- }
- }
-
-private:
- void checkAndAddLocation(SourceLocation Loc) {
- const SourceLocation BeginLoc = Loc;
- const SourceLocation EndLoc = Lexer::getLocForEndOfToken(
- BeginLoc, 0, Context.getSourceManager(), Context.getLangOpts());
- StringRef TokenName =
- Lexer::getSourceText(CharSourceRange::getTokenRange(BeginLoc, EndLoc),
- Context.getSourceManager(), Context.getLangOpts());
- size_t Offset = TokenName.find(PrevName);
-
- // The token of the source location we find actually has the old
- // name.
- if (Offset != StringRef::npos)
- LocationsFound.push_back(BeginLoc.getLocWithOffset(Offset));
- }
-
- const std::set<std::string> USRSet;
- const std::string PrevName;
- std::vector<clang::SourceLocation> LocationsFound;
- const ASTContext &Context;
-};
-
-SourceLocation StartLocationForType(TypeLoc TL) {
- // For elaborated types (e.g. `struct a::A`) we want the portion after the
- // `struct` but including the namespace qualifier, `a::`.
- if (auto ElaboratedTypeLoc = TL.getAs<clang::ElaboratedTypeLoc>()) {
- NestedNameSpecifierLoc NestedNameSpecifier =
- ElaboratedTypeLoc.getQualifierLoc();
- if (NestedNameSpecifier.getNestedNameSpecifier())
- return NestedNameSpecifier.getBeginLoc();
- TL = TL.getNextTypeLoc();
- }
- return TL.getLocStart();
-}
-
-SourceLocation EndLocationForType(TypeLoc TL) {
- // Dig past any namespace or keyword qualifications.
- while (TL.getTypeLocClass() == TypeLoc::Elaborated ||
- TL.getTypeLocClass() == TypeLoc::Qualified)
- TL = TL.getNextTypeLoc();
-
- // The location for template specializations (e.g. Foo<int>) includes the
- // templated types in its location range. We want to restrict this to just
- // before the `<` character.
- if (TL.getTypeLocClass() == TypeLoc::TemplateSpecialization) {
- return TL.castAs<TemplateSpecializationTypeLoc>()
- .getLAngleLoc()
- .getLocWithOffset(-1);
- }
- return TL.getEndLoc();
-}
-
-NestedNameSpecifier *GetNestedNameForType(TypeLoc TL) {
- // Dig past any keyword qualifications.
- while (TL.getTypeLocClass() == TypeLoc::Qualified)
- TL = TL.getNextTypeLoc();
-
- // For elaborated types (e.g. `struct a::A`) we want the portion after the
- // `struct` but including the namespace qualifier, `a::`.
- if (auto ElaboratedTypeLoc = TL.getAs<clang::ElaboratedTypeLoc>())
- return ElaboratedTypeLoc.getQualifierLoc().getNestedNameSpecifier();
- return nullptr;
-}
-
-// Find all locations identified by the given USRs for rename.
-//
-// This class will traverse the AST and find every AST node whose USR is in the
-// given USRs' set.
-class RenameLocFinder : public RecursiveASTVisitor<RenameLocFinder> {
-public:
- RenameLocFinder(llvm::ArrayRef<std::string> USRs, ASTContext &Context)
- : USRSet(USRs.begin(), USRs.end()), Context(Context) {}
-
- // A structure records all information of a symbol reference being renamed.
- // We try to add as few prefix qualifiers as possible.
- struct RenameInfo {
- // The begin location of a symbol being renamed.
- SourceLocation Begin;
- // The end location of a symbol being renamed.
- SourceLocation End;
- // The declaration of a symbol being renamed (can be nullptr).
- const NamedDecl *FromDecl;
- // The declaration in which the nested name is contained (can be nullptr).
- const Decl *Context;
- // The nested name being replaced (can be nullptr).
- const NestedNameSpecifier *Specifier;
- };
-
- // FIXME: Currently, prefix qualifiers will be added to the renamed symbol
- // definition (e.g. "class Foo {};" => "class b::Bar {};" when renaming
- // "a::Foo" to "b::Bar").
- // For renaming declarations/definitions, prefix qualifiers should be filtered
- // out.
- bool VisitNamedDecl(const NamedDecl *Decl) {
- // UsingDecl has been handled in other place.
- if (llvm::isa<UsingDecl>(Decl))
- return true;
-
- // DestructorDecl has been handled in Typeloc.
- if (llvm::isa<CXXDestructorDecl>(Decl))
- return true;
-
- if (Decl->isImplicit())
- return true;
-
- if (isInUSRSet(Decl)) {
- RenameInfo Info = {Decl->getLocation(), Decl->getLocation(), nullptr,
- nullptr, nullptr};
- RenameInfos.push_back(Info);
- }
- return true;
- }
-
- bool VisitDeclRefExpr(const DeclRefExpr *Expr) {
- const NamedDecl *Decl = Expr->getFoundDecl();
- if (isInUSRSet(Decl)) {
- RenameInfo Info = {Expr->getSourceRange().getBegin(),
- Expr->getSourceRange().getEnd(), Decl,
- getClosestAncestorDecl(*Expr), Expr->getQualifier()};
- RenameInfos.push_back(Info);
- }
-
- return true;
- }
-
- bool VisitUsingDecl(const UsingDecl *Using) {
- for (const auto *UsingShadow : Using->shadows()) {
- if (isInUSRSet(UsingShadow->getTargetDecl())) {
- UsingDecls.push_back(Using);
- break;
- }
- }
- return true;
- }
-
- bool VisitNestedNameSpecifierLocations(NestedNameSpecifierLoc NestedLoc) {
- if (!NestedLoc.getNestedNameSpecifier()->getAsType())
- return true;
- if (IsTypeAliasWhichWillBeRenamedElsewhere(NestedLoc.getTypeLoc()))
- return true;
-
- if (const auto *TargetDecl =
- getSupportedDeclFromTypeLoc(NestedLoc.getTypeLoc())) {
- if (isInUSRSet(TargetDecl)) {
- RenameInfo Info = {NestedLoc.getBeginLoc(),
- EndLocationForType(NestedLoc.getTypeLoc()),
- TargetDecl, getClosestAncestorDecl(NestedLoc),
- NestedLoc.getNestedNameSpecifier()->getPrefix()};
- RenameInfos.push_back(Info);
- }
- }
- return true;
- }
-
- bool VisitTypeLoc(TypeLoc Loc) {
- if (IsTypeAliasWhichWillBeRenamedElsewhere(Loc))
- return true;
-
- auto Parents = Context.getParents(Loc);
- TypeLoc ParentTypeLoc;
- if (!Parents.empty()) {
- // Handle cases of nested name specificier locations.
- //
- // The VisitNestedNameSpecifierLoc interface is not impelmented in
- // RecursiveASTVisitor, we have to handle it explicitly.
- if (const auto *NSL = Parents[0].get<NestedNameSpecifierLoc>()) {
- VisitNestedNameSpecifierLocations(*NSL);
- return true;
- }
-
- if (const auto *TL = Parents[0].get<TypeLoc>())
- ParentTypeLoc = *TL;
- }
-
- // Handle the outermost TypeLoc which is directly linked to the interesting
- // declaration and don't handle nested name specifier locations.
- if (const auto *TargetDecl = getSupportedDeclFromTypeLoc(Loc)) {
- if (isInUSRSet(TargetDecl)) {
- // Only handle the outermost typeLoc.
- //
- // For a type like "a::Foo", there will be two typeLocs for it.
- // One ElaboratedType, the other is RecordType:
- //
- // ElaboratedType 0x33b9390 'a::Foo' sugar
- // `-RecordType 0x338fef0 'class a::Foo'
- // `-CXXRecord 0x338fe58 'Foo'
- //
- // Skip if this is an inner typeLoc.
- if (!ParentTypeLoc.isNull() &&
- isInUSRSet(getSupportedDeclFromTypeLoc(ParentTypeLoc)))
- return true;
- RenameInfo Info = {StartLocationForType(Loc), EndLocationForType(Loc),
- TargetDecl, getClosestAncestorDecl(Loc),
- GetNestedNameForType(Loc)};
- RenameInfos.push_back(Info);
- return true;
- }
- }
-
- // Handle specific template class specialiation cases.
- if (const auto *TemplateSpecType =
- dyn_cast<TemplateSpecializationType>(Loc.getType())) {
- TypeLoc TargetLoc = Loc;
- if (!ParentTypeLoc.isNull()) {
- if (llvm::isa<ElaboratedType>(ParentTypeLoc.getType()))
- TargetLoc = ParentTypeLoc;
- }
-
- if (isInUSRSet(TemplateSpecType->getTemplateName().getAsTemplateDecl())) {
- TypeLoc TargetLoc = Loc;
- // FIXME: Find a better way to handle this case.
- // For the qualified template class specification type like
- // "ns::Foo<int>" in "ns::Foo<int>& f();", we want the parent typeLoc
- // (ElaboratedType) of the TemplateSpecializationType in order to
- // catch the prefix qualifiers "ns::".
- if (!ParentTypeLoc.isNull() &&
- llvm::isa<ElaboratedType>(ParentTypeLoc.getType()))
- TargetLoc = ParentTypeLoc;
- RenameInfo Info = {
- StartLocationForType(TargetLoc), EndLocationForType(TargetLoc),
- TemplateSpecType->getTemplateName().getAsTemplateDecl(),
- getClosestAncestorDecl(
- ast_type_traits::DynTypedNode::create(TargetLoc)),
- GetNestedNameForType(TargetLoc)};
- RenameInfos.push_back(Info);
- }
- }
- return true;
- }
-
- // Returns a list of RenameInfo.
- const std::vector<RenameInfo> &getRenameInfos() const { return RenameInfos; }
-
- // Returns a list of using declarations which are needed to update.
- const std::vector<const UsingDecl *> &getUsingDecls() const {
- return UsingDecls;
- }
-
-private:
- // FIXME: This method may not be suitable for renaming other types like alias
- // types. Need to figure out a way to handle it.
- bool IsTypeAliasWhichWillBeRenamedElsewhere(TypeLoc TL) const {
- while (!TL.isNull()) {
- // SubstTemplateTypeParm is the TypeLocation class for a substituted type
- // inside a template expansion so we ignore these. For example:
- //
- // template<typename T> struct S {
- // T t; // <-- this T becomes a TypeLoc(int) with class
- // // SubstTemplateTypeParm when S<int> is instantiated
- // }
- if (TL.getTypeLocClass() == TypeLoc::SubstTemplateTypeParm)
- return true;
-
- // Typedef is the TypeLocation class for a type which is a typedef to the
- // type we want to replace. We ignore the use of the typedef as we will
- // replace the definition of it. For example:
- //
- // typedef int T;
- // T a; // <--- This T is a TypeLoc(int) with class Typedef.
- if (TL.getTypeLocClass() == TypeLoc::Typedef)
- return true;
- TL = TL.getNextTypeLoc();
- }
- return false;
- }
-
- // Get the supported declaration from a given typeLoc. If the declaration type
- // is not supported, returns nullptr.
- //
- // FIXME: support more types, e.g. enum, type alias.
- const NamedDecl *getSupportedDeclFromTypeLoc(TypeLoc Loc) {
- if (const auto *RD = Loc.getType()->getAsCXXRecordDecl())
- return RD;
- return nullptr;
- }
-
- // Get the closest ancester which is a declaration of a given AST node.
- template <typename ASTNodeType>
- const Decl *getClosestAncestorDecl(const ASTNodeType &Node) {
- auto Parents = Context.getParents(Node);
- // FIXME: figure out how to handle it when there are multiple parents.
- if (Parents.size() != 1)
- return nullptr;
- if (ast_type_traits::ASTNodeKind::getFromNodeKind<Decl>().isBaseOf(
- Parents[0].getNodeKind()))
- return Parents[0].template get<Decl>();
- return getClosestAncestorDecl(Parents[0]);
- }
-
- // Get the parent typeLoc of a given typeLoc. If there is no such parent,
- // return nullptr.
- const TypeLoc *getParentTypeLoc(TypeLoc Loc) const {
- auto Parents = Context.getParents(Loc);
- // FIXME: figure out how to handle it when there are multiple parents.
- if (Parents.size() != 1)
- return nullptr;
- return Parents[0].get<TypeLoc>();
- }
-
- // Check whether the USR of a given Decl is in the USRSet.
- bool isInUSRSet(const Decl *Decl) const {
- auto USR = getUSRForDecl(Decl);
- if (USR.empty())
- return false;
- return llvm::is_contained(USRSet, USR);
- }
-
- const std::set<std::string> USRSet;
- ASTContext &Context;
- std::vector<RenameInfo> RenameInfos;
- // Record all interested using declarations which contains the using-shadow
- // declarations of the symbol declarations being renamed.
- std::vector<const UsingDecl *> UsingDecls;
-};
-
-} // namespace
-
-std::vector<SourceLocation>
-getLocationsOfUSRs(const std::vector<std::string> &USRs, StringRef PrevName,
- Decl *Decl) {
- USRLocFindingASTVisitor Visitor(USRs, PrevName, Decl->getASTContext());
- Visitor.TraverseDecl(Decl);
- NestedNameSpecifierLocFinder Finder(Decl->getASTContext());
-
- for (const auto &Location : Finder.getNestedNameSpecifierLocations())
- Visitor.handleNestedNameSpecifierLoc(Location);
-
- return Visitor.getLocationsFound();
-}
-
-std::vector<tooling::AtomicChange>
-createRenameAtomicChanges(llvm::ArrayRef<std::string> USRs,
- llvm::StringRef NewName, Decl *TranslationUnitDecl) {
- RenameLocFinder Finder(USRs, TranslationUnitDecl->getASTContext());
- Finder.TraverseDecl(TranslationUnitDecl);
-
- const SourceManager &SM =
- TranslationUnitDecl->getASTContext().getSourceManager();
-
- std::vector<tooling::AtomicChange> AtomicChanges;
- auto Replace = [&](SourceLocation Start, SourceLocation End,
- llvm::StringRef Text) {
- tooling::AtomicChange ReplaceChange = tooling::AtomicChange(SM, Start);
- llvm::Error Err = ReplaceChange.replace(
- SM, CharSourceRange::getTokenRange(Start, End), Text);
- if (Err) {
- llvm::errs() << "Faile to add replacement to AtomicChange: "
- << llvm::toString(std::move(Err)) << "\n";
- return;
- }
- AtomicChanges.push_back(std::move(ReplaceChange));
- };
-
- for (const auto &RenameInfo : Finder.getRenameInfos()) {
- std::string ReplacedName = NewName.str();
- if (RenameInfo.FromDecl && RenameInfo.Context) {
- if (!llvm::isa<clang::TranslationUnitDecl>(
- RenameInfo.Context->getDeclContext())) {
- ReplacedName = tooling::replaceNestedName(
- RenameInfo.Specifier, RenameInfo.Context->getDeclContext(),
- RenameInfo.FromDecl,
- NewName.startswith("::") ? NewName.str() : ("::" + NewName).str());
- }
- }
- // If the NewName contains leading "::", add it back.
- if (NewName.startswith("::") && NewName.substr(2) == ReplacedName)
- ReplacedName = NewName.str();
- Replace(RenameInfo.Begin, RenameInfo.End, ReplacedName);
- }
-
- // Hanlde using declarations explicitly as "using a::Foo" don't trigger
- // typeLoc for "a::Foo".
- for (const auto *Using : Finder.getUsingDecls())
- Replace(Using->getLocStart(), Using->getLocEnd(), "using " + NewName.str());
-
- return AtomicChanges;
-}
-
-} // namespace rename
-} // namespace clang
diff --git a/clang-tools-extra/clang-rename/USRLocFinder.h b/clang-tools-extra/clang-rename/USRLocFinder.h
deleted file mode 100644
index db4c4a86f7d..00000000000
--- a/clang-tools-extra/clang-rename/USRLocFinder.h
+++ /dev/null
@@ -1,49 +0,0 @@
-//===--- tools/extra/clang-rename/USRLocFinder.h - Clang rename tool ------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// \brief Provides functionality for finding all instances of a USR in a given
-/// AST.
-///
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_RENAME_USR_LOC_FINDER_H
-#define LLVM_CLANG_TOOLS_EXTRA_CLANG_RENAME_USR_LOC_FINDER_H
-
-#include "clang/AST/AST.h"
-#include "clang/Tooling/Core/Replacement.h"
-#include "clang/Tooling/Refactoring/AtomicChange.h"
-#include "llvm/ADT/StringRef.h"
-#include <string>
-#include <vector>
-
-namespace clang {
-namespace rename {
-
-/// Create atomic changes for renaming all symbol references which are
-/// identified by the USRs set to a given new name.
-///
-/// \param USRs The set containing USRs of a particular old symbol.
-/// \param NewName The new name to replace old symbol name.
-/// \param TranslationUnitDecl The translation unit declaration.
-///
-/// \return Atomic changes for renaming.
-std::vector<tooling::AtomicChange>
-createRenameAtomicChanges(llvm::ArrayRef<std::string> USRs,
- llvm::StringRef NewName, Decl *TranslationUnitDecl);
-
-// FIXME: make this an AST matcher. Wouldn't that be awesome??? I agree!
-std::vector<SourceLocation>
-getLocationsOfUSRs(const std::vector<std::string> &USRs,
- llvm::StringRef PrevName, Decl *Decl);
-
-} // namespace rename
-} // namespace clang
-
-#endif // LLVM_CLANG_TOOLS_EXTRA_CLANG_RENAME_USR_LOC_FINDER_H
diff --git a/clang-tools-extra/clang-rename/tool/CMakeLists.txt b/clang-tools-extra/clang-rename/tool/CMakeLists.txt
deleted file mode 100644
index d2109cdcab7..00000000000
--- a/clang-tools-extra/clang-rename/tool/CMakeLists.txt
+++ /dev/null
@@ -1,19 +0,0 @@
-add_clang_executable(clang-rename ClangRename.cpp)
-
-target_link_libraries(clang-rename
- clangBasic
- clangFrontend
- clangRename
- clangRewrite
- clangTooling
- clangToolingCore
- )
-
-install(TARGETS clang-rename RUNTIME DESTINATION bin)
-
-install(PROGRAMS clang-rename.py
- DESTINATION share/clang
- COMPONENT clang-rename)
-install(PROGRAMS clang-rename.el
- DESTINATION share/clang
- COMPONENT clang-rename)
diff --git a/clang-tools-extra/clang-rename/tool/ClangRename.cpp b/clang-tools-extra/clang-rename/tool/ClangRename.cpp
deleted file mode 100644
index 82f58e18a44..00000000000
--- a/clang-tools-extra/clang-rename/tool/ClangRename.cpp
+++ /dev/null
@@ -1,240 +0,0 @@
-//===--- tools/extra/clang-rename/ClangRename.cpp - Clang rename tool -----===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-///
-/// \file
-/// \brief This file implements a clang-rename tool that automatically finds and
-/// renames symbols in C++ code.
-///
-//===----------------------------------------------------------------------===//
-
-#include "../RenamingAction.h"
-#include "../USRFindingAction.h"
-#include "clang/Basic/Diagnostic.h"
-#include "clang/Basic/DiagnosticOptions.h"
-#include "clang/Basic/FileManager.h"
-#include "clang/Basic/IdentifierTable.h"
-#include "clang/Basic/LangOptions.h"
-#include "clang/Basic/SourceManager.h"
-#include "clang/Basic/TokenKinds.h"
-#include "clang/Frontend/TextDiagnosticPrinter.h"
-#include "clang/Rewrite/Core/Rewriter.h"
-#include "clang/Tooling/CommonOptionsParser.h"
-#include "clang/Tooling/Refactoring.h"
-#include "clang/Tooling/ReplacementsYaml.h"
-#include "clang/Tooling/Tooling.h"
-#include "llvm/ADT/IntrusiveRefCntPtr.h"
-#include "llvm/Support/CommandLine.h"
-#include "llvm/Support/FileSystem.h"
-#include "llvm/Support/YAMLTraits.h"
-#include "llvm/Support/raw_ostream.h"
-#include <cstdlib>
-#include <string>
-#include <system_error>
-
-using namespace llvm;
-using namespace clang;
-
-/// \brief An oldname -> newname rename.
-struct RenameAllInfo {
- unsigned Offset = 0;
- std::string QualifiedName;
- std::string NewName;
-};
-
-LLVM_YAML_IS_SEQUENCE_VECTOR(RenameAllInfo)
-
-namespace llvm {
-namespace yaml {
-
-/// \brief Specialized MappingTraits to describe how a RenameAllInfo is
-/// (de)serialized.
-template <> struct MappingTraits<RenameAllInfo> {
- static void mapping(IO &IO, RenameAllInfo &Info) {
- IO.mapOptional("Offset", Info.Offset);
- IO.mapOptional("QualifiedName", Info.QualifiedName);
- IO.mapRequired("NewName", Info.NewName);
- }
-};
-
-} // end namespace yaml
-} // end namespace llvm
-
-static cl::OptionCategory ClangRenameOptions("clang-rename common options");
-
-static cl::list<unsigned> SymbolOffsets(
- "offset",
- cl::desc("Locates the symbol by offset as opposed to <line>:<column>."),
- cl::ZeroOrMore, cl::cat(ClangRenameOptions));
-static cl::opt<bool> Inplace("i", cl::desc("Overwrite edited <file>s."),
- cl::cat(ClangRenameOptions));
-static cl::list<std::string>
- QualifiedNames("qualified-name",
- cl::desc("The fully qualified name of the symbol."),
- cl::ZeroOrMore, cl::cat(ClangRenameOptions));
-
-static cl::list<std::string>
- NewNames("new-name", cl::desc("The new name to change the symbol to."),
- cl::ZeroOrMore, cl::cat(ClangRenameOptions));
-static cl::opt<bool> PrintName(
- "pn",
- cl::desc("Print the found symbol's name prior to renaming to stderr."),
- cl::cat(ClangRenameOptions));
-static cl::opt<bool> PrintLocations(
- "pl", cl::desc("Print the locations affected by renaming to stderr."),
- cl::cat(ClangRenameOptions));
-static cl::opt<std::string>
- ExportFixes("export-fixes",
- cl::desc("YAML file to store suggested fixes in."),
- cl::value_desc("filename"), cl::cat(ClangRenameOptions));
-static cl::opt<std::string>
- Input("input", cl::desc("YAML file to load oldname-newname pairs from."),
- cl::Optional, cl::cat(ClangRenameOptions));
-static cl::opt<bool> Force("force",
- cl::desc("Ignore nonexistent qualified names."),
- cl::cat(ClangRenameOptions));
-
-int main(int argc, const char **argv) {
- tooling::CommonOptionsParser OP(argc, argv, ClangRenameOptions);
-
- if (!Input.empty()) {
- // Populate QualifiedNames and NewNames from a YAML file.
- ErrorOr<std::unique_ptr<MemoryBuffer>> Buffer =
- llvm::MemoryBuffer::getFile(Input);
- if (!Buffer) {
- errs() << "clang-rename: failed to read " << Input << ": "
- << Buffer.getError().message() << "\n";
- return 1;
- }
-
- std::vector<RenameAllInfo> Infos;
- llvm::yaml::Input YAML(Buffer.get()->getBuffer());
- YAML >> Infos;
- for (const auto &Info : Infos) {
- if (!Info.QualifiedName.empty())
- QualifiedNames.push_back(Info.QualifiedName);
- else
- SymbolOffsets.push_back(Info.Offset);
- NewNames.push_back(Info.NewName);
- }
- }
-
- // Check the arguments for correctness.
- if (NewNames.empty()) {
- errs() << "clang-rename: -new-name must be specified.\n\n";
- exit(1);
- }
-
- if (SymbolOffsets.empty() == QualifiedNames.empty()) {
- errs() << "clang-rename: -offset and -qualified-name can't be present at "
- "the same time.\n";
- exit(1);
- }
-
- // Check if NewNames is a valid identifier in C++17.
- LangOptions Options;
- Options.CPlusPlus = true;
- Options.CPlusPlus1z = true;
- IdentifierTable Table(Options);
- for (const auto &NewName : NewNames) {
- auto NewNameTokKind = Table.get(NewName).getTokenID();
- if (!tok::isAnyIdentifier(NewNameTokKind)) {
- errs() << "ERROR: new name is not a valid identifier in C++17.\n\n";
- exit(1);
- }
- }
-
- if (SymbolOffsets.size() + QualifiedNames.size() != NewNames.size()) {
- errs() << "clang-rename: number of symbol offsets(" << SymbolOffsets.size()
- << ") + number of qualified names (" << QualifiedNames.size()
- << ") must be equal to number of new names(" << NewNames.size()
- << ").\n\n";
- cl::PrintHelpMessage();
- exit(1);
- }
-
- auto Files = OP.getSourcePathList();
- tooling::RefactoringTool Tool(OP.getCompilations(), Files);
- rename::USRFindingAction FindingAction(SymbolOffsets, QualifiedNames, Force);
- Tool.run(tooling::newFrontendActionFactory(&FindingAction).get());
- const std::vector<std::vector<std::string>> &USRList =
- FindingAction.getUSRList();
- const std::vector<std::string> &PrevNames = FindingAction.getUSRSpellings();
- if (PrintName) {
- for (const auto &PrevName : PrevNames) {
- outs() << "clang-rename found name: " << PrevName << '\n';
- }
- }
-
- if (FindingAction.errorOccurred()) {
- // Diagnostics are already issued at this point.
- exit(1);
- }
-
- if (Force && PrevNames.size() < NewNames.size()) {
- // No matching PrevName for all NewNames. Without Force this is an error
- // above already.
- exit(0);
- }
-
- // Perform the renaming.
- rename::RenamingAction RenameAction(NewNames, PrevNames, USRList,
- Tool.getReplacements(), PrintLocations);
- std::unique_ptr<tooling::FrontendActionFactory> Factory =
- tooling::newFrontendActionFactory(&RenameAction);
- int ExitCode;
-
- if (Inplace) {
- ExitCode = Tool.runAndSave(Factory.get());
- } else {
- ExitCode = Tool.run(Factory.get());
-
- if (!ExportFixes.empty()) {
- std::error_code EC;
- llvm::raw_fd_ostream OS(ExportFixes, EC, llvm::sys::fs::F_None);
- if (EC) {
- llvm::errs() << "Error opening output file: " << EC.message() << '\n';
- exit(1);
- }
-
- // Export replacements.
- tooling::TranslationUnitReplacements TUR;
- const auto &FileToReplacements = Tool.getReplacements();
- for (const auto &Entry : FileToReplacements)
- TUR.Replacements.insert(TUR.Replacements.end(), Entry.second.begin(),
- Entry.second.end());
-
- yaml::Output YAML(OS);
- YAML << TUR;
- OS.close();
- exit(0);
- }
-
- // Write every file to stdout. Right now we just barf the files without any
- // indication of which files start where, other than that we print the files
- // in the same order we see them.
- LangOptions DefaultLangOptions;
- IntrusiveRefCntPtr<DiagnosticOptions> DiagOpts = new DiagnosticOptions();
- TextDiagnosticPrinter DiagnosticPrinter(errs(), &*DiagOpts);
- DiagnosticsEngine Diagnostics(
- IntrusiveRefCntPtr<DiagnosticIDs>(new DiagnosticIDs()), &*DiagOpts,
- &DiagnosticPrinter, false);
- auto &FileMgr = Tool.getFiles();
- SourceManager Sources(Diagnostics, FileMgr);
- Rewriter Rewrite(Sources, DefaultLangOptions);
-
- Tool.applyAllReplacements(Rewrite);
- for (const auto &File : Files) {
- const auto *Entry = FileMgr.getFile(File);
- const auto ID = Sources.getOrCreateFileID(Entry, SrcMgr::C_User);
- Rewrite.getEditBuffer(ID).write(outs());
- }
- }
-
- exit(ExitCode);
-}
diff --git a/clang-tools-extra/clang-rename/tool/clang-rename.el b/clang-tools-extra/clang-rename/tool/clang-rename.el
deleted file mode 100644
index b6c3ed4c686..00000000000
--- a/clang-tools-extra/clang-rename/tool/clang-rename.el
+++ /dev/null
@@ -1,79 +0,0 @@
-;;; clang-rename.el --- Renames every occurrence of a symbol found at <offset>. -*- lexical-binding: t; -*-
-
-;; Keywords: tools, c
-
-;;; Commentary:
-
-;; To install clang-rename.el make sure the directory of this file is in your
-;; `load-path' and add
-;;
-;; (require 'clang-rename)
-;;
-;; to your .emacs configuration.
-
-;;; Code:
-
-(defgroup clang-rename nil
- "Integration with clang-rename"
- :group 'c)
-
-(defcustom clang-rename-binary "clang-rename"
- "Path to clang-rename executable."
- :type '(file :must-match t)
- :group 'clang-rename)
-
-;;;###autoload
-(defun clang-rename (new-name)
- "Rename all instances of the symbol at point to NEW-NAME using clang-rename."
- (interactive "sEnter a new name: ")
- (save-some-buffers :all)
- ;; clang-rename should not be combined with other operations when undoing.
- (undo-boundary)
- (let ((output-buffer (get-buffer-create "*clang-rename*")))
- (with-current-buffer output-buffer (erase-buffer))
- (let ((exit-code (call-process
- clang-rename-binary nil output-buffer nil
- (format "-offset=%d"
- ;; clang-rename wants file (byte) offsets, not
- ;; buffer (character) positions.
- (clang-rename--bufferpos-to-filepos
- ;; Emacs treats one character after a symbol as
- ;; part of the symbol, but clang-rename doesn’t.
- ;; Use the beginning of the current symbol, if
- ;; available, to resolve the inconsistency.
- (or (car (bounds-of-thing-at-point 'symbol))
- (point))
- 'exact))
- (format "-new-name=%s" new-name)
- "-i" (buffer-file-name))))
- (if (and (integerp exit-code) (zerop exit-code))
- ;; Success; revert current buffer so it gets the modifications.
- (progn
- (kill-buffer output-buffer)
- (revert-buffer :ignore-auto :noconfirm :preserve-modes))
- ;; Failure; append exit code to output buffer and display it.
- (let ((message (clang-rename--format-message
- "clang-rename failed with %s %s"
- (if (integerp exit-code) "exit status" "signal")
- exit-code)))
- (with-current-buffer output-buffer
- (insert ?\n message ?\n))
- (message "%s" message)
- (display-buffer output-buffer))))))
-
-(defalias 'clang-rename--bufferpos-to-filepos
- (if (fboundp 'bufferpos-to-filepos)
- 'bufferpos-to-filepos
- ;; Emacs 24 doesn’t have ‘bufferpos-to-filepos’, simulate it using
- ;; ‘position-bytes’.
- (lambda (position &optional _quality _coding-system)
- (1- (position-bytes position)))))
-
-;; ‘format-message’ is new in Emacs 25.1. Provide a fallback for older
-;; versions.
-(defalias 'clang-rename--format-message
- (if (fboundp 'format-message) 'format-message 'format))
-
-(provide 'clang-rename)
-
-;;; clang-rename.el ends here
diff --git a/clang-tools-extra/clang-rename/tool/clang-rename.py b/clang-tools-extra/clang-rename/tool/clang-rename.py
deleted file mode 100644
index 3cc6644ff8f..00000000000
--- a/clang-tools-extra/clang-rename/tool/clang-rename.py
+++ /dev/null
@@ -1,61 +0,0 @@
-'''
-Minimal clang-rename integration with Vim.
-
-Before installing make sure one of the following is satisfied:
-
-* clang-rename is in your PATH
-* `g:clang_rename_path` in ~/.vimrc points to valid clang-rename executable
-* `binary` in clang-rename.py points to valid to clang-rename executable
-
-To install, simply put this into your ~/.vimrc
-
- noremap <leader>cr :pyf <path-to>/clang-rename.py<cr>
-
-IMPORTANT NOTE: Before running the tool, make sure you saved the file.
-
-All you have to do now is to place a cursor on a variable/function/class which
-you would like to rename and press '<leader>cr'. You will be prompted for a new
-name if the cursor points to a valid symbol.
-'''
-
-import vim
-import subprocess
-import sys
-
-def main():
- binary = 'clang-rename'
- if vim.eval('exists("g:clang_rename_path")') == "1":
- binary = vim.eval('g:clang_rename_path')
-
- # Get arguments for clang-rename binary.
- offset = int(vim.eval('line2byte(line("."))+col(".")')) - 2
- if offset < 0:
- print >> sys.stderr, '''Couldn\'t determine cursor position.
- Is your file empty?'''
- return
- filename = vim.current.buffer.name
-
- new_name_request_message = 'type new name:'
- new_name = vim.eval("input('{}\n')".format(new_name_request_message))
-
- # Call clang-rename.
- command = [binary,
- filename,
- '-i',
- '-offset', str(offset),
- '-new-name', str(new_name)]
- # FIXME: make it possible to run the tool on unsaved file.
- p = subprocess.Popen(command,
- stdout=subprocess.PIPE,
- stderr=subprocess.PIPE)
- stdout, stderr = p.communicate()
-
- if stderr:
- print stderr
-
- # Reload all buffers in Vim.
- vim.command("checktime")
-
-
-if __name__ == '__main__':
- main()
diff --git a/clang-tools-extra/test/CMakeLists.txt b/clang-tools-extra/test/CMakeLists.txt
index 3aedde585f3..16541f98470 100644
--- a/clang-tools-extra/test/CMakeLists.txt
+++ b/clang-tools-extra/test/CMakeLists.txt
@@ -44,7 +44,6 @@ set(CLANG_TOOLS_TEST_DEPS
clang-include-fixer
clang-move
clang-query
- clang-rename
clang-reorder-fields
clang-tidy
find-all-symbols
diff --git a/clang-tools-extra/test/clang-rename/ClassAsTemplateArgument.cpp b/clang-tools-extra/test/clang-rename/ClassAsTemplateArgument.cpp
deleted file mode 100644
index 2e09a5b529e..00000000000
--- a/clang-tools-extra/test/clang-rename/ClassAsTemplateArgument.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-class Foo /* Test 1 */ {}; // CHECK: class Bar /* Test 1 */ {};
-
-template <typename T>
-void func() {}
-
-template <typename T>
-class Baz {};
-
-int main() {
- func<Foo>(); // CHECK: func<Bar>();
- Baz<Foo> /* Test 2 */ obj; // CHECK: Baz<Bar> /* Test 2 */ obj;
- return 0;
-}
-
-// Test 1.
-// RUN: clang-rename -offset=7 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-// Test 2.
-// RUN: clang-rename -offset=215 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-
-// To find offsets after modifying the file, use:
-// grep -Ubo 'Foo.*' <file>
diff --git a/clang-tools-extra/test/clang-rename/ClassFindByName.cpp b/clang-tools-extra/test/clang-rename/ClassFindByName.cpp
deleted file mode 100644
index 4430891ec4b..00000000000
--- a/clang-tools-extra/test/clang-rename/ClassFindByName.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-class Foo { // CHECK: class Bar {
-};
-
-int main() {
- Foo *Pointer = 0; // CHECK: Bar *Pointer = 0;
- return 0;
-}
-
-// Test 1.
-// RUN: clang-rename -qualified-name=Foo -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
diff --git a/clang-tools-extra/test/clang-rename/ClassReplacements.cpp b/clang-tools-extra/test/clang-rename/ClassReplacements.cpp
deleted file mode 100644
index 2b478bbf900..00000000000
--- a/clang-tools-extra/test/clang-rename/ClassReplacements.cpp
+++ /dev/null
@@ -1,11 +0,0 @@
-// RUN: rm -rf %t
-// RUN: mkdir -p %t/fixes
-// RUN: cat %s > %t.cpp
-// RUN: clang-rename -offset=254 -new-name=Bar -export-fixes=%t/fixes/clang-rename.yaml %t.cpp --
-// RUN: clang-apply-replacements %t
-// RUN: sed 's,//.*,,' %t.cpp | FileCheck %s
-
-class Foo {}; // CHECK: class Bar {};
-
-// Use grep -FUbo 'Foo' <file> to get the correct offset of Cla when changing
-// this file.
diff --git a/clang-tools-extra/test/clang-rename/ClassSimpleRenaming.cpp b/clang-tools-extra/test/clang-rename/ClassSimpleRenaming.cpp
deleted file mode 100644
index 086f55736cb..00000000000
--- a/clang-tools-extra/test/clang-rename/ClassSimpleRenaming.cpp
+++ /dev/null
@@ -1,14 +0,0 @@
-class Foo /* Test 1 */ { // CHECK: class Bar /* Test 1 */ {
-public:
- void foo(int x);
-};
-
-void Foo::foo(int x) /* Test 2 */ {} // CHECK: void Bar::foo(int x) /* Test 2 */ {}
-
-// Test 1.
-// RUN: clang-rename -offset=6 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-// Test 2.
-// RUN: clang-rename -offset=109 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-
-// To find offsets after modifying the file, use:
-// grep -Ubo 'Foo.*' <file>
diff --git a/clang-tools-extra/test/clang-rename/ClassTestMulti.cpp b/clang-tools-extra/test/clang-rename/ClassTestMulti.cpp
deleted file mode 100644
index 81e65c76065..00000000000
--- a/clang-tools-extra/test/clang-rename/ClassTestMulti.cpp
+++ /dev/null
@@ -1,11 +0,0 @@
-class Foo1 /* Offset 1 */ { // CHECK: class Bar1 /* Offset 1 */ {
-};
-
-class Foo2 /* Offset 2 */ { // CHECK: class Bar2 /* Offset 2 */ {
-};
-
-// Test 1.
-// RUN: clang-rename -offset=6 -new-name=Bar1 -offset=76 -new-name=Bar2 %s -- | sed 's,//.*,,' | FileCheck %s
-
-// To find offsets after modifying the file, use:
-// grep -Ubo 'Foo.*' <file>
diff --git a/clang-tools-extra/test/clang-rename/ClassTestMultiByName.cpp b/clang-tools-extra/test/clang-rename/ClassTestMultiByName.cpp
deleted file mode 100644
index 61b69a1bdf4..00000000000
--- a/clang-tools-extra/test/clang-rename/ClassTestMultiByName.cpp
+++ /dev/null
@@ -1,8 +0,0 @@
-class Foo1 { // CHECK: class Bar1
-};
-
-class Foo2 { // CHECK: class Bar2
-};
-
-// Test 1.
-// RUN: clang-rename -qualified-name=Foo1 -new-name=Bar1 -qualified-name=Foo2 -new-name=Bar2 %s -- | sed 's,//.*,,' | FileCheck %s
diff --git a/clang-tools-extra/test/clang-rename/ComplexFunctionOverride.cpp b/clang-tools-extra/test/clang-rename/ComplexFunctionOverride.cpp
deleted file mode 100644
index ccf3a20e540..00000000000
--- a/clang-tools-extra/test/clang-rename/ComplexFunctionOverride.cpp
+++ /dev/null
@@ -1,47 +0,0 @@
-struct A {
- virtual void foo() {} /* Test 1 */ // CHECK: virtual void bar() {}
-};
-
-struct B : A {
- void foo() override {} /* Test 2 */ // CHECK: void bar() override {}
-};
-
-struct C : B {
- void foo() override {} /* Test 3 */ // CHECK: void bar() override {}
-};
-
-struct D : B {
- void foo() override {} /* Test 4 */ // CHECK: void bar() override {}
-};
-
-struct E : D {
- void foo() override {} /* Test 5 */ // CHECK: void bar() override {}
-};
-
-int main() {
- A a;
- a.foo(); // CHECK: a.bar();
- B b;
- b.foo(); // CHECK: b.bar();
- C c;
- c.foo(); // CHECK: c.bar();
- D d;
- d.foo(); // CHECK: d.bar();
- E e;
- e.foo(); // CHECK: e.bar();
- return 0;
-}
-
-// Test 1.
-// RUN: clang-rename -offset=26 -new-name=bar %s -- | sed 's,//.*,,' | FileCheck %s
-// Test 2.
-// RUN: clang-rename -offset=109 -new-name=bar %s -- | sed 's,//.*,,' | FileCheck %s
-// Test 3.
-// RUN: clang-rename -offset=201 -new-name=bar %s -- | sed 's,//.*,,' | FileCheck %s
-// Test 4.
-// RUN: clang-rename -offset=293 -new-name=bar %s -- | sed 's,//.*,,' | FileCheck %s
-// Test 5.
-// RUN: clang-rename -offset=385 -new-name=bar %s -- | sed 's,//.*,,' | FileCheck %s
-
-// To find offsets after modifying the file, use:
-// grep -Ubo 'foo.*' <file>
diff --git a/clang-tools-extra/test/clang-rename/ComplicatedClassType.cpp b/clang-tools-extra/test/clang-rename/ComplicatedClassType.cpp
deleted file mode 100644
index 88019530312..00000000000
--- a/clang-tools-extra/test/clang-rename/ComplicatedClassType.cpp
+++ /dev/null
@@ -1,63 +0,0 @@
-// Forward declaration.
-class Foo; /* Test 1 */ // CHECK: class Bar; /* Test 1 */
-
-class Baz {
- virtual int getValue() const = 0;
-};
-
-class Foo : public Baz { /* Test 2 */// CHECK: class Bar : public Baz {
-public:
- Foo(int value = 0) : x(value) {} // CHECK: Bar(int value = 0) : x(value) {}
-
- Foo &operator++(int) { // CHECK: Bar &operator++(int) {
- x++;
- return *this;
- }
-
- bool operator<(Foo const &rhs) { // CHECK: bool operator<(Bar const &rhs) {
- return this->x < rhs.x;
- }
-
- int getValue() const {
- return 0;
- }
-
-private:
- int x;
-};
-
-int main() {
- Foo *Pointer = 0; // CHECK: Bar *Pointer = 0;
- Foo Variable = Foo(10); // CHECK: Bar Variable = Bar(10);
- for (Foo it; it < Variable; it++) { // CHECK: for (Bar it; it < Variable; it++) {
- }
- const Foo *C = new Foo(); // CHECK: const Bar *C = new Bar();
- const_cast<Foo *>(C)->getValue(); // CHECK: const_cast<Bar *>(C)->getValue();
- Foo foo; // CHECK: Bar foo;
- const Baz &BazReference = foo;
- const Baz *BazPointer = &foo;
- dynamic_cast<const Foo &>(BazReference).getValue(); /* Test 3 */ // CHECK: dynamic_cast<const Bar &>(BazReference).getValue();
- dynamic_cast<const Foo *>(BazPointer)->getValue(); /* Test 4 */ // CHECK: dynamic_cast<const Bar *>(BazPointer)->getValue();
- reinterpret_cast<const Foo *>(BazPointer)->getValue(); /* Test 5 */ // CHECK: reinterpret_cast<const Bar *>(BazPointer)->getValue();
- static_cast<const Foo &>(BazReference).getValue(); /* Test 6 */ // CHECK: static_cast<const Bar &>(BazReference).getValue();
- static_cast<const Foo *>(BazPointer)->getValue(); /* Test 7 */ // CHECK: static_cast<const Bar *>(BazPointer)->getValue();
- return 0;
-}
-
-// Test 1.
-// RUN: clang-rename -offset=30 -new-name=Bar %s -- -frtti | sed 's,//.*,,' | FileCheck %s
-// Test 2.
-// RUN: clang-rename -offset=155 -new-name=Bar %s -- -frtti | sed 's,//.*,,' | FileCheck %s
-// Test 3.
-// RUN: clang-rename -offset=1133 -new-name=Bar %s -- -frtti | sed 's,//.*,,' | FileCheck %s
-// Test 4.
-// RUN: clang-rename -offset=1266 -new-name=Bar %s -- -frtti | sed 's,//.*,,' | FileCheck %s
-// Test 5.
-// RUN: clang-rename -offset=1402 -new-name=Bar %s -- -frtti | sed 's,//.*,,' | FileCheck %s
-// Test 6.
-// RUN: clang-rename -offset=1533 -new-name=Bar %s -- -frtti | sed 's,//.*,,' | FileCheck %s
-// Test 7.
-// RUN: clang-rename -offset=1665 -new-name=Bar %s -- -frtti | sed 's,//.*,,' | FileCheck %s
-
-// To find offsets after modifying the file, use:
-// grep -Ubo 'Foo.*' <file>
diff --git a/clang-tools-extra/test/clang-rename/Ctor.cpp b/clang-tools-extra/test/clang-rename/Ctor.cpp
deleted file mode 100644
index 9908a4123dd..00000000000
--- a/clang-tools-extra/test/clang-rename/Ctor.cpp
+++ /dev/null
@@ -1,14 +0,0 @@
-class Foo { // CHECK: class Bar {
-public:
- Foo(); /* Test 1 */ // CHECK: Bar();
-};
-
-Foo::Foo() /* Test 2 */ {} // CHECK: Bar::Bar() /* Test 2 */ {}
-
-// Test 1.
-// RUN: clang-rename -offset=62 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-// Test 2.
-// RUN: clang-rename -offset=116 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-
-// To find offsets after modifying the file, use:
-// grep -Ubo 'Foo.*' <file>
diff --git a/clang-tools-extra/test/clang-rename/CtorInitializer.cpp b/clang-tools-extra/test/clang-rename/CtorInitializer.cpp
deleted file mode 100644
index fed4f5b06c2..00000000000
--- a/clang-tools-extra/test/clang-rename/CtorInitializer.cpp
+++ /dev/null
@@ -1,17 +0,0 @@
-class Baz {};
-
-class Qux {
- Baz Foo; /* Test 1 */ // CHECK: Baz Bar;
-public:
- Qux();
-};
-
-Qux::Qux() : Foo() /* Test 2 */ {} // CHECK: Qux::Qux() : Bar() /* Test 2 */ {}
-
-// Test 1.
-// RUN: clang-rename -offset=33 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-// Test 2.
-// RUN: clang-rename -offset=118 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-
-// To find offsets after modifying the file, use:
-// grep -Ubo 'Foo.*' <file>
diff --git a/clang-tools-extra/test/clang-rename/DeclRefExpr.cpp b/clang-tools-extra/test/clang-rename/DeclRefExpr.cpp
deleted file mode 100644
index 6462862d82a..00000000000
--- a/clang-tools-extra/test/clang-rename/DeclRefExpr.cpp
+++ /dev/null
@@ -1,24 +0,0 @@
-class C {
-public:
- static int Foo; /* Test 1 */ // CHECK: static int Bar;
-};
-
-int foo(int x) { return 0; }
-#define MACRO(a) foo(a)
-
-int main() {
- C::Foo = 1; /* Test 2 */ // CHECK: C::Bar = 1;
- MACRO(C::Foo); // CHECK: MACRO(C::Bar);
- int y = C::Foo; /* Test 3 */ // CHECK: int y = C::Bar;
- return 0;
-}
-
-// Test 1.
-// RUN: clang-rename -offset=31 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-// Test 2.
-// RUN: clang-rename -offset=152 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-// Test 3.
-// RUN: clang-rename -offset=271 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-
-// To find offsets after modifying the file, use:
-// grep -Ubo 'Foo.*' <file>
diff --git a/clang-tools-extra/test/clang-rename/Field.cpp b/clang-tools-extra/test/clang-rename/Field.cpp
deleted file mode 100644
index c0e9a019e47..00000000000
--- a/clang-tools-extra/test/clang-rename/Field.cpp
+++ /dev/null
@@ -1,15 +0,0 @@
-class Baz {
- int Foo; /* Test 1 */ // CHECK: int Bar;
-public:
- Baz();
-};
-
-Baz::Baz() : Foo(0) /* Test 2 */ {} // CHECK: Baz::Baz() : Bar(0)
-
-// Test 1.
-// RUN: clang-rename -offset=18 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-// Test 2.
-// RUN: clang-rename -offset=89 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-
-// To find offsets after modifying the file, use:
-// grep -Ubo 'Foo.*' <file>
diff --git a/clang-tools-extra/test/clang-rename/FunctionMacro.cpp b/clang-tools-extra/test/clang-rename/FunctionMacro.cpp
deleted file mode 100644
index 6e87026ec70..00000000000
--- a/clang-tools-extra/test/clang-rename/FunctionMacro.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-#define moo foo // CHECK: #define moo macro_function
-
-int foo() /* Test 1 */ { // CHECK: int macro_function() /* Test 1 */ {
- return 42;
-}
-
-void boo(int value) {}
-
-void qoo() {
- foo(); // CHECK: macro_function();
- boo(foo()); // CHECK: boo(macro_function());
- moo();
- boo(moo());
-}
-
-// Test 1.
-// RUN: clang-rename -offset=68 -new-name=macro_function %s -- | sed 's,//.*,,' | FileCheck %s
-
-// To find offsets after modifying the file, use:
-// grep -Ubo 'foo.*' <file>
diff --git a/clang-tools-extra/test/clang-rename/FunctionOverride.cpp b/clang-tools-extra/test/clang-rename/FunctionOverride.cpp
deleted file mode 100644
index adfeb739e66..00000000000
--- a/clang-tools-extra/test/clang-rename/FunctionOverride.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-class A { virtual void foo(); /* Test 1 */ }; // CHECK: class A { virtual void bar();
-class B : public A { void foo(); /* Test 2 */ }; // CHECK: class B : public A { void bar();
-class C : public B { void foo(); /* Test 3 */ }; // CHECK: class C : public B { void bar();
-
-// Test 1.
-// RUN: clang-rename -offset=23 -new-name=bar %s -- | sed 's,//.*,,' | FileCheck %s
-// Test 2.
-// RUN: clang-rename -offset=116 -new-name=bar %s -- | sed 's,//.*,,' | FileCheck %s
-// Test 3.
-// RUN: clang-rename -offset=209 -new-name=bar %s -- | sed 's,//.*,,' | FileCheck %s
-
-// To find offsets after modifying the file, use:
-// grep -Ubo 'foo.*' <file>
diff --git a/clang-tools-extra/test/clang-rename/FunctionWithClassFindByName.cpp b/clang-tools-extra/test/clang-rename/FunctionWithClassFindByName.cpp
deleted file mode 100644
index 2cae09a1c24..00000000000
--- a/clang-tools-extra/test/clang-rename/FunctionWithClassFindByName.cpp
+++ /dev/null
@@ -1,12 +0,0 @@
-void foo() {
-}
-
-class Foo { // CHECK: class Bar
-};
-
-int main() {
- Foo *Pointer = 0; // CHECK: Bar *Pointer = 0;
- return 0;
-}
-
-// RUN: clang-rename -qualified-name=Foo -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
diff --git a/clang-tools-extra/test/clang-rename/IncludeHeaderWithSymbol.cpp b/clang-tools-extra/test/clang-rename/IncludeHeaderWithSymbol.cpp
deleted file mode 100644
index cb2baee57b8..00000000000
--- a/clang-tools-extra/test/clang-rename/IncludeHeaderWithSymbol.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "Inputs/HeaderWithSymbol.h"
-
-int main() {
- return 0; // CHECK: {{^ return 0;}}
-}
-
-// Test 1.
-// The file IncludeHeaderWithSymbol.cpp doesn't contain the symbol Foo
-// and is expected to be written to stdout without modifications
-// RUN: clang-rename -qualified-name=Foo -new-name=Bar %s -- | FileCheck %s
diff --git a/clang-tools-extra/test/clang-rename/Inputs/HeaderWithSymbol.h b/clang-tools-extra/test/clang-rename/Inputs/HeaderWithSymbol.h
deleted file mode 100644
index 1fe02e89786..00000000000
--- a/clang-tools-extra/test/clang-rename/Inputs/HeaderWithSymbol.h
+++ /dev/null
@@ -1 +0,0 @@
-struct Foo {};
diff --git a/clang-tools-extra/test/clang-rename/Inputs/OffsetToNewName.yaml b/clang-tools-extra/test/clang-rename/Inputs/OffsetToNewName.yaml
deleted file mode 100644
index d8e972880f3..00000000000
--- a/clang-tools-extra/test/clang-rename/Inputs/OffsetToNewName.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
----
-- Offset: 6
- NewName: Bar1
-- Offset: 44
- NewName: Bar2
-...
diff --git a/clang-tools-extra/test/clang-rename/Inputs/QualifiedNameToNewName.yaml b/clang-tools-extra/test/clang-rename/Inputs/QualifiedNameToNewName.yaml
deleted file mode 100644
index 6e3783671df..00000000000
--- a/clang-tools-extra/test/clang-rename/Inputs/QualifiedNameToNewName.yaml
+++ /dev/null
@@ -1,6 +0,0 @@
----
-- QualifiedName: Foo1
- NewName: Bar1
-- QualifiedName: Foo2
- NewName: Bar2
-...
diff --git a/clang-tools-extra/test/clang-rename/InvalidNewName.cpp b/clang-tools-extra/test/clang-rename/InvalidNewName.cpp
deleted file mode 100644
index e6b38e59420..00000000000
--- a/clang-tools-extra/test/clang-rename/InvalidNewName.cpp
+++ /dev/null
@@ -1,2 +0,0 @@
-// RUN: not clang-rename -new-name=class -offset=133 %s 2>&1 | FileCheck %s
-// CHECK: ERROR: new name is not a valid identifier in C++17.
diff --git a/clang-tools-extra/test/clang-rename/InvalidOffset.cpp b/clang-tools-extra/test/clang-rename/InvalidOffset.cpp
deleted file mode 100644
index 2ae04d01e4a..00000000000
--- a/clang-tools-extra/test/clang-rename/InvalidOffset.cpp
+++ /dev/null
@@ -1,9 +0,0 @@
-#include "Inputs/HeaderWithSymbol.h"
-#define FOO int bar;
-FOO
-
-int foo;
-
-// RUN: not clang-rename -new-name=qux -offset=259 %s -- 2>&1 | FileCheck %s
-// CHECK-NOT: CHECK
-// CHECK: error: SourceLocation in file {{.*}}InvalidOffset.cpp at offset 259 is invalid
diff --git a/clang-tools-extra/test/clang-rename/InvalidQualifiedName.cpp b/clang-tools-extra/test/clang-rename/InvalidQualifiedName.cpp
deleted file mode 100644
index 5280e3939cc..00000000000
--- a/clang-tools-extra/test/clang-rename/InvalidQualifiedName.cpp
+++ /dev/null
@@ -1,4 +0,0 @@
-struct S {
-};
-
-// RUN: clang-rename -force -qualified-name S2 -new-name=T %s --
diff --git a/clang-tools-extra/test/clang-rename/MemberExprMacro.cpp b/clang-tools-extra/test/clang-rename/MemberExprMacro.cpp
deleted file mode 100644
index 56cd8d95f6e..00000000000
--- a/clang-tools-extra/test/clang-rename/MemberExprMacro.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-class Baz {
-public:
- int Foo; /* Test 1 */ // CHECK: int Bar;
-};
-
-int qux(int x) { return 0; }
-#define MACRO(a) qux(a)
-
-int main() {
- Baz baz;
- baz.Foo = 1; /* Test 2 */ // CHECK: baz.Bar = 1;
- MACRO(baz.Foo); // CHECK: MACRO(baz.Bar);
- int y = baz.Foo; // CHECK: int y = baz.Bar;
-}
-
-// Test 1.
-// RUN: clang-rename -offset=26 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-// Test 2.
-// RUN: clang-rename -offset=155 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-
-// To find offsets after modifying the file, use:
-// grep -Ubo 'Foo.*' <file>
diff --git a/clang-tools-extra/test/clang-rename/Namespace.cpp b/clang-tools-extra/test/clang-rename/Namespace.cpp
deleted file mode 100644
index ec9630fdedb..00000000000
--- a/clang-tools-extra/test/clang-rename/Namespace.cpp
+++ /dev/null
@@ -1,13 +0,0 @@
-namespace gcc /* Test 1 */ { // CHECK: namespace clang /* Test 1 */ {
- int x;
-}
-
-void boo() {
- gcc::x = 42; // CHECK: clang::x = 42;
-}
-
-// Test 1.
-// RUN: clang-rename -offset=10 -new-name=clang %s -- | sed 's,//.*,,' | FileCheck %s
-
-// To find offsets after modifying the file, use:
-// grep -Ubo 'Foo.*' <file>
diff --git a/clang-tools-extra/test/clang-rename/NoNewName.cpp b/clang-tools-extra/test/clang-rename/NoNewName.cpp
deleted file mode 100644
index 4f882d83b0c..00000000000
--- a/clang-tools-extra/test/clang-rename/NoNewName.cpp
+++ /dev/null
@@ -1,4 +0,0 @@
-// Check for an error while -new-name argument has not been passed to
-// clang-rename.
-// RUN: not clang-rename -offset=133 %s 2>&1 | FileCheck %s
-// CHECK: clang-rename: -new-name must be specified.
diff --git a/clang-tools-extra/test/clang-rename/TemplateClassInstantiation.cpp b/clang-tools-extra/test/clang-rename/TemplateClassInstantiation.cpp
deleted file mode 100644
index 493d0951df5..00000000000
--- a/clang-tools-extra/test/clang-rename/TemplateClassInstantiation.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-template <typename T>
-class Foo { /* Test 1 */ // CHECK: class Bar { /* Test 1 */
-public:
- T foo(T arg, T& ref, T* ptr) {
- T value;
- int number = 42;
- value = (T)number;
- value = static_cast<T>(number);
- return value;
- }
- static void foo(T value) {}
- T member;
-};
-
-template <typename T>
-void func() {
- Foo<T> obj; /* Test 2 */ // CHECK: Bar<T> obj;
- obj.member = T();
- Foo<T>::foo(); // CHECK: Bar<T>::foo();
-}
-
-int main() {
- Foo<int> i; /* Test 3 */ // CHECK: Bar<int> i;
- i.member = 0;
- Foo<int>::foo(0); // CHECK: Bar<int>::foo(0);
-
- Foo<bool> b; // CHECK: Bar<bool> b;
- b.member = false;
- Foo<bool>::foo(false); // CHECK: Bar<bool>::foo(false);
-
- return 0;
-}
-
-// Test 1.
-// RUN: clang-rename -offset=29 -new-name=Bar %s -- -fno-delayed-template-parsing | sed 's,//.*,,' | FileCheck %s
-// Test 2.
-// RUN: clang-rename -offset=324 -new-name=Bar %s -- -fno-delayed-template-parsing | sed 's,//.*,,' | FileCheck %s
-// Test 3.
-// RUN: clang-rename -offset=463 -new-name=Bar %s -- -fno-delayed-template-parsing | sed 's,//.*,,' | FileCheck %s
-
-// To find offsets after modifying the file, use:
-// grep -Ubo 'Foo.*' <file>
diff --git a/clang-tools-extra/test/clang-rename/TemplateTypename.cpp b/clang-tools-extra/test/clang-rename/TemplateTypename.cpp
deleted file mode 100644
index 559ec1f9ade..00000000000
--- a/clang-tools-extra/test/clang-rename/TemplateTypename.cpp
+++ /dev/null
@@ -1,24 +0,0 @@
-template <typename T /* Test 1 */> // CHECK: template <typename U /* Test 1 */>
-class Foo {
-T foo(T arg, T& ref, T* /* Test 2 */ ptr) { // CHECK: U foo(U arg, U& ref, U* /* Test 2 */ ptr) {
- T value; // CHECK: U value;
- int number = 42;
- value = (T)number; // CHECK: value = (U)number;
- value = static_cast<T /* Test 3 */>(number); // CHECK: value = static_cast<U /* Test 3 */>(number);
- return value;
-}
-
-static void foo(T value) {} // CHECK: static void foo(U value) {}
-
-T member; // CHECK: U member;
-};
-
-// Test 1.
-// RUN: clang-rename -offset=19 -new-name=U %s -- -fno-delayed-template-parsing | sed 's,//.*,,' | FileCheck %s
-// Test 2.
-// RUN: clang-rename -offset=126 -new-name=U %s -- -fno-delayed-template-parsing | sed 's,//.*,,' | FileCheck %s
-// Test 3.
-// RUN: clang-rename -offset=392 -new-name=U %s -- -fno-delayed-template-parsing | sed 's,//.*,,' | FileCheck %s
-
-// To find offsets after modifying the file, use:
-// grep -Ubo 'T.*' <file>
diff --git a/clang-tools-extra/test/clang-rename/TemplatedClassFunction.cpp b/clang-tools-extra/test/clang-rename/TemplatedClassFunction.cpp
deleted file mode 100644
index 1f5b0b52ba7..00000000000
--- a/clang-tools-extra/test/clang-rename/TemplatedClassFunction.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-template <typename T>
-class A {
-public:
- void foo() /* Test 1 */ {} // CHECK: void bar() /* Test 1 */ {}
-};
-
-int main(int argc, char **argv) {
- A<int> a;
- a.foo(); /* Test 2 */ // CHECK: a.bar() /* Test 2 */
- return 0;
-}
-
-// Test 1.
-// RUN: clang-refactor rename -offset=48 -new-name=bar %s -- | sed 's,//.*,,' | FileCheck %s
-// Test 2.
-// RUN: clang-refactor rename -offset=162 -new-name=bar %s -- | sed 's,//.*,,' | FileCheck %s
-//
-// Currently unsupported test.
-// XFAIL: *
-
-// To find offsets after modifying the file, use:
-// grep -Ubo 'foo.*' <file>
diff --git a/clang-tools-extra/test/clang-rename/UserDefinedConversion.cpp b/clang-tools-extra/test/clang-rename/UserDefinedConversion.cpp
deleted file mode 100644
index 60f251ab448..00000000000
--- a/clang-tools-extra/test/clang-rename/UserDefinedConversion.cpp
+++ /dev/null
@@ -1,26 +0,0 @@
-class Foo { /* Test 1 */ // CHECK: class Bar {
-public:
- Foo() {} // CHECK: Bar() {}
-};
-
-class Baz {
-public:
- operator Foo() /* Test 2 */ const { // CHECK: operator Bar() /* Test 2 */ const {
- Foo foo; // CHECK: Bar foo;
- return foo;
- }
-};
-
-int main() {
- Baz boo;
- Foo foo = static_cast<Foo>(boo); // CHECK: Bar foo = static_cast<Bar>(boo);
- return 0;
-}
-
-// Test 1.
-// RUN: clang-rename -offset=7 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-// Test 2.
-// RUN: clang-rename -offset=164 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-
-// To find offsets after modifying the file, use:
-// grep -Ubo 'Foo.*' <file>
diff --git a/clang-tools-extra/test/clang-rename/Variable.cpp b/clang-tools-extra/test/clang-rename/Variable.cpp
deleted file mode 100644
index d7e670fb43e..00000000000
--- a/clang-tools-extra/test/clang-rename/Variable.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-#define NAMESPACE namespace A
-NAMESPACE {
-int Foo; /* Test 1 */ // CHECK: int Bar;
-}
-int Foo; // CHECK: int Foo;
-int Qux = Foo; // CHECK: int Qux = Foo;
-int Baz = A::Foo; /* Test 2 */ // CHECK: Baz = A::Bar;
-void fun() {
- struct {
- int Foo; // CHECK: int Foo;
- } b = {100};
- int Foo = 100; // CHECK: int Foo = 100;
- Baz = Foo; // CHECK: Baz = Foo;
- {
- extern int Foo; // CHECK: extern int Foo;
- Baz = Foo; // CHECK: Baz = Foo;
- Foo = A::Foo /* Test 3 */ + Baz; // CHECK: Foo = A::Bar /* Test 3 */ + Baz;
- A::Foo /* Test 4 */ = b.Foo; // CHECK: A::Bar /* Test 4 */ = b.Foo;
- }
- Foo = b.Foo; // Foo = b.Foo;
-}
-
-// Test 1.
-// RUN: clang-rename -offset=46 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-// Test 2.
-// RUN: clang-rename -offset=234 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-// Test 3.
-// RUN: clang-rename -offset=641 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-// Test 4.
-// RUN: clang-rename -offset=716 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-
-// To find offsets after modifying the file, use:
-// grep -Ubo 'Foo.*' <file>
diff --git a/clang-tools-extra/test/clang-rename/VariableMacro.cpp b/clang-tools-extra/test/clang-rename/VariableMacro.cpp
deleted file mode 100644
index 622e825d3e4..00000000000
--- a/clang-tools-extra/test/clang-rename/VariableMacro.cpp
+++ /dev/null
@@ -1,21 +0,0 @@
-#define Baz Foo // CHECK: #define Baz Bar
-
-void foo(int value) {}
-
-void macro() {
- int Foo; /* Test 1 */ // CHECK: int Bar;
- Foo = 42; /* Test 2 */ // CHECK: Bar = 42;
- Baz -= 0;
- foo(Foo); /* Test 3 */ // CHECK: foo(Bar);
- foo(Baz);
-}
-
-// Test 1.
-// RUN: clang-rename -offset=88 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-// Test 2.
-// RUN: clang-rename -offset=129 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-// Test 3.
-// RUN: clang-rename -offset=191 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s
-
-// To find offsets after modifying the file, use:
-// grep -Ubo 'Foo.*' <file>
diff --git a/clang-tools-extra/test/clang-rename/YAMLInput.cpp b/clang-tools-extra/test/clang-rename/YAMLInput.cpp
deleted file mode 100644
index 55dbc6d66a5..00000000000
--- a/clang-tools-extra/test/clang-rename/YAMLInput.cpp
+++ /dev/null
@@ -1,10 +0,0 @@
-class Foo1 { // CHECK: class Bar1
-};
-
-class Foo2 { // CHECK: class Bar2
-};
-
-// Test 1.
-// RUN: clang-rename -input %S/Inputs/OffsetToNewName.yaml %s -- | sed 's,//.*,,' | FileCheck %s
-// Test 2.
-// RUN: clang-rename -input %S/Inputs/QualifiedNameToNewName.yaml %s -- | sed 's,//.*,,' | FileCheck %s
diff --git a/clang-tools-extra/unittests/CMakeLists.txt b/clang-tools-extra/unittests/CMakeLists.txt
index f7ee0fc983a..49978d4ae28 100644
--- a/clang-tools-extra/unittests/CMakeLists.txt
+++ b/clang-tools-extra/unittests/CMakeLists.txt
@@ -10,6 +10,5 @@ add_subdirectory(clang-apply-replacements)
add_subdirectory(clang-move)
add_subdirectory(clang-query)
add_subdirectory(clang-tidy)
-add_subdirectory(clang-rename)
add_subdirectory(clangd)
add_subdirectory(include-fixer)
diff --git a/clang-tools-extra/unittests/clang-rename/CMakeLists.txt b/clang-tools-extra/unittests/clang-rename/CMakeLists.txt
deleted file mode 100644
index a121fdcdffd..00000000000
--- a/clang-tools-extra/unittests/clang-rename/CMakeLists.txt
+++ /dev/null
@@ -1,28 +0,0 @@
-set(LLVM_LINK_COMPONENTS
- support
- )
-
-get_filename_component(CLANG_RENAME_SOURCE_DIR
- ${CMAKE_CURRENT_SOURCE_DIR}/../../clang-rename REALPATH)
-include_directories(
- ${CLANG_RENAME_SOURCE_DIR}
- )
-
-# We'd like clang/unittests/Tooling/RewriterTestContext.h in the test.
-include_directories(${CLANG_SOURCE_DIR})
-
-add_extra_unittest(ClangRenameTests
- RenameClassTest.cpp
- )
-
-target_link_libraries(ClangRenameTests
- clangAST
- clangASTMatchers
- clangBasic
- clangFormat
- clangFrontend
- clangRename
- clangRewrite
- clangTooling
- clangToolingCore
- )
diff --git a/clang-tools-extra/unittests/clang-rename/ClangRenameTest.h b/clang-tools-extra/unittests/clang-rename/ClangRenameTest.h
deleted file mode 100644
index 543b47b9a73..00000000000
--- a/clang-tools-extra/unittests/clang-rename/ClangRenameTest.h
+++ /dev/null
@@ -1,112 +0,0 @@
-//===-- ClangRenameTests.cpp - clang-rename unit tests --------------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "RenamingAction.h"
-#include "USRFindingAction.h"
-#include "unittests/Tooling/RewriterTestContext.h"
-#include "clang/ASTMatchers/ASTMatchFinder.h"
-#include "clang/Basic/FileManager.h"
-#include "clang/Basic/FileSystemOptions.h"
-#include "clang/Basic/VirtualFileSystem.h"
-#include "clang/Format/Format.h"
-#include "clang/Frontend/CompilerInstance.h"
-#include "clang/Frontend/PCHContainerOperations.h"
-#include "clang/Tooling/Refactoring.h"
-#include "clang/Tooling/Tooling.h"
-#include "llvm/ADT/IntrusiveRefCntPtr.h"
-#include "llvm/ADT/StringRef.h"
-#include "llvm/Support/Format.h"
-#include "llvm/Support/MemoryBuffer.h"
-#include "gtest/gtest.h"
-#include <memory>
-#include <string>
-#include <vector>
-
-namespace clang {
-namespace clang_rename {
-namespace test {
-
-struct Case {
- std::string Before;
- std::string After;
- std::string OldName;
- std::string NewName;
-};
-
-class ClangRenameTest : public testing::Test,
- public testing::WithParamInterface<Case> {
-protected:
- void AppendToHeader(StringRef Code) { HeaderContent += Code.str(); }
-
- std::string runClangRenameOnCode(llvm::StringRef Code,
- llvm::StringRef OldName,
- llvm::StringRef NewName) {
- std::string NewCode;
- llvm::raw_string_ostream(NewCode) << llvm::format(
- "#include \"%s\"\n%s", HeaderName.c_str(), Code.str().c_str());
- tooling::FileContentMappings FileContents = {{HeaderName, HeaderContent},
- {CCName, NewCode}};
- clang::RewriterTestContext Context;
- Context.createInMemoryFile(HeaderName, HeaderContent);
- clang::FileID InputFileID = Context.createInMemoryFile(CCName, NewCode);
-
- rename::USRFindingAction FindingAction({}, {OldName}, false);
- std::unique_ptr<tooling::FrontendActionFactory> USRFindingActionFactory =
- tooling::newFrontendActionFactory(&FindingAction);
-
- if (!tooling::runToolOnCodeWithArgs(
- USRFindingActionFactory->create(), NewCode, {"-std=c++11"}, CCName,
- "clang-rename", std::make_shared<PCHContainerOperations>(),
- FileContents))
- return "";
-
- const std::vector<std::vector<std::string>> &USRList =
- FindingAction.getUSRList();
- std::vector<std::string> NewNames = {NewName};
- std::map<std::string, tooling::Replacements> FileToReplacements;
- rename::QualifiedRenamingAction RenameAction(NewNames, USRList,
- FileToReplacements);
- auto RenameActionFactory = tooling::newFrontendActionFactory(&RenameAction);
- if (!tooling::runToolOnCodeWithArgs(
- RenameActionFactory->create(), NewCode, {"-std=c++11"}, CCName,
- "clang-rename", std::make_shared<PCHContainerOperations>(),
- FileContents))
- return "";
-
- formatAndApplyAllReplacements(FileToReplacements, Context.Rewrite, "llvm");
- return Context.getRewrittenText(InputFileID);
- }
-
- void CompareSnippets(StringRef Expected, StringRef Actual) {
- std::string ExpectedCode;
- llvm::raw_string_ostream(ExpectedCode) << llvm::format(
- "#include \"%s\"\n%s", HeaderName.c_str(), Expected.str().c_str());
- EXPECT_EQ(format(ExpectedCode), format(Actual));
- }
-
- std::string format(llvm::StringRef Code) {
- tooling::Replacements Replaces = format::reformat(
- format::getLLVMStyle(), Code, {tooling::Range(0, Code.size())});
- auto ChangedCode = tooling::applyAllReplacements(Code, Replaces);
- EXPECT_TRUE(static_cast<bool>(ChangedCode));
- if (!ChangedCode) {
- llvm::errs() << llvm::toString(ChangedCode.takeError());
- return "";
- }
- return *ChangedCode;
- }
-
- std::string HeaderContent;
- std::string HeaderName = "header.h";
- std::string CCName = "input.cc";
-};
-
-} // namespace test
-} // namespace clang_rename
-} // namesdpace clang
diff --git a/clang-tools-extra/unittests/clang-rename/RenameClassTest.cpp b/clang-tools-extra/unittests/clang-rename/RenameClassTest.cpp
deleted file mode 100644
index 29b4594fb0a..00000000000
--- a/clang-tools-extra/unittests/clang-rename/RenameClassTest.cpp
+++ /dev/null
@@ -1,684 +0,0 @@
-//===-- RenameClassTest.cpp - unit tests for renaming classes -------------===//
-//
-// The LLVM Compiler Infrastructure
-//
-// This file is distributed under the University of Illinois Open Source
-// License. See LICENSE.TXT for details.
-//
-//===----------------------------------------------------------------------===//
-
-#include "ClangRenameTest.h"
-
-namespace clang {
-namespace clang_rename {
-namespace test {
-namespace {
-
-class RenameClassTest : public ClangRenameTest {
-public:
- RenameClassTest() {
- AppendToHeader(R"(
- namespace a {
- class Foo {
- public:
- struct Nested {
- enum NestedEnum {E1, E2};
- };
- void func() {}
- static int Constant;
- };
- class Goo {
- public:
- struct Nested {
- enum NestedEnum {E1, E2};
- };
- };
- int Foo::Constant = 1;
- } // namespace a
- namespace b {
- class Foo {};
- } // namespace b
-
- #define MACRO(x) x
-
- template<typename T> class ptr {};
- )");
- }
-};
-
-INSTANTIATE_TEST_CASE_P(
- RenameClassTests, RenameClassTest,
- testing::ValuesIn(std::vector<Case>({
- // basic classes
- {"a::Foo f;", "b::Bar f;", "", ""},
- {"void f(a::Foo f) {}", "void f(b::Bar f) {}", "", ""},
- {"void f(a::Foo *f) {}", "void f(b::Bar *f) {}", "", ""},
- {"a::Foo f() { return a::Foo(); }", "b::Bar f() { return b::Bar(); }",
- "", ""},
- {"namespace a {a::Foo f() { return Foo(); }}",
- "namespace a {b::Bar f() { return b::Bar(); }}", "", ""},
- {"void f(const a::Foo& a1) {}", "void f(const b::Bar& a1) {}", "", ""},
- {"void f(const a::Foo* a1) {}", "void f(const b::Bar* a1) {}", "", ""},
- {"namespace a { void f(Foo a1) {} }",
- "namespace a { void f(b::Bar a1) {} }", "", ""},
- {"void f(MACRO(a::Foo) a1) {}", "void f(MACRO(b::Bar) a1) {}", "", ""},
- {"void f(MACRO(a::Foo a1)) {}", "void f(MACRO(b::Bar a1)) {}", "", ""},
- {"a::Foo::Nested ns;", "b::Bar::Nested ns;", "", ""},
- {"auto t = a::Foo::Constant;", "auto t = b::Bar::Constant;", "", ""},
- {"a::Foo::Nested ns;", "a::Foo::Nested2 ns;", "a::Foo::Nested",
- "a::Foo::Nested2"},
-
- // use namespace and typedefs
- {"using a::Foo; Foo gA;", "using b::Bar; b::Bar gA;", "", ""},
- {"using a::Foo; void f(Foo gA) {}", "using b::Bar; void f(Bar gA) {}",
- "", ""},
- {"using a::Foo; namespace x { Foo gA; }",
- "using b::Bar; namespace x { Bar gA; }", "", ""},
- {"struct S { using T = a::Foo; T a_; };",
- "struct S { using T = b::Bar; T a_; };", "", ""},
- {"using T = a::Foo; T gA;", "using T = b::Bar; T gA;", "", ""},
- {"typedef a::Foo T; T gA;", "typedef b::Bar T; T gA;", "", ""},
- {"typedef MACRO(a::Foo) T; T gA;", "typedef MACRO(b::Bar) T; T gA;", "",
- ""},
-
- // struct members and other oddities
- {"struct S : public a::Foo {};", "struct S : public b::Bar {};", "",
- ""},
- {"struct F { void f(a::Foo a1) {} };",
- "struct F { void f(b::Bar a1) {} };", "", ""},
- {"struct F { a::Foo a_; };", "struct F { b::Bar a_; };", "", ""},
- {"struct F { ptr<a::Foo> a_; };", "struct F { ptr<b::Bar> a_; };", "",
- ""},
-
- {"void f() { a::Foo::Nested ne; }", "void f() { b::Bar::Nested ne; }",
- "", ""},
- {"void f() { a::Goo::Nested ne; }", "void f() { a::Goo::Nested ne; }",
- "", ""},
- {"void f() { a::Foo::Nested::NestedEnum e; }",
- "void f() { b::Bar::Nested::NestedEnum e; }", "", ""},
- {"void f() { auto e = a::Foo::Nested::NestedEnum::E1; }",
- "void f() { auto e = b::Bar::Nested::NestedEnum::E1; }", "", ""},
- {"void f() { auto e = a::Foo::Nested::E1; }",
- "void f() { auto e = b::Bar::Nested::E1; }", "", ""},
-
- // templates
- {"template <typename T> struct Foo { T t; };\n"
- "void f() { Foo<a::Foo> foo; }",
- "template <typename T> struct Foo { T t; };\n"
- "void f() { Foo<b::Bar> foo; }",
- "", ""},
- {"template <typename T> struct Foo { a::Foo a; };",
- "template <typename T> struct Foo { b::Bar a; };", "", ""},
- {"template <typename T> void f(T t) {}\n"
- "void g() { f<a::Foo>(a::Foo()); }",
- "template <typename T> void f(T t) {}\n"
- "void g() { f<b::Bar>(b::Bar()); }",
- "", ""},
- {"template <typename T> int f() { return 1; }\n"
- "template <> int f<a::Foo>() { return 2; }\n"
- "int g() { return f<a::Foo>(); }",
- "template <typename T> int f() { return 1; }\n"
- "template <> int f<b::Bar>() { return 2; }\n"
- "int g() { return f<b::Bar>(); }",
- "", ""},
- {"struct Foo { template <typename T> T foo(); };\n"
- "void g() { Foo f; auto a = f.template foo<a::Foo>(); }",
- "struct Foo { template <typename T> T foo(); };\n"
- "void g() { Foo f; auto a = f.template foo<b::Bar>(); }",
- "", ""},
-
- // The following two templates are distilled from regressions found in
- // unique_ptr<> and type_traits.h
- {"template <typename T> struct outer {\n"
- " typedef T type;\n"
- " type Baz();\n"
- " };\n"
- " outer<a::Foo> g_A;",
- "template <typename T> struct outer {\n"
- " typedef T type;\n"
- " type Baz();\n"
- " };\n"
- " outer<b::Bar> g_A;",
- "", ""},
- {"template <typename T> struct nested { typedef T type; };\n"
- "template <typename T> struct outer { typename nested<T>::type Foo(); "
- "};\n"
- "outer<a::Foo> g_A;",
- "template <typename T> struct nested { typedef T type; };\n"
- "template <typename T> struct outer { typename nested<T>::type Foo(); "
- "};\n"
- "outer<b::Bar> g_A;",
- "", ""},
-
- // macros
- {"#define FOO(T, t) T t\n"
- "void f() { FOO(a::Foo, a1); FOO(a::Foo, a2); }",
- "#define FOO(T, t) T t\n"
- "void f() { FOO(b::Bar, a1); FOO(b::Bar, a2); }",
- "", ""},
- {"#define FOO(n) a::Foo n\n"
- " void f() { FOO(a1); FOO(a2); }",
- "#define FOO(n) b::Bar n\n"
- " void f() { FOO(a1); FOO(a2); }",
- "", ""},
-
- // Pointer to member functions
- {"auto gA = &a::Foo::func;", "auto gA = &b::Bar::func;", "", ""},
- {"using a::Foo; auto gA = &Foo::func;",
- "using b::Bar; auto gA = &b::Bar::func;", "", ""},
- {"using a::Foo; namespace x { auto gA = &Foo::func; }",
- "using b::Bar; namespace x { auto gA = &Bar::func; }", "", ""},
- {"typedef a::Foo T; auto gA = &T::func;",
- "typedef b::Bar T; auto gA = &T::func;", "", ""},
- {"auto gA = &MACRO(a::Foo)::func;", "auto gA = &MACRO(b::Bar)::func;",
- "", ""},
-
- // Short match inside a namespace
- {"namespace a { void f(Foo a1) {} }",
- "namespace a { void f(b::Bar a1) {} }", "", ""},
-
- // Correct match.
- {"using a::Foo; struct F { ptr<Foo> a_; };",
- "using b::Bar; struct F { ptr<Bar> a_; };", "", ""},
-
- // avoid false positives
- {"void f(b::Foo a) {}", "void f(b::Foo a) {}", "", ""},
- {"namespace b { void f(Foo a) {} }", "namespace b { void f(Foo a) {} }",
- "", ""},
-
- // friends, everyone needs friends.
- {"class Foo { int i; friend class a::Foo; };",
- "class Foo { int i; friend class b::Bar; };", "", ""},
- })), );
-
-TEST_P(RenameClassTest, RenameClasses) {
- auto Param = GetParam();
- std::string OldName = Param.OldName.empty() ? "a::Foo" : Param.OldName;
- std::string NewName = Param.NewName.empty() ? "b::Bar" : Param.NewName;
- std::string Actual = runClangRenameOnCode(Param.Before, OldName, NewName);
- CompareSnippets(Param.After, Actual);
-}
-
-class NamespaceDetectionTest : public ClangRenameTest {
-protected:
- NamespaceDetectionTest() {
- AppendToHeader(R"(
- class Old {};
- namespace o1 {
- class Old {};
- namespace o2 {
- class Old {};
- namespace o3 {
- class Old {};
- } // namespace o3
- } // namespace o2
- } // namespace o1
- )");
- }
-};
-
-INSTANTIATE_TEST_CASE_P(
- RenameClassTest, NamespaceDetectionTest,
- ::testing::ValuesIn(std::vector<Case>({
- // Test old and new namespace overlap.
- {"namespace o1 { namespace o2 { namespace o3 { Old moo; } } }",
- "namespace o1 { namespace o2 { namespace o3 { New moo; } } }",
- "o1::o2::o3::Old", "o1::o2::o3::New"},
- {"namespace o1 { namespace o2 { namespace o3 { Old moo; } } }",
- "namespace o1 { namespace o2 { namespace o3 { n3::New moo; } } }",
- "o1::o2::o3::Old", "o1::o2::n3::New"},
- {"namespace o1 { namespace o2 { namespace o3 { Old moo; } } }",
- "namespace o1 { namespace o2 { namespace o3 { n2::n3::New moo; } } }",
- "o1::o2::o3::Old", "o1::n2::n3::New"},
- {"namespace o1 { namespace o2 { Old moo; } }",
- "namespace o1 { namespace o2 { New moo; } }", "::o1::o2::Old",
- "::o1::o2::New"},
- {"namespace o1 { namespace o2 { Old moo; } }",
- "namespace o1 { namespace o2 { n2::New moo; } }", "::o1::o2::Old",
- "::o1::n2::New"},
- {"namespace o1 { namespace o2 { Old moo; } }",
- "namespace o1 { namespace o2 { ::n1::n2::New moo; } }",
- "::o1::o2::Old", "::n1::n2::New"},
- {"namespace o1 { namespace o2 { Old moo; } }",
- "namespace o1 { namespace o2 { n1::n2::New moo; } }", "::o1::o2::Old",
- "n1::n2::New"},
-
- // Test old and new namespace with differing depths.
- {"namespace o1 { namespace o2 { namespace o3 { Old moo; } } }",
- "namespace o1 { namespace o2 { namespace o3 { New moo; } } }",
- "o1::o2::o3::Old", "::o1::New"},
- {"namespace o1 { namespace o2 { namespace o3 { Old moo; } } }",
- "namespace o1 { namespace o2 { namespace o3 { New moo; } } }",
- "o1::o2::o3::Old", "::o1::o2::New"},
- {"namespace o1 { namespace o2 { namespace o3 { Old moo; } } }",
- "namespace o1 { namespace o2 { namespace o3 { New moo; } } }",
- "o1::o2::o3::Old", "o1::New"},
- {"namespace o1 { namespace o2 { namespace o3 { Old moo; } } }",
- "namespace o1 { namespace o2 { namespace o3 { New moo; } } }",
- "o1::o2::o3::Old", "o1::o2::New"},
- {"Old moo;", "o1::New moo;", "::Old", "o1::New"},
- {"Old moo;", "o1::New moo;", "Old", "o1::New"},
- {"namespace o1 { ::Old moo; }", "namespace o1 { New moo; }", "Old",
- "o1::New"},
- {"namespace o1 { namespace o2 { Old moo; } }",
- "namespace o1 { namespace o2 { ::New moo; } }", "::o1::o2::Old",
- "::New"},
- {"namespace o1 { namespace o2 { Old moo; } }",
- "namespace o1 { namespace o2 { New moo; } }", "::o1::o2::Old", "New"},
-
- // Test moving into the new namespace at different levels.
- {"namespace n1 { namespace n2 { o1::o2::Old moo; } }",
- "namespace n1 { namespace n2 { New moo; } }", "::o1::o2::Old",
- "::n1::n2::New"},
- {"namespace n1 { namespace n2 { o1::o2::Old moo; } }",
- "namespace n1 { namespace n2 { New moo; } }", "::o1::o2::Old",
- "n1::n2::New"},
- {"namespace n1 { namespace n2 { o1::o2::Old moo; } }",
- "namespace n1 { namespace n2 { o2::New moo; } }", "::o1::o2::Old",
- "::n1::o2::New"},
- {"namespace n1 { namespace n2 { o1::o2::Old moo; } }",
- "namespace n1 { namespace n2 { o2::New moo; } }", "::o1::o2::Old",
- "n1::o2::New"},
- {"namespace n1 { namespace n2 { o1::o2::Old moo; } }",
- "namespace n1 { namespace n2 { ::o1::o2::New moo; } }",
- "::o1::o2::Old", "::o1::o2::New"},
- {"namespace n1 { namespace n2 { o1::o2::Old moo; } }",
- "namespace n1 { namespace n2 { o1::o2::New moo; } }", "::o1::o2::Old",
- "o1::o2::New"},
-
- // Test friends declarations.
- {"class Foo { friend class o1::Old; };",
- "class Foo { friend class o1::New; };", "o1::Old", "o1::New"},
- {"class Foo { int i; friend class o1::Old; };",
- "class Foo { int i; friend class ::o1::New; };", "::o1::Old",
- "::o1::New"},
- {"namespace o1 { class Foo { int i; friend class Old; }; }",
- "namespace o1 { class Foo { int i; friend class New; }; }", "o1::Old",
- "o1::New"},
- {"namespace o1 { class Foo { int i; friend class Old; }; }",
- "namespace o1 { class Foo { int i; friend class New; }; }",
- "::o1::Old", "::o1::New"},
- })), );
-
-TEST_P(NamespaceDetectionTest, RenameClasses) {
- auto Param = GetParam();
- std::string Actual =
- runClangRenameOnCode(Param.Before, Param.OldName, Param.NewName);
- CompareSnippets(Param.After, Actual);
-}
-
-class TemplatedClassRenameTest : public ClangRenameTest {
-protected:
- TemplatedClassRenameTest() {
- AppendToHeader(R"(
- template <typename T> struct Old {
- T t_;
- T f() { return T(); };
- static T s(T t) { return t; }
- };
- namespace ns {
- template <typename T> struct Old {
- T t_;
- T f() { return T(); };
- static T s(T t) { return t; }
- };
- } // namespace ns
-
- namespace o1 {
- namespace o2 {
- namespace o3 {
- template <typename T> struct Old {
- T t_;
- T f() { return T(); };
- static T s(T t) { return t; }
- };
- } // namespace o3
- } // namespace o2
- } // namespace o1
- )");
- }
-};
-
-INSTANTIATE_TEST_CASE_P(
- RenameClassTests, TemplatedClassRenameTest,
- ::testing::ValuesIn(std::vector<Case>({
- {"Old<int> gI; Old<bool> gB;", "New<int> gI; New<bool> gB;", "Old",
- "New"},
- {"ns::Old<int> gI; ns::Old<bool> gB;",
- "ns::New<int> gI; ns::New<bool> gB;", "ns::Old", "ns::New"},
- {"auto gI = &Old<int>::f; auto gB = &Old<bool>::f;",
- "auto gI = &New<int>::f; auto gB = &New<bool>::f;", "Old", "New"},
- {"auto gI = &ns::Old<int>::f;", "auto gI = &ns::New<int>::f;",
- "ns::Old", "ns::New"},
-
- {"int gI = Old<int>::s(0); bool gB = Old<bool>::s(false);",
- "int gI = New<int>::s(0); bool gB = New<bool>::s(false);", "Old",
- "New"},
- {"int gI = ns::Old<int>::s(0); bool gB = ns::Old<bool>::s(false);",
- "int gI = ns::New<int>::s(0); bool gB = ns::New<bool>::s(false);",
- "ns::Old", "ns::New"},
-
- {"struct S { Old<int*> o_; };", "struct S { New<int*> o_; };", "Old",
- "New"},
- {"struct S { ns::Old<int*> o_; };", "struct S { ns::New<int*> o_; };",
- "ns::Old", "ns::New"},
-
- {"auto a = reinterpret_cast<Old<int>*>(new Old<int>);",
- "auto a = reinterpret_cast<New<int>*>(new New<int>);", "Old", "New"},
- {"auto a = reinterpret_cast<ns::Old<int>*>(new ns::Old<int>);",
- "auto a = reinterpret_cast<ns::New<int>*>(new ns::New<int>);",
- "ns::Old", "ns::New"},
- {"auto a = reinterpret_cast<const Old<int>*>(new Old<int>);",
- "auto a = reinterpret_cast<const New<int>*>(new New<int>);", "Old",
- "New"},
- {"auto a = reinterpret_cast<const ns::Old<int>*>(new ns::Old<int>);",
- "auto a = reinterpret_cast<const ns::New<int>*>(new ns::New<int>);",
- "ns::Old", "ns::New"},
-
- {"Old<bool>& foo();", "New<bool>& foo();", "Old", "New"},
- {"ns::Old<bool>& foo();", "ns::New<bool>& foo();", "ns::Old",
- "ns::New"},
- {"o1::o2::o3::Old<bool>& foo();", "o1::o2::o3::New<bool>& foo();",
- "o1::o2::o3::Old", "o1::o2::o3::New"},
- {"namespace ns { Old<bool>& foo(); }",
- "namespace ns { New<bool>& foo(); }", "ns::Old", "ns::New"},
- {"const Old<bool>& foo();", "const New<bool>& foo();", "Old", "New"},
- {"const ns::Old<bool>& foo();", "const ns::New<bool>& foo();",
- "ns::Old", "ns::New"},
-
- // FIXME: figure out why this only works when Moo gets
- // specialized at some point.
- {"template <typename T> struct Moo { Old<T> o_; }; Moo<int> m;",
- "template <typename T> struct Moo { New<T> o_; }; Moo<int> m;", "Old",
- "New"},
- {"template <typename T> struct Moo { ns::Old<T> o_; }; Moo<int> m;",
- "template <typename T> struct Moo { ns::New<T> o_; }; Moo<int> m;",
- "ns::Old", "ns::New"},
- })), );
-
-TEST_P(TemplatedClassRenameTest, RenameTemplateClasses) {
- auto Param = GetParam();
- std::string Actual =
- runClangRenameOnCode(Param.Before, Param.OldName, Param.NewName);
- CompareSnippets(Param.After, Actual);
-}
-
-TEST_F(ClangRenameTest, RenameClassWithOutOfLineMembers) {
- std::string Before = R"(
- class Old {
- public:
- Old();
- ~Old();
-
- Old* next();
-
- private:
- Old* next_;
- };
-
- Old::Old() {}
- Old::~Old() {}
- Old* Old::next() { return next_; }
- )";
- std::string Expected = R"(
- class New {
- public:
- New();
- ~New();
-
- New* next();
-
- private:
- New* next_;
- };
-
- New::New() {}
- New::~New() {}
- New* New::next() { return next_; }
- )";
- std::string After = runClangRenameOnCode(Before, "Old", "New");
- CompareSnippets(Expected, After);
-}
-
-TEST_F(ClangRenameTest, RenameClassWithInlineMembers) {
- std::string Before = R"(
- class Old {
- public:
- Old() {}
- ~Old() {}
-
- Old* next() { return next_; }
-
- private:
- Old* next_;
- };
- )";
- std::string Expected = R"(
- class New {
- public:
- New() {}
- ~New() {}
-
- New* next() { return next_; }
-
- private:
- New* next_;
- };
- )";
- std::string After = runClangRenameOnCode(Before, "Old", "New");
- CompareSnippets(Expected, After);
-}
-
-// FIXME: no prefix qualifiers being added to the class definition and
-// constructor.
-TEST_F(ClangRenameTest, RenameClassWithNamespaceWithInlineMembers) {
- std::string Before = R"(
- namespace ns {
- class Old {
- public:
- Old() {}
- ~Old() {}
-
- Old* next() { return next_; }
-
- private:
- Old* next_;
- };
- } // namespace ns
- )";
- std::string Expected = R"(
- namespace ns {
- class ns::New {
- public:
- ns::New() {}
- ~New() {}
-
- New* next() { return next_; }
-
- private:
- New* next_;
- };
- } // namespace ns
- )";
- std::string After = runClangRenameOnCode(Before, "ns::Old", "ns::New");
- CompareSnippets(Expected, After);
-}
-
-// FIXME: no prefix qualifiers being added to the class definition and
-// constructor.
-TEST_F(ClangRenameTest, RenameClassWithNamespaceWithOutOfInlineMembers) {
- std::string Before = R"(
- namespace ns {
- class Old {
- public:
- Old();
- ~Old();
-
- Old* next();
-
- private:
- Old* next_;
- };
-
- Old::Old() {}
- Old::~Old() {}
- Old* Old::next() { return next_; }
- } // namespace ns
- )";
- std::string Expected = R"(
- namespace ns {
- class ns::New {
- public:
- ns::New();
- ~New();
-
- New* next();
-
- private:
- New* next_;
- };
-
- New::ns::New() {}
- New::~New() {}
- New* New::next() { return next_; }
- } // namespace ns
- )";
- std::string After = runClangRenameOnCode(Before, "ns::Old", "ns::New");
- CompareSnippets(Expected, After);
-}
-
-// FIXME: no prefix qualifiers being added to the definition.
-TEST_F(ClangRenameTest, RenameClassInInheritedConstructor) {
- // `using Base::Base;` will generate an implicit constructor containing usage
- // of `::ns::Old` which should not be matched.
- std::string Before = R"(
- namespace ns {
- class Old {
- int x;
- };
- class Base {
- protected:
- Old *moo_;
- public:
- Base(Old *moo) : moo_(moo) {}
- };
- class Derived : public Base {
- public:
- using Base::Base;
- };
- } // namespace ns
- int main() {
- ::ns::Old foo;
- ::ns::Derived d(&foo);
- return 0;
- })";
- std::string Expected = R"(
- namespace ns {
- class ns::New {
- int x;
- };
- class Base {
- protected:
- New *moo_;
- public:
- Base(New *moo) : moo_(moo) {}
- };
- class Derived : public Base {
- public:
- using Base::Base;
- };
- } // namespace ns
- int main() {
- ::ns::New foo;
- ::ns::Derived d(&foo);
- return 0;
- })";
- std::string After = runClangRenameOnCode(Before, "ns::Old", "ns::New");
- CompareSnippets(Expected, After);
-}
-
-TEST_F(ClangRenameTest, DontRenameReferencesInImplicitFunction) {
- std::string Before = R"(
- namespace ns {
- class Old {
- };
- } // namespace ns
- struct S {
- int y;
- ns::Old old;
- };
- void f() {
- S s1, s2, s3;
- // This causes an implicit assignment operator to be created.
- s1 = s2 = s3;
- }
- )";
- std::string Expected = R"(
- namespace ns {
- class ::new_ns::New {
- };
- } // namespace ns
- struct S {
- int y;
- ::new_ns::New old;
- };
- void f() {
- S s1, s2, s3;
- // This causes an implicit assignment operator to be created.
- s1 = s2 = s3;
- }
- )";
- std::string After = runClangRenameOnCode(Before, "ns::Old", "::new_ns::New");
- CompareSnippets(Expected, After);
-}
-
-// FIXME: no prefix qualifiers being adding to the definition.
-TEST_F(ClangRenameTest, ReferencesInLambdaFunctionParameters) {
- std::string Before = R"(
- template <class T>
- class function;
- template <class R, class... ArgTypes>
- class function<R(ArgTypes...)> {
- public:
- template <typename Functor>
- function(Functor f) {}
-
- function() {}
-
- R operator()(ArgTypes...) const {}
- };
-
- namespace ns {
- class Old {};
- void f() {
- function<void(Old)> func;
- }
- } // namespace ns)";
- std::string Expected = R"(
- template <class T>
- class function;
- template <class R, class... ArgTypes>
- class function<R(ArgTypes...)> {
- public:
- template <typename Functor>
- function(Functor f) {}
-
- function() {}
-
- R operator()(ArgTypes...) const {}
- };
-
- namespace ns {
- class ::new_ns::New {};
- void f() {
- function<void(::new_ns::New)> func;
- }
- } // namespace ns)";
- std::string After = runClangRenameOnCode(Before, "ns::Old", "::new_ns::New");
- CompareSnippets(Expected, After);
-}
-
-} // anonymous namespace
-} // namespace test
-} // namespace clang_rename
-} // namesdpace clang
OpenPOWER on IntegriCloud