Index: clang-tools-extra/trunk/clang-rename/USRFinder.cpp =================================================================== --- clang-tools-extra/trunk/clang-rename/USRFinder.cpp +++ clang-tools-extra/trunk/clang-rename/USRFinder.cpp @@ -90,6 +90,25 @@ TypeEndLoc); } + bool VisitCXXConstructorDecl(clang::CXXConstructorDecl *ConstructorDecl) { + for (auto &Initializer : ConstructorDecl->inits()) { + if (Initializer->getSourceOrder() == -1) { + // Ignore implicit initializers. + continue; + } + if (const clang::FieldDecl *FieldDecl = Initializer->getMember()) { + const SourceLocation InitBeginLoc = Initializer->getSourceLocation(), + InitEndLoc = Lexer::getLocForEndOfToken( + InitBeginLoc, 0, Context.getSourceManager(), + Context.getLangOpts()); + if (!setResult(FieldDecl, InitBeginLoc, InitEndLoc)) { + return false; + } + } + } + return true; + } + // Other: const NamedDecl *getNamedDecl() { return Result; } Index: clang-tools-extra/trunk/clang-rename/USRLocFinder.cpp =================================================================== --- clang-tools-extra/trunk/clang-rename/USRLocFinder.cpp +++ clang-tools-extra/trunk/clang-rename/USRLocFinder.cpp @@ -48,18 +48,9 @@ // Ignore implicit initializers. continue; } - if (const clang::FieldDecl *FieldDecl = Initializer->getAnyMember()) { + if (const clang::FieldDecl *FieldDecl = Initializer->getMember()) { if (USRSet.find(getUSRForDecl(FieldDecl)) != USRSet.end()) { - // The initializer refers to a field that is to be renamed. - SourceLocation Location = Initializer->getSourceLocation(); - StringRef TokenName = Lexer::getSourceText( - CharSourceRange::getTokenRange(Location), - Context.getSourceManager(), Context.getLangOpts()); - if (TokenName == PrevName) { - // The token of the source location we find actually has the old - // name. - LocationsFound.push_back(Initializer->getSourceLocation()); - } + LocationsFound.push_back(Initializer->getSourceLocation()); } } } Index: clang-tools-extra/trunk/test/clang-rename/Field.cpp =================================================================== --- clang-tools-extra/trunk/test/clang-rename/Field.cpp +++ clang-tools-extra/trunk/test/clang-rename/Field.cpp @@ -1,14 +1,15 @@ -// RUN: cat %s > %t.cpp -// RUN: clang-rename -offset=148 -new-name=Bar %t.cpp -i -- -// RUN: sed 's,//.*,,' %t.cpp | FileCheck %s - class Baz { - int Foo; // CHECK: Bar; + int Foo; /* Test 1 */ // CHECK: int Bar; public: Baz(); }; -Baz::Baz() : Foo(0) {} // CHECK: Baz::Baz() : Bar(0) {} +Baz::Baz() : Foo(0) /* Test 2 */ {} // CHECK: Baz::Baz() : Bar(0) + +// Test 1. +// RUN: clang-rename -offset=18 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s +// Test 2. +// RUN: clang-rename -offset=89 -new-name=Bar %s -- | sed 's,//.*,,' | FileCheck %s -// Use grep -FUbo 'Foo' to get the correct offset of foo when changing -// this file. +// To find offsets after modifying the file, use: +// grep -Ubo 'Foo.*'