[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