Issue 50604. Fix renaming extension at its declaration.

Bug: https://github.com/dart-lang/sdk/issues/50604
Change-Id: I1c685ea7545ef120e5fc23fe6a507ded8c4f4cb9
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/274083
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Konstantin Shcheglov <scheglov@google.com>
This commit is contained in:
Konstantin Shcheglov 2022-12-07 22:38:19 +00:00 committed by Commit Queue
parent 356d15a3fc
commit aea639bd03
4 changed files with 115 additions and 0 deletions

View file

@ -464,6 +464,8 @@ abstract class RenameRefactoring implements Refactoring {
nameNode = node;
} else if (node is EnumConstantDeclaration) {
nameNode = node.name;
} else if (node is ExtensionDeclaration) {
nameNode = node.name;
} else if (node is FieldFormalParameter) {
nameNode = node.name;
} else if (node is ImportDirective) {

View file

@ -51,6 +51,9 @@ class RenameUnitMemberRefactoringImpl extends RenameRefactoringImpl {
@override
String get refactoringName {
if (element is ExtensionElement) {
return 'Rename Extension';
}
if (element is FunctionElement) {
return 'Rename Top-Level Function';
}

View file

@ -1971,6 +1971,64 @@ enum E {
);
}
Future<void> test_extension_atDeclaration() {
addTestFile('''
extension Test on int {
void foo() {}
}
void f() {
Test(0).foo();
}
''');
return assertSuccessfulRefactoring(
() {
return sendRenameRequest('Test on int', 'NewName');
},
'''
extension NewName on int {
void foo() {}
}
void f() {
NewName(0).foo();
}
''',
feedbackValidator: (feedback) {
var renameFeedback = feedback as RenameFeedback;
expect(renameFeedback.offset, 10);
expect(renameFeedback.length, 4);
},
);
}
Future<void> test_extension_atReference() {
addTestFile('''
extension Test on int {
void foo() {}
}
void f() {
Test(0).foo();
}
''');
return assertSuccessfulRefactoring(
() {
return sendRenameRequest('Test(0)', 'NewName');
},
'''
extension NewName on int {
void foo() {}
}
void f() {
NewName(0).foo();
}
''',
feedbackValidator: (feedback) {
var renameFeedback = feedback as RenameFeedback;
expect(renameFeedback.offset, 55);
expect(renameFeedback.length, 4);
},
);
}
Future<void> test_feedback() {
addTestFile('''
class Test {}

View file

@ -619,6 +619,58 @@ void f(NewName t) {}
''');
}
Future<void> test_createChange_ExtensionElement_atDeclaration() async {
await indexTestUnit('''
extension Test on int {
void foo() {}
}
void f() {
Test(0).foo();
}
''');
// configure refactoring
createRenameRefactoringAtString('Test on int');
expect(refactoring.refactoringName, 'Rename Extension');
expect(refactoring.elementKindName, 'extension');
expect(refactoring.oldName, 'Test');
refactoring.newName = 'NewName';
// validate change
return assertSuccessfulRefactoring('''
extension NewName on int {
void foo() {}
}
void f() {
NewName(0).foo();
}
''');
}
Future<void> test_createChange_ExtensionElement_atReference() async {
await indexTestUnit('''
extension Test on int {
void foo() {}
}
void f() {
Test(0).foo();
}
''');
// configure refactoring
createRenameRefactoringAtString('Test(0)');
expect(refactoring.refactoringName, 'Rename Extension');
expect(refactoring.elementKindName, 'extension');
expect(refactoring.oldName, 'Test');
refactoring.newName = 'NewName';
// validate change
return assertSuccessfulRefactoring('''
extension NewName on int {
void foo() {}
}
void f() {
NewName(0).foo();
}
''');
}
Future<void> test_createChange_FunctionElement() async {
await indexTestUnit('''
test() {}