diff options
author | Haojian Wu <hokein@google.com> | 2016-10-13 08:48:42 +0000 |
---|---|---|
committer | Haojian Wu <hokein@google.com> | 2016-10-13 08:48:42 +0000 |
commit | 9df3ac1f564b0b8367290edceba71a225b7f7f99 (patch) | |
tree | 06dd2a4e070d3585ee09050939bb9228d4264abc /clang-tools-extra/clang-move | |
parent | 92ccbf20ff88fcf4c10c9c007fa02400d42252df (diff) | |
download | bcm5719-llvm-9df3ac1f564b0b8367290edceba71a225b7f7f99.tar.gz bcm5719-llvm-9df3ac1f564b0b8367290edceba71a225b7f7f99.zip |
Recommit r283538 "[clang-move] Support moving multiple classes in one run."
llvm-svn: 284109
Diffstat (limited to 'clang-tools-extra/clang-move')
-rw-r--r-- | clang-tools-extra/clang-move/ClangMove.cpp | 22 | ||||
-rw-r--r-- | clang-tools-extra/clang-move/ClangMove.h | 5 | ||||
-rw-r--r-- | clang-tools-extra/clang-move/tool/ClangMoveMain.cpp | 8 |
3 files changed, 25 insertions, 10 deletions
diff --git a/clang-tools-extra/clang-move/ClangMove.cpp b/clang-tools-extra/clang-move/ClangMove.cpp index fe19fa0065f..c429a185cea 100644 --- a/clang-tools-extra/clang-move/ClangMove.cpp +++ b/clang-tools-extra/clang-move/ClangMove.cpp @@ -297,31 +297,43 @@ ClangMoveTool::ClangMoveTool( : Spec(MoveSpec), FileToReplacements(FileToReplacements), OriginalRunningDirectory(OriginalRunningDirectory), FallbackStyle(FallbackStyle) { - Spec.Name = llvm::StringRef(Spec.Name).ltrim(':'); if (!Spec.NewHeader.empty()) CCIncludes.push_back("#include \"" + Spec.NewHeader + "\"\n"); } void ClangMoveTool::registerMatchers(ast_matchers::MatchFinder *Finder) { - std::string FullyQualifiedName = "::" + Spec.Name; + SmallVector<StringRef, 4> ClassNames; + llvm::StringRef(Spec.Names).split(ClassNames, ','); + Optional<ast_matchers::internal::Matcher<NamedDecl>> InMovedClassNames; + for (StringRef ClassName : ClassNames) { + llvm::StringRef GlobalClassName = ClassName.trim().ltrim(':'); + const auto HasName = hasName(("::" + GlobalClassName).str()); + InMovedClassNames = + InMovedClassNames ? anyOf(*InMovedClassNames, HasName) : HasName; + } + if (!InMovedClassNames) { + llvm::errs() << "No classes being moved.\n"; + return; + } + auto InOldHeader = isExpansionInFile( MakeAbsolutePath(OriginalRunningDirectory, Spec.OldHeader)); auto InOldCC = isExpansionInFile( MakeAbsolutePath(OriginalRunningDirectory, Spec.OldCC)); auto InOldFiles = anyOf(InOldHeader, InOldCC); auto InMovedClass = - hasDeclContext(cxxRecordDecl(hasName(FullyQualifiedName))); + hasDeclContext(cxxRecordDecl(*InMovedClassNames)); // Match moved class declarations. auto MovedClass = cxxRecordDecl( - InOldFiles, hasName(FullyQualifiedName), isDefinition(), + InOldFiles, *InMovedClassNames, isDefinition(), hasDeclContext(anyOf(namespaceDecl(), translationUnitDecl()))); Finder->addMatcher(MovedClass.bind("moved_class"), this); // Match moved class methods (static methods included) which are defined // outside moved class declaration. Finder->addMatcher(cxxMethodDecl(InOldFiles, - ofClass(hasName(FullyQualifiedName)), + ofClass(*InMovedClassNames), isDefinition()) .bind("class_method"), this); diff --git a/clang-tools-extra/clang-move/ClangMove.h b/clang-tools-extra/clang-move/ClangMove.h index 0cacae8efd3..28885e221be 100644 --- a/clang-tools-extra/clang-move/ClangMove.h +++ b/clang-tools-extra/clang-move/ClangMove.h @@ -37,8 +37,9 @@ public: }; struct MoveDefinitionSpec { - // A fully qualified name, e.g. "X", "a::X". - std::string Name; + // A comma-separated list of fully qualified names, e.g. "Foo", + // "a::Foo, b::Foo". + std::string Names; // The file path of old header, can be relative path and absolute path. std::string OldHeader; // The file path of old cc, can be relative path and absolute path. diff --git a/clang-tools-extra/clang-move/tool/ClangMoveMain.cpp b/clang-tools-extra/clang-move/tool/ClangMoveMain.cpp index 09f5805dcd0..91677d73b2a 100644 --- a/clang-tools-extra/clang-move/tool/ClangMoveMain.cpp +++ b/clang-tools-extra/clang-move/tool/ClangMoveMain.cpp @@ -37,8 +37,10 @@ std::error_code CreateNewFile(const llvm::Twine &path) { cl::OptionCategory ClangMoveCategory("clang-move options"); -cl::opt<std::string> Name("name", cl::desc("The name of class being moved."), - cl::cat(ClangMoveCategory)); +cl::opt<std::string> + Names("names", cl::desc("A comma-separated list of the names of classes " + "being moved, e.g. \"Foo\", \"a::Foo, b::Foo\"."), + cl::cat(ClangMoveCategory)); cl::opt<std::string> OldHeader("old_header", @@ -86,7 +88,7 @@ int main(int argc, const char **argv) { tooling::RefactoringTool Tool(OptionsParser.getCompilations(), OptionsParser.getSourcePathList()); move::ClangMoveTool::MoveDefinitionSpec Spec; - Spec.Name = Name; + Spec.Names = Names; Spec.OldHeader = OldHeader; Spec.NewHeader = NewHeader; Spec.OldCC = OldCC; |