[clang-tools-extra] r278145 - clang-rename rename-all: support reading old/newname pairs from a YAML file

Miklos Vajna via cfe-commits cfe-commits at lists.llvm.org
Tue Aug 9 11:20:41 PDT 2016


Author: vmiklos
Date: Tue Aug  9 13:20:41 2016
New Revision: 278145

URL: http://llvm.org/viewvc/llvm-project?rev=278145&view=rev
Log:
clang-rename rename-all: support reading old/newname pairs from a YAML file

This is handy in case by the time clang-rename is invoked, an external
tool already genereated a list of oldname -> newname pairs to handle.

Reviewers: omtcyfz

Differential Revision: https://reviews.llvm.org/D23198

Added:
    clang-tools-extra/trunk/test/clang-rename/ClassTestMultiByNameYAML.cpp
    clang-tools-extra/trunk/test/clang-rename/Inputs/
    clang-tools-extra/trunk/test/clang-rename/Inputs/ClassTestMultiByNameYAMLRenameAll.yaml
    clang-tools-extra/trunk/test/clang-rename/Inputs/ClassTestMultiByNameYAMLRenameAt.yaml
Modified:
    clang-tools-extra/trunk/clang-rename/tool/ClangRename.cpp
    clang-tools-extra/trunk/docs/clang-rename.rst

