[clang-rename] fix bug with initializer lists
Clang-rename is currently not able to find a symbol in initializer list. This patch fixes described issue. Reviewers: alexfh Differential Revision: https://reviews.llvm.org/D23193 llvm-svn: 278099
This commit is contained in:
@@ -90,6 +90,25 @@ public:
|
||||
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; }
|
||||
|
||||
@@ -48,18 +48,9 @@ public:
|
||||
// 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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
// Use grep -FUbo 'Foo' <file> to get the correct offset of foo when changing
|
||||
// this file.
|
||||
// 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
|
||||
|
||||
// To find offsets after modifying the file, use:
|
||||
// grep -Ubo 'Foo.*' <file>
|
||||
|
||||
Reference in New Issue
Block a user