Skip to content

Commit

Permalink
[clang-rename] fix bug with initializer lists
Browse files Browse the repository at this point in the history
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
  • Loading branch information
kirillbobyrev committed Aug 9, 2016
1 parent a10549d commit 31fd7fb
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 19 deletions.
19 changes: 19 additions & 0 deletions clang-tools-extra/clang-rename/USRFinder.cpp
Expand Up @@ -90,6 +90,25 @@ class NamedDeclFindingASTVisitor
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; }
Expand Down
13 changes: 2 additions & 11 deletions clang-tools-extra/clang-rename/USRLocFinder.cpp
Expand Up @@ -48,18 +48,9 @@ class USRLocFindingASTVisitor
// 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());
}
}
}
Expand Down
17 changes: 9 additions & 8 deletions clang-tools-extra/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' <file> to get the correct offset of foo when changing
// this file.
// To find offsets after modifying the file, use:
// grep -Ubo 'Foo.*' <file>

0 comments on commit 31fd7fb

Please sign in to comment.