[Libreoffice-commits] dev-tools.git: clang/bin clang/find-unprefixed-members.cxx clang/README clang/rename.cxx

Miklos Vajna vmiklos at collabora.co.uk
Tue Aug 16 07:43:17 UTC 2016


 clang/README                      |   32 ++++++++++++++++++++
 clang/bin/rename-wrapper          |    7 +++-
 clang/find-unprefixed-members.cxx |   59 ++++++++++++++++++++++++++++----------
 clang/rename.cxx                  |    3 +
 4 files changed, 85 insertions(+), 16 deletions(-)

New commits:
commit 07ec6777ea7b490fdc2e66cc3a956d629bd4f722
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue Aug 16 09:42:53 2016 +0200

    clang: add -yaml option to find-unused-prefixes
    
    This extends find-unprefixed-members to work with clang-rename.

diff --git a/clang/README b/clang/README
index 052a14e..94e15ca 100644
--- a/clang/README
+++ b/clang/README
@@ -77,4 +77,36 @@ Once the rewriting is done, you can overwrite the original files with the .new-r
 for i in $(find . -name "*.new-rename"); do mv -f $i ${i%%.new-rename}; done
 ----
 
+== Using find-unprefixed-members with clang-rename
+
+With new enough clang-rename (clang-tools-extra r278201 towards 4.0 or newer)
+it's possible to avoid using the simple rename tool included in this repo. One
+advantage of doing so is correct handling of overriden member functions.  Here
+is an example:
+
+Detect unprefixed members for a class:
+
+----
+make -sr -j8 COMPILER_EXTERNAL_TOOL=1 CCACHE_PREFIX=find-unprefixed-members-wrapper2 RENAME_ARGS="-class-name=SwPagePreview -yaml"
+----
+
+(`find-unprefixed-members-wrapper2` is the same as `rename-wrapper`, just `s/=rename/=find-unprefixed-members/`.)
+
+and save the output to `$HOME/rename.yaml`.
+
+Rename them:
+
+----
+make -sr -j8 COMPILER_EXTERNAL_TOOL=1 CCACHE_PREFIX=clang-rename-wrapper RENAME_ARGS="rename-all -input=$HOME/rename.yaml"
+----
+
+(`clang-rename-wrapper` is the same as `rename-wrapper`, just `s/=rename/=clang-rename/`.)
+
+Put output into git:
+
+----
+clang-apply-replacements /tmp/rename
+rm -rf /tmp/rename
+----
+
 // vim: ft=asciidoc
diff --git a/clang/bin/rename-wrapper b/clang/bin/rename-wrapper
index b13fb90..6f4e938 100755
--- a/clang/bin/rename-wrapper
+++ b/clang/bin/rename-wrapper
@@ -1,6 +1,7 @@
 #!/bin/bash
 
 mydir=$(dirname $0)
+myname=rename
 if [ -h $0 ]; then
     mydir=$(dirname $(readlink -f $0))
 fi
@@ -24,7 +25,11 @@ done
 
 ret=0
 if [ -n "$file" ]; then
-    $mydir/rename $RENAME_ARGS $file -- "$@"
+    if [ "$myname" == "clang-rename" ]; then
+        mkdir -p /tmp/rename
+        RENAME_ARGS="$RENAME_ARGS -export-fixes=$(mktemp -p /tmp/rename XXXXXXXXXX.yaml)"
+    fi
+    $mydir/$myname $RENAME_ARGS $file -- "$@"
     ret=$?
 fi
 
diff --git a/clang/find-unprefixed-members.cxx b/clang/find-unprefixed-members.cxx
index 77baa58..2f85ffe 100644
--- a/clang/find-unprefixed-members.cxx
+++ b/clang/find-unprefixed-members.cxx
@@ -10,20 +10,37 @@
 #include <clang/Tooling/CommonOptionsParser.h>
 #include <clang/Tooling/Tooling.h>
 
+class RenameResult
+{
+public:
+    std::string m_aScope;
+    std::string m_aOldName;
+    std::string m_aNewName;
+
+    RenameResult(const std::string& rScope, const std::string& rOldName, const std::string& rNewName)
+        : m_aScope(rScope),
+          m_aOldName(rOldName),
+          m_aNewName(rNewName)
+    {
+    }
+};
+
 class Context
 {
     std::string m_aClassName;
     std::string m_aClassPrefix;
     std::set<std::string> m_aClassExcludedPrefixes;
     bool m_bPoco;
+    bool m_bYaml;
     std::string m_aPathPrefix;
     clang::ASTContext* m_pContext;
 
 public:
-    Context(const std::string& rClassName, const std::string& rClassPrefix, const std::string& rClassExcludedPrefix, bool bPoco, const std::string& rPathPrefix)
+    Context(const std::string& rClassName, const std::string& rClassPrefix, const std::string& rClassExcludedPrefix, bool bPoco, bool bYaml, const std::string& rPathPrefix)
         : m_aClassName(rClassName),
           m_aClassPrefix(rClassPrefix),
           m_bPoco(bPoco),
+          m_bYaml(bYaml),
           m_aPathPrefix(rPathPrefix),
           m_pContext(nullptr)
     {
@@ -115,13 +132,18 @@ public:
 
         return bRet;
     }
+
+    bool getYaml() const
+    {
+        return m_bYaml;
+    }
 };
 
 class Visitor : public clang::RecursiveASTVisitor<Visitor>
 {
     Context m_rContext;
     /// List of qualified class name -- member name pairs.
-    std::vector<std::pair<std::string, std::string>> m_aResults;
+    std::vector<RenameResult> m_aResults;
     /// List of qualified class names which have member functions.
     std::set<std::string> m_aFunctions;
 
@@ -132,7 +154,7 @@ public:
         m_rContext.setASTContext(rASTContext);
     }
 
