Skip to content

Commit 9a48d1b

Browse files
pqCommit Bot
authored and
Commit Bot
committed
Reland "[data driven] support moving symbols across packages"
This reverts commit f111a2d. Reason for revert: this change was mistakenly associated w/ a windows bot breakage (flutter/flutter#105641) Original change's description: > Revert "[data driven] support moving symbols across packages" > > This reverts commit 3290d7a. > > Reason for revert: flutter engine breakage (flutter/flutter#105641) > > Original change's description: > > [data driven] support moving symbols across packages > > > > See: #48997 > > > > Change-Id: Iad16b9eae0523bc4bc14537af642b05efa75b6f7 > > Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/246663 > > Commit-Queue: Phil Quitslund <[email protected]> > > Reviewed-by: Brian Wilkerson <[email protected]> > > # Not skipping CQ checks because original CL landed > 1 day ago. > > Change-Id: I4a83d50497d6208b7f518ca1b381ece3aab192ad > Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/247606 > Reviewed-by: Siva Annamalai <[email protected]> > Reviewed-by: Keerti Parthasarathy <[email protected]> > Commit-Queue: Phil Quitslund <[email protected]> > Reviewed-by: Phil Quitslund <[email protected]> > Reviewed-by: Brian Wilkerson <[email protected]> # Not skipping CQ checks because original CL landed > 1 day ago. Change-Id: I769dec0d85fc0a41048b21deec0724d8509ef8e9 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/248061 Reviewed-by: Brian Wilkerson <[email protected]> Reviewed-by: Keerti Parthasarathy <[email protected]> Commit-Queue: Phil Quitslund <[email protected]>
1 parent 56b013f commit 9a48d1b

File tree

6 files changed

+211
-0
lines changed

6 files changed

+211
-0
lines changed

pkg/analysis_server/lib/src/services/correction/fix/data_driven/replaced_by.dart

+5
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ class ReplacedBy extends Change<_Data> {
2727
void apply(DartFileEditBuilder builder, DataDrivenFix fix, _Data data) {
2828
var referenceRange = data.referenceRange;
2929
builder.addSimpleReplacement(referenceRange, _referenceTo(newElement));
30+
var libraryUris = newElement.libraryUris;
31+
if (libraryUris.isEmpty) return;
32+
if (!libraryUris.any((uri) => builder.importsLibrary(uri))) {
33+
builder.importLibraryElement(libraryUris.first);
34+
}
3035
}
3136

3237
@override

pkg/analysis_server/test/src/services/correction/fix/data_driven/replaced_by_test.dart

+78
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import 'data_driven_test_support.dart';
1414
void main() {
1515
defineReflectiveSuite(() {
1616
defineReflectiveTests(ReplacedByTest);
17+
defineReflectiveTests(ReplacedByUriSemanticsTest);
1718
});
1819
}
1920

@@ -862,6 +863,83 @@ var x = $prefixReference${newElement.reference}$invocation;
862863
}
863864
}
864865

