Skip to content

Commit ff93acd

Browse files
DanTupCommit Queue
authored andcommitted
[analysis_server] Fix "Move to File" for top-level variables with references to their getters
There were two issues here: 1. Analyzer's `prefixesUsedInLibrary` search did not handle when an element was not found in the library (for example when looking for a top level variable that doesn't match because it's referenced through a getter) 2. The refactor not looking for prefixes for getters/setters when updating other files Fixes #59968 Change-Id: Ic560e06c45091937611b247e7fee26b9854873fd Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/406844 Reviewed-by: Konstantin Shcheglov <[email protected]> Commit-Queue: Brian Wilkerson <[email protected]> Reviewed-by: Brian Wilkerson <[email protected]>
1 parent 63bb3aa commit ff93acd

File tree

3 files changed

+67
-6
lines changed

3 files changed

+67
-6
lines changed

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

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,11 +168,23 @@ class MoveTopLevelToFile extends RefactoringProducer {
168168
var library = entry.key;
169169
var prefixes = <String>{};
170170
for (var element in entry.value) {
171-
var prefixList = await searchEngine.searchPrefixesUsedInLibrary(
172-
library,
173-
element,
171+
// Search for prefixes for the element.
172+
prefixes.addAll(
173+
await searchEngine.searchPrefixesUsedInLibrary(library, element),
174174
);
175-
prefixes.addAll(prefixList);
175+
// And also for the getter if this might be something like a top-level
176+
// variable.
177+
if (element case PropertyInducingElement2(:var getter2?)) {
178+
prefixes.addAll(
179+
await searchEngine.searchPrefixesUsedInLibrary(library, getter2),
180+
);
181+
}
182+
// And setters.
183+
if (element case PropertyInducingElement2(:var setter2?)) {
184+
prefixes.addAll(
185+
await searchEngine.searchPrefixesUsedInLibrary(library, setter2),
186+
);
187+
}
176188
}
177189
await builder.addDartFileEdit(library.firstFragment.source.fullName, (
178190
builder,

pkg/analysis_server/test/src/services/refactoring/move_top_level_to_file_test.dart

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1820,6 +1820,53 @@ part of 'containing_library.dart';
18201820
);
18211821
}
18221822

1823+
/// https://github.com/dart-lang/sdk/issues/59968#issuecomment-2622191812
1824+
Future<void> test_single_topLevelVariable_withReferenceToGetter() async {
1825+
var originalSource = '''
1826+
class A {}
1827+
1828+
1829+
int variableT^oMove = 3;
1830+
1831+
class B {}
1832+
''';
1833+
var otherFilePath = '$projectFolderPath/lib/other.dart';
1834+
var otherFileContent = '''
1835+
import "main.dart";
1836+
1837+
void f() {
1838+
print(variableToMove);
1839+
}
1840+
''';
1841+
1842+
var declarationName = 'variableToMove';
1843+
1844+
var expected = '''
1845+
>>>>>>>>>> lib/main.dart
1846+
class A {}
1847+
1848+
class B {}
1849+
>>>>>>>>>> lib/other.dart
1850+
import "package:test/variable_to_move.dart";
1851+
1852+
import "main.dart";
1853+
1854+
void f() {
1855+
print(variableToMove);
1856+
}
1857+
>>>>>>>>>> lib/variable_to_move.dart created
1858+
int variableToMove = 3;
1859+
''';
1860+
1861+
await _singleDeclaration(
1862+
originalSource: originalSource,
1863+
expected: expected,
1864+
declarationName: declarationName,
1865+
otherFilePath: otherFilePath,
1866+
otherFileContent: otherFileContent,
1867+
);
1868+
}
1869+
18231870
Future<void> test_single_typedef() async {
18241871
var originalSource = '''
18251872
class A {}

pkg/analyzer/lib/src/dart/analysis/search.dart

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -357,8 +357,10 @@ class Search {
357357
if (index != null) {
358358
_IndexRequest request = _IndexRequest(index);
359359
int elementId = request.findElementId(element.asElement!);
360-
var prefixList = index.elementImportPrefixes[elementId].split(',');
361-
prefixes.addAll(prefixList);
360+
if (elementId != -1) {
361+
var prefixList = index.elementImportPrefixes[elementId].split(',');
362+
prefixes.addAll(prefixList);
363+
}
362364
}
363365
}
364366
return prefixes;

0 commit comments

Comments
 (0)