From ec959077f40ebc7ed1295131abda8857a59c1503 Mon Sep 17 00:00:00 2001 From: Sebastien Binet Date: Wed, 20 Mar 2013 19:12:22 +0100 Subject: [PATCH 1/2] add namespace renaming test --- tests/NamespaceRename/foo.orig.cpp | 53 ++++++++++++++++++++++++++++++ tests/NamespaceRename/foo.orig.h | 38 +++++++++++++++++++++ tests/NamespaceRename/test.sh | 28 ++++++++++++++++ tests/NamespaceRename/test.yml | 8 +++++ 4 files changed, 127 insertions(+) create mode 100644 tests/NamespaceRename/foo.orig.cpp create mode 100644 tests/NamespaceRename/foo.orig.h create mode 100755 tests/NamespaceRename/test.sh create mode 100644 tests/NamespaceRename/test.yml diff --git a/tests/NamespaceRename/foo.orig.cpp b/tests/NamespaceRename/foo.orig.cpp new file mode 100644 index 0000000..08dcc5d --- /dev/null +++ b/tests/NamespaceRename/foo.orig.cpp @@ -0,0 +1,53 @@ +#include "foo.h" + +namespace SampleNameSpace { + int Foo::counter = 0; +}; + +void SampleNameSpace::Foo::doNothing() { +} + +using namespace SampleNameSpace; + +void Foo::wasteCycle() { + Foo a(this); + for (int b = 0; b < 10; b++) { + Foo c(this); + Foo d(this); + c.setX(b); + d = c; + } +} + +Foo test() { + Foo a = Foo::Foo(); + return Foo(); +} + +Foo test(Foo *a) { + return Foo(a); +} + +::SampleNameSpace::Foo globalFoo; + +#define TT Foo + +int main() { + class Bar { + public: + Foo a; + void test() { + a.setX(10); + } + }; + + Foo a = test(); + TT c = a; + + Bar b; + + b.test(); + + typedef Bar toto_t; + return a.getX(); +} diff --git a/tests/NamespaceRename/foo.orig.h b/tests/NamespaceRename/foo.orig.h new file mode 100644 index 0000000..a240289 --- /dev/null +++ b/tests/NamespaceRename/foo.orig.h @@ -0,0 +1,38 @@ + +namespace SampleNameSpace { + class Foo; + + struct FooNode { + Foo *next; + }; + + class Foo { + private: + static int counter; + int x; + Foo *next; + bool ownsNext; + public: + Foo() : x(0), next(0), ownsNext(false) {} + Foo(Foo *n) : x(0), next(n), ownsNext(false) {} + Foo(int px) : x(px), next(new Foo()), ownsNext(true) {} + + ~Foo() { + if (ownsNext) { + delete next; + } + } + + int getX() const; + void setX(int newX) { + x = newX; + } + + void wasteCycle(); + void doNothing(); + }; + + inline int Foo::getX() const { + return x; + } +}; diff --git a/tests/NamespaceRename/test.sh b/tests/NamespaceRename/test.sh new file mode 100755 index 0000000..a9e7e73 --- /dev/null +++ b/tests/NamespaceRename/test.sh @@ -0,0 +1,28 @@ +#!/bin/sh + +set -e + +/bin/cp foo.orig.h foo.h +/bin/cp foo.orig.cpp foo.cpp +cmake -DCMAKE_EXPORT_COMPILE_COMMANDS:STRING=ON . + +clang-refactor < test.yml + +set +e +diff -urN foo.orig.h foo.h +sc=$? +if [[ "$sc" == "0" ]]; then + set -e + echo ":: ERR (no changes)" + exit 1 +fi +diff -urN foo.orig.cpp foo.cpp +sc=$? +if [[ "$sc" == "0" ]]; then + set -e + echo ":: ERR (no changes)" + exit 1 +fi + +echo ":: OK" +## EOF ## diff --git a/tests/NamespaceRename/test.yml b/tests/NamespaceRename/test.yml new file mode 100644 index 0000000..4f64922 --- /dev/null +++ b/tests/NamespaceRename/test.yml @@ -0,0 +1,8 @@ +--- +Transforms: + TypeRename: + Types: + - SampleNameSpace: Ns + - class SampleNameSpace::Foo: Foobar + - toto_t: bar_t + From ccd0c0f047f9c7c04c1be96eaf2ee774e439e00a Mon Sep 17 00:00:00 2001 From: Sebastien Binet Date: Fri, 22 Mar 2013 16:21:59 +0100 Subject: [PATCH 2/2] all: properly implement namespace renaming --- Transforms/RenameTransforms.h | 2 +- Transforms/TypeRenameTransform.cpp | 50 +++++++++++++++++++++++++++--- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/Transforms/RenameTransforms.h b/Transforms/RenameTransforms.h index 17cd1a9..adffecd 100644 --- a/Transforms/RenameTransforms.h +++ b/Transforms/RenameTransforms.h @@ -124,7 +124,7 @@ class RenameTransform : public Transform { if (QN.size() == 0) { return false; } - + // special handling for TagDecl if (auto T = llvm::dyn_cast(D)) { auto KN = T->getKindName(); diff --git a/Transforms/TypeRenameTransform.cpp b/Transforms/TypeRenameTransform.cpp index 91e21e7..c10b3f9 100644 --- a/Transforms/TypeRenameTransform.cpp +++ b/Transforms/TypeRenameTransform.cpp @@ -119,6 +119,12 @@ void TypeRenameTransform::collectRenameDecls(DeclContext *DC, bool topLevel) collectRenameDecls(RD); } } + else if (auto D = dyn_cast(*I)) { + std::string newName; + if (nameMatches(D, newName)) { + renameLocation(L, newName); + } + } // descend into the next level (namespace, etc.) if (auto innerDC = dyn_cast(*I)) { @@ -211,6 +217,11 @@ void TypeRenameTransform::processDeclContext(DeclContext *DC, bool topLevel) processTypeLoc(TSI->getTypeLoc()); } } + // else if (auto D = dyn_cast(*I)) { + // if (auto TSI = D->getTypeSourceInfo()) { + // processTypeLoc(TSI->getTypeLoc()); + // } + // } else if (auto D = dyn_cast(*I)) { // if no type source info, it's a void f(void) function auto TSI = D->getResultTypeSourceInfo(); @@ -282,6 +293,12 @@ void TypeRenameTransform::processDeclContext(DeclContext *DC, bool topLevel) renameLocation(D->getLocation(), newName); } } + else if (auto D = dyn_cast(*I)) { + std::string newName; + if (nameMatches(D->getNominatedNamespace(), newName, true)) { + renameLocation(D->getLocation(), newName); + } + } // descend into the next level (namespace, etc.) if (auto innerDC = dyn_cast(*I)) { @@ -413,7 +430,7 @@ void TypeRenameTransform::processFunctionDecl(FunctionDecl *D) if (BL.isValid() && P->getLocation() != BL && nameMatches(P, newName, true)) { - // can't use renameLocation since this is a tricy case + // can't use renameLocation since this is a tricky case // need to use raw_identifier because Lexer::findLocationAfterToken // performs a raw lexing @@ -639,7 +656,7 @@ void TypeRenameTransform::processTypeLoc(TypeLoc TL, bool forceRewriteMacro) } - default: + default: break; } @@ -654,12 +671,35 @@ void TypeRenameTransform::processQualifierLoc(NestedNameSpecifierLoc NNSL, while (NNSL) { auto NNS = NNSL.getNestedNameSpecifier(); auto NNSK = NNS->getKind(); - if (NNSK == NestedNameSpecifier::TypeSpec || NNSK == NestedNameSpecifier::TypeSpecWithTemplate) { + if (NNSK == NestedNameSpecifier::TypeSpec || + NNSK == NestedNameSpecifier::TypeSpecWithTemplate) { + processTypeLoc(NNSL.getTypeLoc(), forceRewriteMacro); + } + else if (NNSK == NestedNameSpecifier::Namespace) { + std::string newName; + if (nameMatches(NNS->getAsNamespace(), newName, true)) { + renameLocation(NNSL.getLocalBeginLoc(), newName); + } processTypeLoc(NNSL.getTypeLoc(), forceRewriteMacro); } - + else if (NNSK == NestedNameSpecifier::NamespaceAlias) { + std::string newName; + if (nameMatches(NNS->getAsNamespaceAlias(), newName, true)) { + renameLocation(NNSL.getLocalBeginLoc(), newName); + } + processTypeLoc(NNSL.getTypeLoc(), forceRewriteMacro); + } + // else { + // auto srcrange = NNSL.getSourceRange(); + // llvm::errs() << indent() + // << "==> ??? (" << ii << ") " + // << " range=[" << range(srcrange) + // << "\n"; + // break; + // } + NNSL = NNSL.getPrefix(); - } + } } void TypeRenameTransform::processParmVarDecl(ParmVarDecl *P)