Skip to content

Commit 352cff2

Browse files
scheglovcommit-bot@chromium.org
authored andcommitted
Issue 35301. Update only files in context roots during rename.
[email protected] Bug: #35301 Change-Id: I5a90fd8b19b6c64cd3f01acfd18753f41a713d68 Reviewed-on: https://dart-review.googlesource.com/c/86040 Reviewed-by: Brian Wilkerson <[email protected]> Commit-Queue: Konstantin Shcheglov <[email protected]>
1 parent 0a4873b commit 352cff2

File tree

9 files changed

+148
-12
lines changed

9 files changed

+148
-12
lines changed

pkg/analysis_server/lib/src/services/refactoring/refactoring.dart

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,13 @@ class RefactoringWorkspace {
408408

409409
RefactoringWorkspace(this.drivers, this.searchEngine);
410410

411+
/**
412+
* Whether the [element] is defined in a file that is in a context root.
413+
*/
414+
bool containsElement(Element element) {
415+
return containsFile(element.source.fullName);
416+
}
417+
411418
/**
412419
* Whether the file with the given [path] is in a context root.
413420
*/

pkg/analysis_server/lib/src/services/refactoring/rename.dart

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,17 @@ import 'package:analyzer_plugin/utilities/range_factory.dart';
1818
* Helper for renaming one or more [Element]s.
1919
*/
2020
class RenameProcessor {
21-
final SearchEngine searchEngine;
21+
final RefactoringWorkspace workspace;
2222
final SourceChange change;
2323
final String newName;
2424

25-
RenameProcessor(this.searchEngine, this.change, this.newName);
25+
RenameProcessor(this.workspace, this.change, this.newName);
2626

2727
/**
2828
* Add the edit that updates the [element] declaration.
2929
*/
3030
void addDeclarationEdit(Element element) {
31-
if (element != null) {
31+
if (element != null && workspace.containsElement(element)) {
3232
SourceEdit edit =
3333
newSourceEdit_range(range.elementName(element), newName);
3434
doSourceChange_addElementEdit(change, element, edit);
@@ -41,6 +41,9 @@ class RenameProcessor {
4141
void addReferenceEdits(List<SearchMatch> matches) {
4242
List<SourceReference> references = getSourceReferences(matches);
4343
for (SourceReference reference in references) {
44+
if (!workspace.containsElement(reference.element)) {
45+
continue;
46+
}
4447
reference.addEdit(change, newName);
4548
}
4649
}
@@ -50,7 +53,9 @@ class RenameProcessor {
5053
*/
5154
Future<void> renameElement(Element element) {
5255
addDeclarationEdit(element);
53-
return searchEngine.searchReferences(element).then(addReferenceEdits);
56+
return workspace.searchEngine
57+
.searchReferences(element)
58+
.then(addReferenceEdits);
5459
}
5560
}
5661

@@ -86,7 +91,7 @@ abstract class RenameRefactoringImpl extends RefactoringImpl
8691
getElementQualifiedName(element));
8792
result.addFatalError(message);
8893
}
89-
if (!workspace.containsFile(element.source.fullName)) {
94+
if (!workspace.containsElement(element)) {
9095
String message = format(
9196
"The {0} '{1}' is defined outside of the project, so cannot be renamed.",
9297
getElementKindName(element),

pkg/analysis_server/lib/src/services/refactoring/rename_class_member.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ class RenameClassMemberRefactoringImpl extends RenameRefactoringImpl {
9292

9393
@override
9494
Future<void> fillChange() async {
95-
var processor = new RenameProcessor(searchEngine, change, newName);
95+
var processor = new RenameProcessor(workspace, change, newName);
9696
// update declarations
9797
for (Element renameElement in _validator.elements) {
9898
if (renameElement.isSynthetic && renameElement is FieldElement) {
@@ -110,7 +110,7 @@ class RenameClassMemberRefactoringImpl extends RenameRefactoringImpl {
110110
List<SourceReference> nameRefs = getSourceReferences(nameMatches);
111111
for (SourceReference reference in nameRefs) {
112112
// ignore references from SDK and pub cache
113-
if (!workspace.containsFile(reference.element.source.fullName)) {
113+
if (!workspace.containsElement(reference.element)) {
114114
continue;
115115
}
116116
// check the element being renamed is accessible

pkg/analysis_server/lib/src/services/refactoring/rename_label.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ class RenameLabelRefactoringImpl extends RenameRefactoringImpl {
3939

4040
@override
4141
Future<void> fillChange() {
42-
var processor = new RenameProcessor(searchEngine, change, newName);
42+
var processor = new RenameProcessor(workspace, change, newName);
4343
return processor.renameElement(element);
4444
}
4545
}

pkg/analysis_server/lib/src/services/refactoring/rename_library.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ class RenameLibraryRefactoringImpl extends RenameRefactoringImpl {
4141

4242
@override
4343
Future<void> fillChange() async {
44-
var processor = new RenameProcessor(searchEngine, change, newName);
44+
var processor = new RenameProcessor(workspace, change, newName);
4545
await processor.renameElement(element);
4646
}
4747
}

pkg/analysis_server/lib/src/services/refactoring/rename_local.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ class RenameLocalRefactoringImpl extends RenameRefactoringImpl {
7474

7575
@override
7676
Future<void> fillChange() async {
77-
var processor = new RenameProcessor(searchEngine, change, newName);
77+
var processor = new RenameProcessor(workspace, change, newName);
7878
for (Element element in elements) {
7979
processor.addDeclarationEdit(element);
8080
var references = await searchEngine.searchReferences(element);

pkg/analysis_server/lib/src/services/refactoring/rename_unit_member.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ class RenameUnitMemberRefactoringImpl extends RenameRefactoringImpl {
127127
}
128128

129129
// Rename each element and references to it.
130-
var processor = new RenameProcessor(searchEngine, change, newName);
130+
var processor = new RenameProcessor(workspace, change, newName);
131131
for (var element in elements) {
132132
await processor.renameElement(element);
133133
}
@@ -136,7 +136,7 @@ class RenameUnitMemberRefactoringImpl extends RenameRefactoringImpl {
136136
if (_flutterWidgetState != null) {
137137
_updateFlutterWidgetStateName();
138138
await new RenameProcessor(
139-
searchEngine,
139+
workspace,
140140
change,
141141
_flutterWidgetStateNewName,
142142
).renameElement(_flutterWidgetState);

pkg/analysis_server/test/services/refactoring/rename_class_member_test.dart

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,94 @@ main(var a) {
786786
assertNoFileChange('/lib.dart');
787787
}
788788

789+
test_createChange_outsideOfProject_declarationInPackage() async {
790+
addPackageFile('aaa', 'aaa.dart', r'''
791+
class A {
792+
void test() {}
793+
}
794+
795+
void foo(A a) {
796+
a.test();
797+
}
798+
''');
799+
await indexTestUnit('''
800+
import 'package:aaa/aaa.dart';
801+
802+
class B extends A {
803+
void test() {}
804+
}
805+
806+
main(A a, B b) {
807+
a.test();
808+
b.test();
809+
}
810+
''');
811+
createRenameRefactoringAtString('test() {}');
812+
refactoring.newName = 'newName';
813+
814+
await assertSuccessfulRefactoring('''
815+
import 'package:aaa/aaa.dart';
816+
817+
class B extends A {
818+
void newName() {}
819+
}
820+
821+
main(A a, B b) {
822+
a.newName();
823+
b.newName();
824+
}
825+
''');
826+
827+
expect(refactoringChange.edits, hasLength(1));
828+
expect(refactoringChange.edits[0].file, testFile);
829+
}
830+
831+
test_createChange_outsideOfProject_referenceInPart() async {
832+
newFile('/home/part.dart', content: r'''
833+
part of test;
834+
835+
void foo(A a) {
836+
a.test();
837+
}
838+
''');
839+
840+
// To use file:// URI.
841+
testFile = convertPath('/home/test/bin/test.dart');
842+
843+
await indexTestUnit('''
844+
library test;
845+
846+
part '../../part.dart';
847+
848+
class A {
849+
void test() {}
850+
}
851+
852+
main(A a) {
853+
a.test();
854+
}
855+
''');
856+
createRenameRefactoringAtString('test() {}');
857+
refactoring.newName = 'newName';
858+
859+
await assertSuccessfulRefactoring('''
860+
library test;
861+
862+
part '../../part.dart';
863+
864+
class A {
865+
void newName() {}
866+
}
867+
868+
main(A a) {
869+
a.newName();
870+
}
871+
''');
872+
873+
expect(refactoringChange.edits, hasLength(1));
874+
expect(refactoringChange.edits[0].file, testFile);
875+
}
876+
789877
test_createChange_PropertyAccessorElement_getter() async {
790878
await indexTestUnit('''
791879
class A {

pkg/analysis_server/test/services/refactoring/rename_unit_member_test.dart

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -644,6 +644,42 @@ void main() {
644644
''');
645645
}
646646

647+
test_createChange_outsideOfProject_referenceInPart() async {
648+
newFile('/home/part.dart', content: r'''
649+
part of test;
650+
651+
Test test2;
652+
''');
653+
654+
// To use file:// URI.
655+
testFile = convertPath('/home/test/bin/test.dart');
656+
657+
await indexTestUnit('''
658+
library test;
659+
660+
part '../../part.dart';
661+
662+
class Test {}
663+
664+
Test test;
665+
''');
666+
createRenameRefactoringAtString('Test {}');
667+
refactoring.newName = 'NewName';
668+
669+
await assertSuccessfulRefactoring('''
670+
library test;
671+
672+
part '../../part.dart';
673+
674+
class NewName {}
675+
676+
NewName test;
677+
''');
678+
679+
expect(refactoringChange.edits, hasLength(1));
680+
expect(refactoringChange.edits[0].file, testFile);
681+
}
682+
647683
test_createChange_PropertyAccessorElement_getter_declaration() async {
648684
await _test_createChange_PropertyAccessorElement("test {}");
649685
}

0 commit comments

Comments
 (0)