[Libreoffice-commits] dev-tools.git: clang/qa clang/rename.cxx
Miklos Vajna
vmiklos at collabora.co.uk
Fri Jun 3 07:04:47 UTC 2016
clang/qa/data/rename-cxx-destructor-decl.cxx | 16 ++++++++
clang/qa/data/rename-cxx-destructor-decl.cxx.expected | 16 ++++++++
clang/qa/test-rename.sh | 4 ++
clang/rename.cxx | 34 ++++++++++++++++--
4 files changed, 67 insertions(+), 3 deletions(-)
New commits:
commit 26667ea7490f9e21a859d33ca4efc87d328f8a1b
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date: Fri Jun 3 09:03:45 2016 +0200
clang: handle dtors in rename
Use case: try to rename e.g. SvxFmTbxCtlRecText in core.git.
diff --git a/clang/qa/data/rename-cxx-destructor-decl.cxx b/clang/qa/data/rename-cxx-destructor-decl.cxx
new file mode 100644
index 0000000..6f4a772
--- /dev/null
+++ b/clang/qa/data/rename-cxx-destructor-decl.cxx
@@ -0,0 +1,16 @@
+class C
+{
+public:
+ C();
+ ~C();
+};
+
+C::C()
+{
+}
+
+C::~C()
+{
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/clang/qa/data/rename-cxx-destructor-decl.cxx.expected b/clang/qa/data/rename-cxx-destructor-decl.cxx.expected
new file mode 100644
index 0000000..ff5be6c
--- /dev/null
+++ b/clang/qa/data/rename-cxx-destructor-decl.cxx.expected
@@ -0,0 +1,16 @@
+class D
+{
+public:
+ D();
+ ~D();
+};
+
+D::D()
+{
+}
+
+D::~D()
+{
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/clang/qa/test-rename.sh b/clang/qa/test-rename.sh
index 4cae9ef..6755779 100755
--- a/clang/qa/test-rename.sh
+++ b/clang/qa/test-rename.sh
@@ -95,6 +95,10 @@ declare_rename_test "testCXXStaticCastExpr" "rename-cxx-static-cast-expr.cxx"
bin/rename -old-name=C -new-name=D $test_input --
test_assert_equal $test_expected $test_output
+declare_rename_test "testCXXDestructorDecl" "rename-cxx-destructor-decl.cxx"
+bin/rename -old-name=C -new-name=D $test_input --
+test_assert_equal $test_expected $test_output
+
echo "OK ($ok)"
# vi:set shiftwidth=4 expandtab:
diff --git a/clang/rename.cxx b/clang/rename.cxx
index 05e4abc..892e33a 100644
--- a/clang/rename.cxx
+++ b/clang/rename.cxx
@@ -42,9 +42,13 @@ class RenameVisitor : public clang::RecursiveASTVisitor<RenameVisitor>
// Otherwise an A -> BA replacement would be done twice.
std::set<clang::SourceLocation> maHandledLocations;
- void RewriteText(clang::SourceLocation aStart, unsigned nLength, const std::string& rOldName)
+ void RewriteText(clang::SourceLocation aStart, unsigned nLength, const std::string& rOldName, const std::string& rPrefix = std::string())
{
- const std::map<std::string, std::string>::const_iterator it = mrRewriter.getNameMap().find(rOldName);
+ std::string aOldName = rOldName;
+ if (!rPrefix.empty())
+ // E.g. rOldName is '~C' and rPrefix is '~', then check if 'C' is to be renamed.
+ aOldName = aOldName.substr(rPrefix.size());
+ const std::map<std::string, std::string>::const_iterator it = mrRewriter.getNameMap().find(aOldName);
if (it != mrRewriter.getNameMap().end())
{
if (aStart.isMacroID())
@@ -56,7 +60,11 @@ class RenameVisitor : public clang::RecursiveASTVisitor<RenameVisitor>
aStart = mrRewriter.getSourceMgr().getSpellingLoc(aStart);
if (maHandledLocations.find(aStart) == maHandledLocations.end())
{
- mrRewriter.ReplaceText(aStart, nLength, it->second);
+ std::string aNewName = it->second;
+ if (!rPrefix.empty())
+ // E.g. aNewName is 'D' and rPrefix is '~', then rename to '~D'.
+ aNewName = rPrefix + aNewName;
+ mrRewriter.ReplaceText(aStart, nLength, aNewName);
maHandledLocations.insert(aStart);
}
}
@@ -150,6 +158,26 @@ public:
return true;
}
+ bool VisitCXXDestructorDecl(clang::CXXDestructorDecl* pDecl)
+ {
+ std::string aName = pDecl->getNameAsString();
+ std::string aPrefix("~");
+ if (pDecl->isThisDeclarationADefinition())
+ /*
+ * Foo::~Foo(...) {}
+ * ^~~ Handles this.
+ */
+ RewriteText(pDecl->getLocStart(), pDecl->getNameAsString().length() - aPrefix.size(), aName.substr(aPrefix.size()));
+
+ /*
+ * Foo::~Foo(...) {}
+ * ^~~ Handles this.
+ */
+ RewriteText(pDecl->getLocation(), pDecl->getNameAsString().length(), aName, aPrefix);
+
+ return true;
+ }
+
/*
* C aC;
* aC.nX = 1; <- Handles e.g. this...
More information about the Libreoffice-commits
mailing list