-    const std::vector<std::pair<std::string, std::string>>& getResults()
+    const std::vector<RenameResult>& getResults()
     {
         return m_aResults;
     }
@@ -162,9 +184,7 @@ public:
             if (!m_rContext.checkNonStatic(aName))
             {
                 m_rContext.suggestNonStatic(aName);
-                std::stringstream ss;
-                ss << pDecl->getNameAsString() << "," << aName;
-                m_aResults.push_back(std::make_pair(pRecord->getQualifiedNameAsString(), ss.str()));
+                m_aResults.push_back(RenameResult(pRecord->getQualifiedNameAsString(), pDecl->getNameAsString(), aName));
             }
         }
 
@@ -194,9 +214,7 @@ public:
             if (!m_rContext.checkStatic(aName))
             {
                 m_rContext.suggestStatic(aName);
-                std::stringstream ss;
-                ss << pDecl->getNameAsString() << "," << aName;
-                m_aResults.push_back(std::make_pair(pRecord->getQualifiedNameAsString(), ss.str()));
+                m_aResults.push_back(RenameResult(pRecord->getQualifiedNameAsString(), pDecl->getNameAsString(), aName));
             }
         }
 
@@ -238,20 +256,30 @@ public:
         Visitor aVisitor(m_rContext, rContext);
         aVisitor.TraverseDecl(rContext.getTranslationUnitDecl());
         const std::set<std::string>& rFunctions = aVisitor.getFunctions();
-        const std::vector<std::pair<std::string, std::string>>& rResults = aVisitor.getResults();
+        const std::vector<RenameResult>& rResults = aVisitor.getResults();
         // Ignore missing prefixes in structs without member functions.
         bool bFound = false;
+        if (m_rContext.getYaml())
+            std::cerr << "---" << std::endl;
         for (const std::string& rFunction : rFunctions)
         {
-            for (const std::pair<std::string, std::string>& rResult : rResults)
+            for (const RenameResult& rResult : rResults)
             {
-                if (rResult.first == rFunction)
+                if (rResult.m_aScope == rFunction)
                 {
-                    std::cerr << rResult.first << "::" << rResult.second << std::endl;
+                    if (m_rContext.getYaml())
+                    {
+                        std::cerr << "- OldName:        " << rResult.m_aScope << "::" << rResult.m_aOldName << std::endl;
+                        std::cerr << "  NewName:        " << rResult.m_aNewName << std::endl;
+                    }
+                    else
+                        std::cerr << rResult.m_aScope << "::" << rResult.m_aOldName << "," << rResult.m_aNewName << std::endl;
                     bFound = true;
                 }
             }
         }
+        if (m_rContext.getYaml())
+            std::cerr << "..." << std::endl;
         if (bFound)
             exit(1);
     }
@@ -295,6 +323,9 @@ int main(int argc, const char** argv)
     llvm::cl::opt<bool> bPoco("poco",
                               llvm::cl::desc("Expect Poco-style '_' instead of LibreOffice-style 'm_' as prefix."),
                               llvm::cl::cat(aCategory));
+    llvm::cl::opt<bool> bYaml("yaml",
+                              llvm::cl::desc("Output YAML instead of CSV, for clang-rename."),
+                              llvm::cl::cat(aCategory));
     llvm::cl::opt<std::string> aPathPrefix("path-prefix",
                                             llvm::cl::desc("If not empty, ignore all source code paths not matching this prefix."),
                                             llvm::cl::cat(aCategory));
@@ -302,7 +333,7 @@ int main(int argc, const char** argv)
 
     clang::tooling::ClangTool aTool(aParser.getCompilations(), aParser.getSourcePathList());
 
-    Context aContext(aClassName, aClassPrefix, aClassExcludedPrefix, bPoco, aPathPrefix);
+    Context aContext(aClassName, aClassPrefix, aClassExcludedPrefix, bPoco, bYaml, aPathPrefix);
     FrontendAction aAction(aContext);
     std::unique_ptr<clang::tooling::FrontendActionFactory> pFactory = clang::tooling::newFrontendActionFactory(&aAction);
     return aTool.run(pFactory.get());
diff --git a/clang/rename.cxx b/clang/rename.cxx
index e661fb7..a4b3231 100644
--- a/clang/rename.cxx
+++ b/clang/rename.cxx
@@ -420,9 +420,10 @@ static bool parseCsv(const std::string& rCsv, std::map<std::string, std::string>
 int main(int argc, const char** argv)
 {
     llvm::cl::OptionCategory aCategory("rename options");
+    llvm::cl::OptionCategory aCategory2("rename options");
     llvm::cl::opt<std::string> aOldName("old-name",
                                         llvm::cl::desc("Old, qualified name (Class::member)."),
-                                        llvm::cl::cat(aCategory));
+                                        llvm::cl::cat(aCategory), llvm::cl::cat(aCategory2));
     llvm::cl::opt<std::string> aNewName("new-name",
                                         llvm::cl::desc("New, non-qualified name (without Class::)."),
                                         llvm::cl::cat(aCategory));


More information about the Libreoffice-commits mailing list