[change-namespace] handle constructor initializer: Derived : Base::Base() {} and...
authorEric Liu <ioeric@google.com>
Wed, 16 Nov 2016 16:54:53 +0000 (16:54 +0000)
committerEric Liu <ioeric@google.com>
Wed, 16 Nov 2016 16:54:53 +0000 (16:54 +0000)
commitff51f011d1edb2de79a2448f68e9de1788596184
treef81c6e2696885fbd785e66cde1abcd61a2a981a1
parent3a83e76811d7d8b8a4bfd45943dbd89cb08ee522
[change-namespace] handle constructor initializer: Derived : Base::Base() {} and added conflict detections

Summary:
namespace nx { namespace ny { class Base { public: Base(i) {}} } }
namespace na {
namespace nb {
class X : public nx::ny {
public:
  X() : Base::Base(1) {}
};
}
}

When changing from na::nb to x::y, "Base::Base" will be changed to "nx::ny::Base" and
 "Base::" in "Base::Base" will be replaced with "nx::ny::Base" too, which causes
conflict. This conflict should've been detected when adding replacements but was hidden by `addOrMergeReplacement`. We now also detect conflict when adding replacements where conflict must not happen.

The namespace lookup is tricky here, we simply replace "Base::Base()" with "nx::ny::Base()" as a workaround, which compiles but not perfect.

Reviewers: hokein

Subscribers: bkramer, cfe-commits

Differential Revision: https://reviews.llvm.org/D26637

llvm-svn: 287118
clang-tools-extra/change-namespace/ChangeNamespace.cpp
clang-tools-extra/change-namespace/ChangeNamespace.h
clang-tools-extra/test/change-namespace/lambda-function.cpp [new file with mode: 0644]
clang-tools-extra/unittests/change-namespace/ChangeNamespaceTests.cpp