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 <[email protected]> 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)); _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