Modified: clang-tools-extra/trunk/clang-rename/tool/ClangRename.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-rename/tool/ClangRename.cpp?rev=278145&r1=278144&r2=278145&view=diff
==============================================================================
--- clang-tools-extra/trunk/clang-rename/tool/ClangRename.cpp (original)
+++ clang-tools-extra/trunk/clang-rename/tool/ClangRename.cpp Tue Aug  9 13:20:41 2016
@@ -56,6 +56,33 @@ static int renameAtMain(int argc, const
 static int renameAllMain(int argc, const char *argv[]);
 static int helpMain(int argc, const char *argv[]);
 
+/// \brief An oldname -> newname rename.
+struct RenameAllInfo {
+  std::string OldName;
+  unsigned Offset;
+  std::string NewName;
+
+  RenameAllInfo() : Offset(0) {}
+};
+
+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("OldName", Info.OldName);
+    IO.mapOptional("Offset", Info.Offset);
+    IO.mapRequired("NewName", Info.NewName);
+  }
+};
+
+} // end namespace yaml
+} // end namespace llvm
+
 int main(int argc, const char **argv) {
   if (argc > 1) {
     using MainFunction = std::function<int(int, const char *[])>;
@@ -91,7 +118,7 @@ int subcommandMain(bool isRenameAll, int
 
   cl::list<std::string> NewNames(
       "new-name", cl::desc("The new name to change the symbol to."),
-      (isRenameAll ? cl::OneOrMore : cl::Required), cl::cat(*Category));
+      (isRenameAll ? cl::ZeroOrMore : cl::Required), cl::cat(*Category));
   cl::list<unsigned> SymbolOffsets(
       "offset",
       cl::desc("Locates the symbol by offset as opposed to <line>:<column>."),
@@ -114,11 +141,40 @@ int subcommandMain(bool isRenameAll, int
   cl::opt<std::string> ExportFixes(
       "export-fixes", cl::desc("YAML file to store suggested fixes in."),
       cl::value_desc("filename"), cl::cat(*Category));
+  cl::opt<std::string> Input(
+      "input", cl::desc("YAML file to load oldname-newname pairs from."),
+      cl::Optional, cl::cat(ClangRenameAllCategory));
 
   tooling::CommonOptionsParser OP(argc, argv, *Category, Usage);
 
+  if (!Input.empty()) {
+    // Populate OldNames and NewNames from a YAML file.
+    auto Buffer = llvm::MemoryBuffer::getFile(Input);
+    if (!Buffer) {
+      errs() << "clang-rename: failed to read " << Input << ": "
+             << Buffer.getError().message() << "\n";
+      exit(1);
+    }
+
+    std::vector<RenameAllInfo> Infos;
+    llvm::yaml::Input YAML(Buffer.get()->getBuffer());
+    YAML >> Infos;
+    for (const auto &Info : Infos) {
+      if (!Info.OldName.empty())
+        OldNames.push_back(Info.OldName);
+      else
+        SymbolOffsets.push_back(Info.Offset);
+      NewNames.push_back(Info.NewName);
+    }
+  }
+
   // Check the arguments for correctness.
 
+  if (NewNames.empty()) {
+    errs() << "clang-rename: either -new-name or -input is required.\n\n";
+    exit(1);
+  }
+
   // Check if NewNames is a valid identifier in C++17.
   for (const auto &NewName : NewNames) {
     LangOptions Options;

Modified: clang-tools-extra/trunk/docs/clang-rename.rst
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/docs/clang-rename.rst?rev=278145&r1=278144&r2=278145&view=diff
==============================================================================
--- clang-tools-extra/trunk/docs/clang-rename.rst (original)
+++ clang-tools-extra/trunk/docs/clang-rename.rst Tue Aug  9 13:20:41 2016
@@ -42,6 +42,16 @@ To get an offset of a symbol in a file r
   $ grep -FUbo 'foo' file.cpp
 
 
+The tool currently supports renaming actions inside a single Translation Unit
+only. It is planned to extend the tool's functionality to support multi-TU
+renaming actions in the future.
+
+:program:`clang-rename` also aims to be easily integrated into popular text
+editors, such as Vim and Emacs, and improve the workflow of users.
+
+Although a command line interface exists, it is highly recommended to use the
+text editor interface instead for better experience.
+
 You can also identify one or more symbols to be renamed by giving the fully qualified
 name:
 
@@ -50,15 +60,34 @@ name:
   $ clang-rename rename-all -old-name=foo -new-name=bar test.cpp
 
 
-The tool currently supports renaming actions inside a single Translation Unit
-only. It is planned to extend the tool's functionality to support multi-TU
-renaming actions in the future.
+Alternatively, old name / new name pairs can be put into a YAML file:
 
-:program:`clang-rename` also aims to be easily integrated into popular text
-editors, such as Vim and Emacs, and improve the workflow of users.
+.. code-block:: yaml
 
-Although a command line interface exists, it is highly recommended to use the
-text editor interface instead for better experience.
+  ---
+  - OldName:        foo
+    NewName:        bar
+  ...
+
+
+That way you can avoid spelling out all the names as commandline arguments:
+
+.. code-block:: console
+
+  $ clang-rename rename-all -input=test.yaml test.cpp
+
+
+The YAML file also supports offsets:
+
+.. code-block:: yaml
+
+  ---
+  - Offset:         42
+    NewName:        foo
+  ...
+
+
+:program:`clang-rename` offers the following options:
 
 .. code-block:: console
 
@@ -125,6 +154,7 @@ text editor interface instead for better
     -extra-arg=<string>        - Additional argument to append to the compiler command line
     -extra-arg-before=<string> - Additional argument to prepend to the compiler command line
     -i                         - Overwrite edited <file>s.
+    -input=<string>            - YAML file to load oldname-newname pairs from.
     -new-name=<string>         - The new name to change the symbol to.
     -offset=<uint>             - Locates the symbol by offset as opposed to <line>:<column>.
     -old-name=<string>         - The fully qualified name of the symbol, if -offset is not used.

Added: clang-tools-extra/trunk/test/clang-rename/ClassTestMultiByNameYAML.cpp
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-rename/ClassTestMultiByNameYAML.cpp?rev=278145&view=auto
==============================================================================
--- clang-tools-extra/trunk/test/clang-rename/ClassTestMultiByNameYAML.cpp (added)
+++ clang-tools-extra/trunk/test/clang-rename/ClassTestMultiByNameYAML.cpp Tue Aug  9 13:20:41 2016
@@ -0,0 +1,7 @@
+class Foo1 { // CHECK: class Bar1
+};
+
+class Foo2 { // CHECK: class Bar2
+};
+// RUN: clang-rename rename-all -input %S/Inputs/ClassTestMultiByNameYAMLRenameAll.yaml %s -- | sed 's,//.*,,' | FileCheck %s
+// RUN: clang-rename rename-all -input %S/Inputs/ClassTestMultiByNameYAMLRenameAt.yaml %s -- | sed 's,//.*,,' | FileCheck %s

Added: clang-tools-extra/trunk/test/clang-rename/Inputs/ClassTestMultiByNameYAMLRenameAll.yaml
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-rename/Inputs/ClassTestMultiByNameYAMLRenameAll.yaml?rev=278145&view=auto
==============================================================================
--- clang-tools-extra/trunk/test/clang-rename/Inputs/ClassTestMultiByNameYAMLRenameAll.yaml (added)
+++ clang-tools-extra/trunk/test/clang-rename/Inputs/ClassTestMultiByNameYAMLRenameAll.yaml Tue Aug  9 13:20:41 2016
@@ -0,0 +1,6 @@
+---
+- OldName:        Foo1
+  NewName:        Bar1
+- OldName:        Foo2
+  NewName:        Bar2
+...

Added: clang-tools-extra/trunk/test/clang-rename/Inputs/ClassTestMultiByNameYAMLRenameAt.yaml
URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/test/clang-rename/Inputs/ClassTestMultiByNameYAMLRenameAt.yaml?rev=278145&view=auto
==============================================================================
--- clang-tools-extra/trunk/test/clang-rename/Inputs/ClassTestMultiByNameYAMLRenameAt.yaml (added)
+++ clang-tools-extra/trunk/test/clang-rename/Inputs/ClassTestMultiByNameYAMLRenameAt.yaml Tue Aug  9 13:20:41 2016
@@ -0,0 +1,6 @@
+---
+- Offset:         6
+  NewName:        Bar1
+- Offset:         44
+  NewName:        Bar2
+...




More information about the cfe-commits mailing list