Skip to content

Commit d67eaef

Browse files
bwilkersoncommit-bot@chromium.org
authored andcommitted
Add more tests of the visibility of extension members
This is the item labeled "scoping" in the task doc. Change-Id: I9caf5cd548ecc7a1d1d986854081bf23a5e98de8 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/113903 Reviewed-by: Konstantin Shcheglov <scheglov@google.com> Commit-Queue: Brian Wilkerson <brianwilkerson@google.com>
1 parent 7292347 commit d67eaef

File tree

1 file changed

+149
-0
lines changed

1 file changed

+149
-0
lines changed

pkg/analyzer/test/src/dart/resolution/extension_method_test.dart

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,155 @@ import 'lib.dart' show C;
185185
f(C c) {
186186
c.a;
187187
}
188+
''', [
189+
error(StaticTypeWarningCode.UNDEFINED_GETTER, 40, 1),
190+
]);
191+
}
192+
193+
test_visibility_shadowed_byClass() async {
194+
newFile('/test/lib/lib.dart', content: '''
195+
class C {}
196+
extension E on C {
197+
int get a => 1;
198+
}
199+
''');
200+
await assertNoErrorsInCode('''
201+
import 'lib.dart';
202+
203+
class E {}
204+
f(C c) {
205+
c.a;
206+
}
207+
''');
208+
var access = findNode.prefixed('c.a');
209+
var import = findElement.importFind('package:test/lib.dart');
210+
assertElement(access, import.extension_('E').getGetter('a'));
211+
assertType(access, 'int');
212+
}
213+
214+
test_visibility_shadowed_byImport() async {
215+
newFile('/test/lib/lib1.dart', content: '''
216+
extension E on Object {
217+
int get a => 1;
218+
}
219+
''');
220+
newFile('/test/lib/lib2.dart', content: '''
221+
class E {}
222+
class A {}
223+
''');
224+
await assertNoErrorsInCode('''
225+
import 'lib1.dart';
226+
import 'lib2.dart';
227+
228+
f(Object o, A a) {
229+
o.a;
230+
}
231+
''');
232+
var access = findNode.prefixed('o.a');
233+
var import = findElement.importFind('package:test/lib1.dart');
234+
assertElement(access, import.extension_('E').getGetter('a'));
235+
assertType(access, 'int');
236+
}
237+
238+
test_visibility_shadowed_byLocal_imported() async {
239+
newFile('/test/lib/lib.dart', content: '''
240+
class C {}
241+
extension E on C {
242+
int get a => 1;
243+
}
244+
''');
245+
await assertNoErrorsInCode('''
246+
import 'lib.dart';
247+
248+
f(C c) {
249+
double E = 2.71;
250+
c.a;
251+
}
252+
''');
253+
var access = findNode.prefixed('c.a');
254+
var import = findElement.importFind('package:test/lib.dart');
255+
assertElement(access, import.extension_('E').getGetter('a'));
256+
assertType(access, 'int');
257+
}
258+
259+
test_visibility_shadowed_byLocal_local() async {
260+
await assertNoErrorsInCode('''
261+
class C {}
262+
extension E on C {
263+
int get a => 1;
264+
}
265+
f(C c) {
266+
double E = 2.71;
267+
c.a;
268+
}
269+
''');
270+
var access = findNode.prefixed('c.a');
271+
assertElement(access, findElement.getter('a'));
272+
assertType(access, 'int');
273+
}
274+
275+
test_visibility_shadowed_byTopLevelVariable() async {
276+
newFile('/test/lib/lib.dart', content: '''
277+
class C {}
278+
extension E on C {
279+
int get a => 1;
280+
}
281+
''');
282+
await assertNoErrorsInCode('''
283+
import 'lib.dart';
284+
285+
double E = 2.71;
286+
f(C c) {
287+
c.a;
288+
}
289+
''');
290+
var access = findNode.prefixed('c.a');
291+
var import = findElement.importFind('package:test/lib.dart');
292+
assertElement(access, import.extension_('E').getGetter('a'));
293+
assertType(access, 'int');
294+
}
295+
296+
test_visibility_shadowed_coreByNonCore() async {
297+
newFile('/test/lib/core.dart', content: '''
298+
library dart.core;
299+
300+
extension E on Object {
301+
int get a => 1;
302+
}
303+
class A {}
304+
''');
305+
newFile('/test/lib/lib.dart', content: '''
306+
extension E on Object {
307+
int get a => 1;
308+
}
309+
class B {}
310+
''');
311+
await assertErrorsInCode('''
312+
import 'core.dart';
313+
import 'lib.dart';
314+
315+
f(Object o, A a, B b) {
316+
o.a;
317+
}
318+
''', [
319+
error(CompileTimeErrorCode.AMBIGUOUS_EXTENSION_METHOD_ACCESS, 68, 1),
320+
]);
321+
}
322+
323+
@failingTest
324+
test_visibility_withPrefix() async {
325+
newFile('/test/lib/lib.dart', content: '''
326+
class C {}
327+
extension E on C {
328+
int get a => 1;
329+
}
330+
''');
331+
await assertErrorsInCode('''
332+
import 'lib.dart' as p;
333+
334+
f(p.C c) {
335+
c.a;
336+
}
188337
''', [
189338
error(StaticTypeWarningCode.UNDEFINED_GETTER, 40, 1),
190339
]);

0 commit comments

Comments
 (0)