@@ -15,6 +15,7 @@ import 'driver_resolution.dart';
1515main () {
1616 defineReflectiveSuite (() {
1717 defineReflectiveTests (ExtensionMethodsDeclarationTest );
18+ defineReflectiveTests (ExtensionMethodsExtendedTypeTest );
1819 defineReflectiveTests (ExtensionMethodsExternalReferenceTest );
1920 defineReflectiveTests (ExtensionMethodsInternalReferenceTest );
2021 });
@@ -77,110 +78,6 @@ extension E2 on C {}
7778''' );
7879 }
7980
80- test_named_generic () async {
81- await assertNoErrorsInCode ('''
82- class C<T> {}
83- extension E<S> on C<S> {}
84- ''' );
85- var extendedType = findNode.typeAnnotation ('C<S>' );
86- assertElement (extendedType, findElement.class_ ('C' ));
87- assertType (extendedType, 'C<S>' );
88- }
89-
90- test_named_onDynamic () async {
91- await assertNoErrorsInCode ('''
92- extension E on dynamic {}
93- ''' );
94- var extendedType = findNode.typeAnnotation ('dynamic' );
95- assertType (extendedType, 'dynamic' );
96- }
97-
98- test_named_onEnum () async {
99- await assertNoErrorsInCode ('''
100- enum A {a, b, c}
101- extension E on A {}
102- ''' );
103- var extendedType = findNode.typeAnnotation ('A {}' );
104- assertElement (extendedType, findElement.enum_ ('A' ));
105- assertType (extendedType, 'A' );
106- }
107-
108- test_named_onFunctionType () async {
109- try {
110- await assertNoErrorsInCode ('''
111- extension E on int Function(int) {}
112- ''' );
113- var extendedType = findNode.typeAnnotation ('Function' );
114- assertType (extendedType, 'int Function(int)' );
115- if (! AnalysisDriver .useSummary2) {
116- throw 'Test passed - expected to fail.' ;
117- }
118- } on String {
119- rethrow ;
120- } catch (e) {
121- if (AnalysisDriver .useSummary2) {
122- rethrow ;
123- }
124- }
125- }
126-
127- test_named_onInterface () async {
128- await assertNoErrorsInCode ('''
129- class C { }
130- extension E on C {}
131- ''' );
132- var extendedType = findNode.typeAnnotation ('C {}' );
133- assertElement (extendedType, findElement.class_ ('C' ));
134- assertType (extendedType, 'C' );
135- }
136-
137- test_unnamed_generic () async {
138- await assertNoErrorsInCode ('''
139- class C<T> {}
140- extension<S> on C<S> {}
141- ''' );
142- var extendedType = findNode.typeAnnotation ('C<S>' );
143- assertElement (extendedType, findElement.class_ ('C' ));
144- assertType (extendedType, 'C<S>' );
145- }
146-
147- test_unnamed_onDynamic () async {
148- await assertNoErrorsInCode ('''
149- extension on dynamic {}
150- ''' );
151- var extendedType = findNode.typeAnnotation ('dynamic' );
152- assertType (extendedType, 'dynamic' );
153- }
154-
155- test_unnamed_onEnum () async {
156- await assertNoErrorsInCode ('''
157- enum A {a, b, c}
158- extension on A {}
159- ''' );
160- var extendedType = findNode.typeAnnotation ('A {}' );
161- assertElement (extendedType, findElement.enum_ ('A' ));
162- assertType (extendedType, 'A' );
163- }
164-
165- @failingTest
166- test_unnamed_onFunctionType () async {
167- await assertNoErrorsInCode ('''
168- extension on int Function(int) {}
169- ''' );
170- var extendedType = findNode.typeAnnotation ('int ' );
171- assertType (extendedType, 'int Function(int)' );
172- }
173-
174- test_unnamed_onInterface () async {
175- await assertNoErrorsInCode ('''
176- class C { }
177- extension on C {}
178- ''' );
179- var extendedType = findNode.typeAnnotation ('C {}' );
180- assertElement (extendedType, findElement.class_ ('C' ));
181- assertType (extendedType, 'C' );
182- }
183-
18481 test_visibility_hidden () async {
18582 newFile ('/test/lib/lib.dart' , content: '''
18683class C {}
@@ -357,6 +254,137 @@ f(p.C c) {
357254 }
358255}
359256
257+ /// Tests that show that extension declarations support all of the possible
258+ /// types in the `on` clause.
259+ @reflectiveTest
260+ class ExtensionMethodsExtendedTypeTest extends BaseExtensionMethodsTest {
261+ test_named_generic () async {
262+ await assertNoErrorsInCode ('''
263+ class C<T> {}
264+ extension E<S> on C<S> {}
265+ ''' );
266+ var extendedType = findNode.typeAnnotation ('C<S>' );
267+ assertElement (extendedType, findElement.class_ ('C' ));
268+ assertType (extendedType, 'C<S>' );
269+ }
270+
271+ test_named_onDynamic () async {
272+ await assertNoErrorsInCode ('''
273+ extension E on dynamic {}
274+ ''' );
275+ var extendedType = findNode.typeAnnotation ('dynamic' );
276+ assertType (extendedType, 'dynamic' );
277+ }
278+
279+ test_named_onEnum () async {
280+ await assertNoErrorsInCode ('''
281+ enum A {a, b, c}
282+ extension E on A {}
283+ ''' );
284+ var extendedType = findNode.typeAnnotation ('A {}' );
285+ assertElement (extendedType, findElement.enum_ ('A' ));
286+ assertType (extendedType, 'A' );
287+ }
288+
289+ test_named_onFunctionType () async {
290+ try {
291+ await assertNoErrorsInCode ('''
292+ extension E on int Function(int) {}
293+ ''' );
294+ var extendedType = findNode.typeAnnotation ('Function' );
295+ assertType (extendedType, 'int Function(int)' );
296+ if (! AnalysisDriver .useSummary2) {
297+ throw 'Test passed - expected to fail.' ;
298+ }
299+ } on String {
300+ rethrow ;
301+ } catch (e) {
302+ if (AnalysisDriver .useSummary2) {
303+ rethrow ;
304+ }
305+ }
306+ }
307+
308+ test_named_onInterface () async {
309+ await assertNoErrorsInCode ('''
310+ class C { }
311+ extension E on C {}
312+ ''' );
313+ var extendedType = findNode.typeAnnotation ('C {}' );
314+ assertElement (extendedType, findElement.class_ ('C' ));
315+ assertType (extendedType, 'C' );
316+ }
317+
318+ test_named_onMixin () async {
319+ await assertNoErrorsInCode ('''
320+ mixin M {
321+ }
322+ extension E on M {}
323+ ''' );
324+ var extendedType = findNode.typeAnnotation ('M {}' );
325+ assertElement (extendedType, findElement.mixin ('M' ));
326+ assertType (extendedType, 'M' );
327+ }
328+
329+ test_unnamed_generic () async {
330+ await assertNoErrorsInCode ('''
331+ class C<T> {}
332+ extension<S> on C<S> {}
333+ ''' );
334+ var extendedType = findNode.typeAnnotation ('C<S>' );
335+ assertElement (extendedType, findElement.class_ ('C' ));
336+ assertType (extendedType, 'C<S>' );
337+ }
338+
339+ test_unnamed_onDynamic () async {
340+ await assertNoErrorsInCode ('''
341+ extension on dynamic {}
342+ ''' );
343+ var extendedType = findNode.typeAnnotation ('dynamic' );
344+ assertType (extendedType, 'dynamic' );
345+ }
346+
347+ test_unnamed_onEnum () async {
348+ await assertNoErrorsInCode ('''
349+ enum A {a, b, c}
350+ extension on A {}
351+ ''' );
352+ var extendedType = findNode.typeAnnotation ('A {}' );
353+ assertElement (extendedType, findElement.enum_ ('A' ));
354+ assertType (extendedType, 'A' );
355+ }
356+
357+ @failingTest
358+ test_unnamed_onFunctionType () async {
359+ await assertNoErrorsInCode ('''
360+ extension on int Function(int) {}
361+ ''' );
362+ var extendedType = findNode.typeAnnotation ('int ' );
363+ assertType (extendedType, 'int Function(int)' );
364+ }
365+
366+ test_unnamed_onInterface () async {
367+ await assertNoErrorsInCode ('''
368+ class C { }
369+ extension on C {}
370+ ''' );
371+ var extendedType = findNode.typeAnnotation ('C {}' );
372+ assertElement (extendedType, findElement.class_ ('C' ));
373+ assertType (extendedType, 'C' );
374+ }
375+
376+ test_unnamed_onMixin () async {
377+ await assertNoErrorsInCode ('''
378+ mixin M {
379+ }
380+ extension on M {}
381+ ''' );
382+ var extendedType = findNode.typeAnnotation ('M {}' );
383+ assertElement (extendedType, findElement.mixin ('M' ));
384+ assertType (extendedType, 'M' );
385+ }
386+ }
387+
360388/// Tests that extension members can be correctly resolved when referenced
361389/// by code external to the extension declaration.
362390@reflectiveTest
0 commit comments