866+
@reflectiveTest
867+
class ReplacedByUriSemanticsTest extends DataDrivenFixProcessorTest {
868+
Future<void> test_new_element_uris_multiple() async {
869+
setPackageContent('');
870+
newFile('$workspaceRootPath/p/lib/expect.dart', '''
871+
void expect(actual, expected) {}
872+
''');
873+
newFile('$workspaceRootPath/p/lib/export.dart', '''
874+
export 'expect.dart';
875+
''');
876+
addPackageDataFile('''
877+
version: 1
878+
transforms:
879+
- title: 'Replace expect'
880+
date: 2022-05-12
881+
bulkApply: false
882+
element:
883+
uris: ['$importUri']
884+
function: 'expect'
885+
changes:
886+
- kind: 'replacedBy'
887+
newElement:
888+
uris: ['package:p/expect.dart', 'package:p/export.dart']
889+
function: 'expect'
890+
''');
891+
await resolveTestCode('''
892+
import '$importUri';
893+
894+
f() {
895+
expect(true, true);
896+
}
897+
''');
898+
await assertHasFix('''
899+
import 'package:p/expect.dart';
900+
import '$importUri';
901+
902+
f() {
903+
expect(true, true);
904+
}
905+
''', errorFilter: ignoreUnusedImport);
906+
}
907+
908+
Future<void> test_new_element_uris_single() async {
909+
setPackageContent('');
910+
addPackageDataFile('''
911+
version: 1
912+
transforms:
913+
- title: 'Replace expect'
914+
date: 2022-05-12
915+
bulkApply: false
916+
element:
917+
uris: ['$importUri']
918+
function: 'expect'
919+
changes:
920+
- kind: 'replacedBy'
921+
newElement:
922+
uris: ['package:matcher/expect.dart']
923+
function: 'expect'
924+
''');
925+
await resolveTestCode('''
926+
import '$importUri';
927+
928+
main() {
929+
expect(true, true);
930+
}
931+
''');
932+
await assertHasFix('''
933+
import 'package:matcher/expect.dart';
934+
import '$importUri';
935+
936+
main() {
937+
expect(true, true);
938+
}
939+
''', errorFilter: ignoreUnusedImport);
940+
}
941+
}
942+
865943
class _Element {
866944
final ElementKind kind;
867945
final List<String> components;

pkg/analysis_server/test/src/services/correction/fix/data_driven/test_all.dart

+2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import 'rename_parameter_test.dart' as rename_parameter;
1717
import 'rename_test.dart' as rename;
1818
import 'replaced_by_test.dart' as replaced_by;
1919
import 'sdk_fix_test.dart' as sdk_fix;
20+
import 'test_use_case_test.dart' as test_use_case;
2021
import 'transform_override_set_parser_test.dart'
2122
as transform_override_set_parser;
2223
import 'transform_set_manager_test.dart' as transform_set_manager;
@@ -37,6 +38,7 @@ void main() {
3738
rename.main();
3839
replaced_by.main();
3940
sdk_fix.main();
41+
test_use_case.main();
4042
transform_override_set_parser.main();
4143
transform_set_manager.main();
4244
transform_set_parser.main();
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
import 'package:test_reflective_loader/test_reflective_loader.dart';
6+
7+
import '../fix_processor.dart';
8+
import 'data_driven_test_support.dart';
9+
10+
void main() {
11+
defineReflectiveSuite(() {
12+
defineReflectiveTests(TestUseCaseTest);
13+
});
14+
}
15+
16+
@reflectiveTest
17+
class TestUseCaseTest extends DataDrivenFixProcessorTest {
18+
@FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/23067')
19+
Future<void> test_expect_export_deprecated() async {
20+
newFile('$workspaceRootPath/p/lib/lib.dart', '''
21+
library p;
22+
@deprecated
23+
export 'package:matcher/expect.dart' show expect;
24+
''');
25+
newFile('$workspaceRootPath/matcher/lib/expect.dart', '''
26+
void expect(actual, matcher) {}
27+
''');
28+
29+
writeTestPackageConfig(
30+
config: PackageConfigFileBuilder()
31+
..add(name: 'matcher', rootPath: '$workspaceRootPath/matcher')
32+
..add(name: 'p', rootPath: '$workspaceRootPath/p'),
33+
);
34+
35+
addPackageDataFile('''
36+
version: 1
37+
transforms:
38+
- title: 'Replace expect'
39+
date: 2022-05-12
40+
bulkApply: false
41+
element:
42+
uris: ['$importUri']
43+
function: 'expect'
44+
changes:
45+
- kind: 'replacedBy'
46+
newElement:
47+
uris: ['package:matcher/expect.dart']
48+
function: 'expect'
49+
''');
50+
await resolveTestCode('''
51+
import '$importUri';
52+
53+
main() {
54+
expect(true, true);
55+
}
56+
''');
57+
await assertHasFix('''
58+
import 'package:matcher/expect.dart';
59+
import '$importUri';
60+
61+
main() {
62+
expect(true, true);
63+
}
64+
''');
65+
}
66+
67+
Future<void> test_expect_removed() async {
68+
setPackageContent('''
69+
''');
70+
71+
addPackageDataFile('''
72+
version: 1
73+
transforms:
74+
- title: 'Replace expect'
75+
date: 2022-05-12
76+
bulkApply: false
77+
element:
78+
uris: ['$importUri']
79+
function: 'expect'
80+
changes:
81+
- kind: 'replacedBy'
82+
newElement:
83+
uris: ['package:matcher/expect.dart']
84+
function: 'expect'
85+
''');
86+
await resolveTestCode('''
87+
import '$importUri';
88+
89+
main() {
90+
expect(true, true);
91+
}
92+
''');
93+
await assertHasFix('''
94+
import 'package:matcher/expect.dart';
95+
import '$importUri';
96+
97+
main() {
98+
expect(true, true);
99+
}
100+
''', errorFilter: ignoreUnusedImport);
101+
}
102+
}

pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart

+20
Original file line numberDiff line numberDiff line change
@@ -1483,6 +1483,26 @@ class DartFileEditBuilderImpl extends FileEditBuilderImpl
14831483
return _importLibrary(uri, prefix: prefix, forceRelative: true).uriText;
14841484
}
14851485

1486+
@override
1487+
bool importsLibrary(Uri uri) {
1488+
// Self-reference.
1489+
if (resolvedUnit.libraryElement.source.uri == uri) return false;
1490+
1491+
// Existing import.
1492+
for (var import in resolvedUnit.libraryElement.imports) {
1493+
var importedLibrary = import.importedLibrary;
1494+
if (importedLibrary != null && importedLibrary.source.uri == uri) {
1495+
return true;
1496+
}
1497+
}
1498+
1499+
// Queued change.
1500+
var importChange = (libraryChangeBuilder ?? this).librariesToImport[uri];
1501+
if (importChange != null) return true;
1502+
1503+
return false;
1504+
}
1505+
14861506
@override
14871507
void replaceTypeWithFuture(
14881508
TypeAnnotation? typeAnnotation, TypeProvider typeProvider) {

pkg/analyzer_plugin/lib/utilities/change_builder/change_builder_dart.dart

+4
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,10 @@ abstract class DartFileEditBuilder implements FileEditBuilder {
359359
/// If there is no existing import, a new import is added.
360360
ImportLibraryElementResult importLibraryElement(Uri uri);
361361

362+
/// Return `true` if the given library [uri] is already imported or will be
363+
/// imported by a scheduled edit.
364+
bool importsLibrary(Uri uri);
365+
362366
/// Optionally create an edit to replace the given [typeAnnotation] with the
363367
/// type `Future` (with the given type annotation as the type argument). The
364368
/// [typeProvider] is used to check the current type, because if it is already

0 commit comments

Comments
 (0)