| library /*isNonNullableByDefault*/; |
| import self as self; |
| import "dart:core" as core; |
| import "dart:collection" as col; |
| |
| static method testLaterUnnamedParameter(<T extends core::Object? = dynamic>(T%, (T%) → void) → void f) → dynamic { |
| f<core::int>(0, (core::int x) → void { |
| x; |
| }){(core::int, (core::int) → void) → void}; |
| } |
| static method testLaterUnnamedParameterDependsOnNamedParameter(<T extends core::Object? = dynamic>((T%) → void, {required a: T%}) → void f) → dynamic { |
| let final core::int #t1 = 0 in f<core::int>((core::int x) → void { |
| x; |
| }, a: #t1){((core::int) → void, {required a: core::int}) → void}; |
| } |
| static method testEarlierUnnamedParameter(<T extends core::Object? = dynamic>((T%) → void, T%) → void f) → dynamic { |
| f<core::int>((core::int x) → void { |
| x; |
| }, 0){((core::int) → void, core::int) → void}; |
| } |
| static method testLaterNamedParameter(<T extends core::Object? = dynamic>({required a: T%, required b: (T%) → void}) → void f) → dynamic { |
| f<core::int>(a: 0, b: (core::int x) → void { |
| x; |
| }){({required a: core::int, required b: (core::int) → void}) → void}; |
| } |
| static method testEarlierNamedParameter(<T extends core::Object? = dynamic>({required a: (T%) → void, required b: T%}) → void f) → dynamic { |
| f<core::int>(a: (core::int x) → void { |
| x; |
| }, b: 0){({required a: (core::int) → void, required b: core::int}) → void}; |
| } |
| static method testEarlierNamedParameterDependsOnUnnamedParameter(<T extends core::Object? = dynamic>(T%, {required a: (T%) → void}) → void f) → dynamic { |
| f<core::int>(0, a: (core::int x) → void { |
| x; |
| }){(core::int, {required a: (core::int) → void}) → void}; |
| } |
| static method testPropagateToReturnType(<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T%, (T%) → U%) → U% f) → dynamic { |
| f<core::int, core::List<core::int>>(0, (core::int x) → core::List<core::int> => core::_GrowableList::_literal1<core::int>(x)){(core::int, (core::int) → core::List<core::int>) → core::List<core::int>}; |
| } |
| static method testFold(core::List<core::int> list) → dynamic { |
| core::int a = list.{core::Iterable::fold}<core::int>(0, (core::int x, core::int y) → core::int => x.{core::num::+}(y){(core::num) → core::int}){(core::int, (core::int, core::int) → core::int) → core::int}; |
| a; |
| } |
| static method testClosureAsParameterType(<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T%, (T%) → U%) → U% f) → dynamic { |
| f<() → core::int, core::List<core::int>>(() → core::int => 0, (() → core::int h) → core::List<core::int> => core::_GrowableList::_literal1<core::int>(h(){() → core::int})){(() → core::int, (() → core::int) → core::List<core::int>) → core::List<core::int>}; |
| } |
| static method testPropagateToEarlierClosure(<T extends core::Object? = dynamic, U extends core::Object? = dynamic>((T%) → U%, () → T%) → U% f) → dynamic { |
| f<core::int, core::List<core::int>>((core::int x) → core::List<core::int> => core::_GrowableList::_literal1<core::int>(x), () → core::int => 0){((core::int) → core::List<core::int>, () → core::int) → core::List<core::int>}; |
| } |
| static method testPropagateToLaterClosure(<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → T%, (T%) → U%) → U% f) → dynamic { |
| f<core::int, core::List<core::int>>(() → core::int => 0, (core::int x) → core::List<core::int> => core::_GrowableList::_literal1<core::int>(x)){(() → core::int, (core::int) → core::List<core::int>) → core::List<core::int>}; |
| } |
| static method testLongDependencyChain(<T extends core::Object? = dynamic, U extends core::Object? = dynamic, V extends core::Object? = dynamic>(() → T%, (T%) → U%, (U%) → V%) → V% f) → dynamic { |
| f<core::List<core::int>, core::int, core::Set<core::int>>(() → core::List<core::int> => core::_GrowableList::_literal1<core::int>(0), (core::List<core::int> x) → core::int => x.{core::Iterable::single}{core::int}, (core::int y) → core::Set<core::int> => block { |
| final core::Set<core::int> #t2 = new col::_CompactLinkedHashSet::•<core::int>(); |
| #t2.{core::Set::add}{Invariant}(y){(core::int) → core::bool}; |
| } =>#t2){(() → core::List<core::int>, (core::List<core::int>) → core::int, (core::int) → core::Set<core::int>) → core::Set<core::int>}; |
| } |
| static method testDependencyCycle(<T extends core::Object? = dynamic, U extends core::Object? = dynamic>((U%) → T%, (T%) → U%) → core::Map<T%, U%> f) → dynamic { |
| f<core::List<core::Object?>, core::Set<core::Object?>>((core::Object? x) → core::List<core::Object?> => core::_GrowableList::_literal1<core::Object?>(x), (core::Object? y) → core::Set<core::Object?> => block { |
| final core::Set<core::Object?> #t3 = new col::_CompactLinkedHashSet::•<core::Object?>(); |
| #t3.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool}; |
| } =>#t3){((core::Set<core::Object?>) → core::List<core::Object?>, (core::List<core::Object?>) → core::Set<core::Object?>) → core::Map<core::List<core::Object?>, core::Set<core::Object?>>}; |
| } |
| static method testNecessaryDueToWrongExplicitParameterType(core::List<core::int> list) → dynamic { |
| core::int a = list.{core::Iterable::fold}<core::int>(0, (core::int x, core::int y) → core::int => x.{core::num::+}(y){(core::num) → core::int}){(core::int, (core::int, core::int) → core::int) → core::int}; |
| a; |
| } |
| static method testPropagateFromContravariantReturnType(<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → (T%) → void, (T%) → U%) → U% f) → dynamic { |
| f<core::int, core::List<core::int>>(() → (core::int) → void => (core::int i) → void {}, (core::int x) → core::List<core::int> => core::_GrowableList::_literal1<core::int>(x)){(() → (core::int) → void, (core::int) → core::List<core::int>) → core::List<core::int>}; |
| } |
| static method testPropagateToContravariantParameterType(<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → T%, ((T%) → void) → U%) → U% f) → dynamic { |
| f<core::int, core::List<(core::int) → void>>(() → core::int => 0, ((core::int) → void x) → core::List<(core::int) → void> => core::_GrowableList::_literal1<(core::int) → void>(x)){(() → core::int, ((core::int) → void) → core::List<(core::int) → void>) → core::List<(core::int) → void>}; |
| } |
| static method testReturnTypeRefersToMultipleTypeVars(<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → core::Map<T%, U%>, (T%) → void, (U%) → void) → void f) → dynamic { |
| f<core::int, core::String>(() → core::Map<core::int, core::String> => <core::int, core::String>{0: ""}, (core::int k) → void { |
| k; |
| }, (core::String v) → void { |
| v; |
| }){(() → core::Map<core::int, core::String>, (core::int) → void, (core::String) → void) → void}; |
| } |
| static method testUnnecessaryDueToNoDependency(<T extends core::Object? = dynamic>(() → T%, T%) → T% f) → dynamic { |
| f<core::int?>(() → core::int => 0, null){(() → core::int?, core::int?) → core::int?}; |
| } |
| static method testUnnecessaryDueToExplicitParameterType(core::List<core::int> list) → dynamic { |
| core::int? a = list.{core::Iterable::fold}<core::int?>(null, (core::int? x, core::int y) → core::int => (let final core::int? #t4 = x in #t4 == null ?{core::int} 0 : #t4{core::int}).{core::num::+}(y){(core::num) → core::int}){(core::int?, (core::int?, core::int) → core::int?) → core::int?}; |
| a; |
| } |
| static method testUnnecessaryDueToExplicitParameterTypeNamed(<T extends core::Object? = dynamic>(T%, ({required x: T%, required y: core::int}) → T%) → T% f) → dynamic { |
| core::int? a = f<core::int?>(null, ({core::int? x = #C1, required core::int y = #C1}) → core::int => (let final core::int? #t5 = x in #t5 == null ?{core::int} 0 : #t5{core::int}).{core::num::+}(y){(core::num) → core::int}){(core::int?, ({required x: core::int?, required y: core::int}) → core::int?) → core::int?}; |
| a; |
| } |
| static method testParenthesized(<T extends core::Object? = dynamic>(T%, (T%) → void) → void f) → dynamic { |
| f<core::int>(0, (core::int x) → void { |
| x; |
| }){(core::int, (core::int) → void) → void}; |
| } |
| static method testParenthesizedNamed(<T extends core::Object? = dynamic>({required a: T%, required b: (T%) → void}) → void f) → dynamic { |
| f<core::int>(a: 0, b: (core::int x) → void { |
| x; |
| }){({required a: core::int, required b: (core::int) → void}) → void}; |
| } |
| static method testParenthesizedTwice(<T extends core::Object? = dynamic>(T%, (T%) → void) → void f) → dynamic { |
| f<core::int>(0, (core::int x) → void { |
| x; |
| }){(core::int, (core::int) → void) → void}; |
| } |
| static method testParenthesizedTwiceNamed(<T extends core::Object? = dynamic>({required a: T%, required b: (T%) → void}) → void f) → dynamic { |
| f<core::int>(a: 0, b: (core::int x) → void { |
| x; |
| }){({required a: core::int, required b: (core::int) → void}) → void}; |
| } |
| static method main() → dynamic {} |
| |
| constants { |
| #C1 = null |
| } |
| |
| Extra constant evaluation status: |
| Evaluated: VariableGet @ org-dartlang-testcase:///horizontal_inference.dart:20:8 -> IntConstant(0) |
| Extra constant evaluation: evaluated: 154, effectively constant: 1 |