| // Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| // This test verifies that `f<T, U>(0)` is properly parsed as a generic |
| // invocation, for all type syntaxes that may appear as T and U. |
| |
| // Note: it doesn't really matter what we import here; it's just a handy library |
| // that has declares a types so that we can refer a type via a prefix. |
| import 'dart:async' as prefix; |
| |
| import '../syntax_helper.dart'; |
| |
| class C extends SyntaxTracker { |
| C([Object? x = absent, Object? y = absent]) |
| : super('new C${SyntaxTracker.args(x, y)}'); |
| } |
| |
| /// Helper function to work around the fact that not all types can be expressed |
| /// as type literals. |
| Type typeOf<T>() => T; |
| |
| main() { |
| SyntaxTracker.known[C] = 'C'; |
| SyntaxTracker.known[typeOf<C?>()] = 'C?'; |
| SyntaxTracker.known[prefix.Zone] = 'prefix.Zone'; |
| SyntaxTracker.known[typeOf<prefix.Zone?>()] = 'prefix.Zone?'; |
| SyntaxTracker.known[dynamic] = 'dynamic'; |
| SyntaxTracker.known[typeOf<List<C>>()] = 'List<C>'; |
| SyntaxTracker.known[typeOf<List<C>?>()] = 'List<C>?'; |
| SyntaxTracker.known[typeOf<void Function()>()] = 'void Function()'; |
| SyntaxTracker.known[typeOf<void Function()?>()] = 'void Function()?'; |
| checkSyntax(f(f<C, C>(0)), 'f(f<C, C>(0))'); |
| checkSyntax(f(f<C?, C>(0)), 'f(f<C?, C>(0))'); |
| checkSyntax(f(f<dynamic, C>(0)), 'f(f<dynamic, C>(0))'); |
| checkSyntax(f(f<prefix.Zone, C>(0)), 'f(f<prefix.Zone, C>(0))'); |
| checkSyntax(f(f<prefix.Zone?, C>(0)), 'f(f<prefix.Zone?, C>(0))'); |
| checkSyntax(f(f<List<C>, C>(0)), 'f(f<List<C>, C>(0))'); |
| checkSyntax(f(f<List<C>?, C>(0)), 'f(f<List<C>?, C>(0))'); |
| checkSyntax(f(f<void Function(), C>(0)), 'f(f<void Function(), C>(0))'); |
| checkSyntax(f(f<void Function()?, C>(0)), 'f(f<void Function()?, C>(0))'); |
| checkSyntax(f(f<C, C?>(0)), 'f(f<C, C?>(0))'); |
| checkSyntax(f(f<C, dynamic>(0)), 'f(f<C, dynamic>(0))'); |
| checkSyntax(f(f<C, prefix.Zone>(0)), 'f(f<C, prefix.Zone>(0))'); |
| checkSyntax(f(f<C, prefix.Zone?>(0)), 'f(f<C, prefix.Zone?>(0))'); |
| checkSyntax(f(f<C, List<C>>(0)), 'f(f<C, List<C>>(0))'); |
| checkSyntax(f(f<C, List<C>?>(0)), 'f(f<C, List<C>?>(0))'); |
| checkSyntax(f(f<C, void Function()>(0)), 'f(f<C, void Function()>(0))'); |
| checkSyntax(f(f<C, void Function()?>(0)), 'f(f<C, void Function()?>(0))'); |
| } |