Skip to content

Commit

Permalink
Support fix to import a library defining an extention
Browse files Browse the repository at this point in the history
Change-Id: Ife2f48eb5de0311aacd0d811973b7c160fc311da
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/115721
Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
Reviewed-by: Konstantin Shcheglov <scheglov@google.com>
  • Loading branch information
bwilkerson authored and commit-bot@chromium.org committed Sep 5, 2019
1 parent 4fbd758 commit ec48af6
Show file tree
Hide file tree
Showing 5 changed files with 194 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ class TopLevelDeclaration {
/// Kind of a top-level declaration.
///
/// We don't need it to be precise, just enough to support quick fixes.
enum TopLevelDeclarationKind { type, function, variable }
enum TopLevelDeclarationKind { type, extension, function, variable }

class TopLevelDeclarationsProvider {
final DeclarationsTracker tracker;
Expand Down Expand Up @@ -94,6 +94,9 @@ class TopLevelDeclarationsProvider {
case DeclarationKind.MIXIN:
return TopLevelDeclarationKind.type;
break;
case DeclarationKind.EXTENSION:
return TopLevelDeclarationKind.extension;
break;
case DeclarationKind.FUNCTION:
return TopLevelDeclarationKind.function;
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -472,6 +472,7 @@ class FixProcessor extends BaseProcessor {
await _addFix_createFunction_forFunctionType();
await _addFix_createMixin();
await _addFix_importLibrary_withType();
await _addFix_importLibrary_withExtension();
await _addFix_importLibrary_withFunction();
await _addFix_importLibrary_withTopLevelVariable();
await _addFix_createLocalVariable();
Expand Down Expand Up @@ -2471,6 +2472,14 @@ class FixProcessor extends BaseProcessor {
}
}

Future<void> _addFix_importLibrary_withExtension() async {
String extensionName = (node as SimpleIdentifier).name;
await _addFix_importLibrary_withElement(
extensionName,
const [ElementKind.EXTENSION],
const [TopLevelDeclarationKind.extension]);
}

Future<void> _addFix_importLibrary_withFunction() async {
if (node is SimpleIdentifier) {
if (node.parent is MethodInvocation) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import 'fix_processor.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(ImportLibraryPrefixTest);
defineReflectiveTests(ImportLibraryPrefixWithExtensionMethodsTest);
});
}

Expand Down Expand Up @@ -55,3 +56,35 @@ main() {
''');
}
}

@reflectiveTest
class ImportLibraryPrefixWithExtensionMethodsTest extends FixProcessorTest {
@override
FixKind get kind => DartFixKind.IMPORT_LIBRARY_PREFIX;

void setUp() {
createAnalysisOptionsFile(experiments: ['extension-methods']);
super.setUp();
}

test_withExtension() async {
addSource('/home/test/lib/lib.dart', '''
class C {}
extension E on int {
static String m() => '';
}
''');
await resolveTestUnit('''
import 'lib.dart' as p;
void f(p.C c) {
print(E.m());
}
''');
await assertHasFix('''
import 'lib.dart' as p;
void f(p.C c) {
print(p.E.m());
}
''');
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,51 @@ import 'fix_processor.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(ImportLibraryProject1Test);
defineReflectiveTests(ImportLibraryProject1WithExtensionMethodsTest);
defineReflectiveTests(ImportLibraryProject2Test);
defineReflectiveTests(ImportLibraryProject2WithExtensionMethodsTest);
defineReflectiveTests(ImportLibraryProject3Test);
defineReflectiveTests(ImportLibraryProject3WithExtensionMethodsTest);
});
}

@reflectiveTest
class ImportLibraryProject1WithExtensionMethodsTest extends FixProcessorTest {
@override
FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT1;

void setUp() {
createAnalysisOptionsFile(experiments: ['extension-methods']);
super.setUp();
}

test_lib() async {
addPackageFile('my_pkg', 'a.dart', '''
extension E on int {
static String m() => '';
}
''');
newFile('/home/test/pubspec.yaml', content: r'''
dependencies:
my_pkg: any
''');

await resolveTestUnit('''
f() {
print(E.m());
}
''');

await assertHasFix('''
import 'package:my_pkg/a.dart';
f() {
print(E.m());
}
''', expectedNumberOfFixesForKind: 1);
}
}

@reflectiveTest
class ImportLibraryProject1Test extends FixProcessorTest {
@override
Expand Down Expand Up @@ -512,6 +552,42 @@ main() {
}
}

@reflectiveTest
class ImportLibraryProject2WithExtensionMethodsTest extends FixProcessorTest {
@override
FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT2;

void setUp() {
createAnalysisOptionsFile(experiments: ['extension-methods']);
super.setUp();
}

test_lib_src() async {
addPackageFile('my_pkg', 'a.dart', "export 'src/b.dart';");
addPackageFile('my_pkg', 'src/b.dart', '''
extension E on int {
static String m() => '';
}
''');
newFile('/home/test/pubspec.yaml', content: r'''
dependencies:
my_pkg: any
''');
await resolveTestUnit('''
f() {
print(E.m());
}
''');
await assertHasFix('''
import 'package:my_pkg/a.dart';
f() {
print(E.m());
}
''');
}
}

@reflectiveTest
class ImportLibraryProject2Test extends FixProcessorTest {
@override
Expand Down Expand Up @@ -564,6 +640,37 @@ main() {
}
}

@reflectiveTest
class ImportLibraryProject3WithExtensionMethodsTest extends FixProcessorTest {
@override
FixKind get kind => DartFixKind.IMPORT_LIBRARY_PROJECT3;

void setUp() {
createAnalysisOptionsFile(experiments: ['extension-methods']);
super.setUp();
}

test_inLibSrc_thisContextRoot() async {
addSource('/home/test/lib/src/lib.dart', '''
extension E on int {
static String m() => '';
}
''');
await resolveTestUnit('''
f() {
print(E.m());
}
''');
await assertHasFix('''
import 'package:test/src/lib.dart';
f() {
print(E.m());
}
''');
}
}

@reflectiveTest
class ImportLibraryProject3Test extends FixProcessorTest {
@override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import 'fix_processor.dart';
main() {
defineReflectiveSuite(() {
defineReflectiveTests(ImportLibraryShowTest);
defineReflectiveTests(ImportLibraryShowWithExtensionMethodsTest);
});
}

Expand All @@ -24,39 +25,71 @@ class ImportLibraryShowTest extends FixProcessorTest {
class A {}
class B {}
''');
await resolveTestUnit('''
await resolveTestUnit(r'''
import 'lib.dart' show A;
main() {
A a;
B b;
print('\$a \$b');
print('$a $b');
}
''');
await assertHasFix('''
await assertHasFix(r'''
import 'lib.dart' show A, B;
main() {
A a;
B b;
print('\$a \$b');
print('$a $b');
}
''');
}

test_sdk() async {
await resolveTestUnit('''
await resolveTestUnit(r'''
import 'dart:collection' show HashMap;
main() {
HashMap s = null;
LinkedHashMap f = null;
print('\$s \$f');
print('$s $f');
}
''');
await assertHasFix('''
await assertHasFix(r'''
import 'dart:collection' show HashMap, LinkedHashMap;
main() {
HashMap s = null;
LinkedHashMap f = null;
print('\$s \$f');
print('$s $f');
}
''');
}
}

@reflectiveTest
class ImportLibraryShowWithExtensionMethodsTest extends FixProcessorTest {
@override
FixKind get kind => DartFixKind.IMPORT_LIBRARY_SHOW;

void setUp() {
createAnalysisOptionsFile(experiments: ['extension-methods']);
super.setUp();
}

test_package() async {
addSource('/home/test/lib/lib.dart', '''
class A {}
extension E on int {
static String m() => '';
}
''');
await resolveTestUnit(r'''
import 'lib.dart' show A;
void f(A a) {
print('$a ${E.m()}');
}
''');
await assertHasFix(r'''
import 'lib.dart' show A, E;
void f(A a) {
print('$a ${E.m()}');
}
''');
}
Expand Down

0 comments on commit ec48af6

Please sign in to comment.