Fix horizontal inference logic for extension method invocations.

The front end desugars extension methods by inserting a synthetic
`this` argument before all other arguments.  But this synthetic
argument isn't included in the `formalTypes` and `actualTypes` arrays.
So when recording a value into
`_DeferredParamInfo.evaluationOrderIndex` we may need to subtract 1 in
order to ensure that later logic will find the correct argument.

Fixes a corner case of https://github.com/dart-lang/language/issues/731.

Change-Id: Idbf136195e40555199f7c5b61a575a430f6ec6bd
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/243854
Commit-Queue: Paul Berry <paulberry@google.com>
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
This commit is contained in:
Paul Berry 2022-05-10 14:54:53 +00:00 committed by Commit Bot
parent a67c07c40f
commit 51d578cf91
9 changed files with 1399 additions and 1 deletions

View file

@ -128,6 +128,8 @@ List<_ParamInfo> _computeUndeferredParamInfo(List<DartType> formalTypes,
for (_DeferredParamInfo functionLiteral in deferredFunctionLiterals)
functionLiteral.evaluationOrderIndex
};
assert(evaluationOrderIndicesAlreadyCovered
.every((i) => 0 <= i && i < formalTypes.length));
return [
for (int i = 0; i < formalTypes.length; i++)
if (!evaluationOrderIndicesAlreadyCovered.contains(i))
@ -2527,7 +2529,9 @@ class TypeInferrerImpl implements TypeInferrer {
argumentExpression: argumentExpression,
unparenthesizedExpression: unparenthesizedExpression,
isNamed: !isExpression,
evaluationOrderIndex: evaluationOrderIndex,
evaluationOrderIndex: isImplicitExtensionMember
? evaluationOrderIndex - 1
: evaluationOrderIndex,
index: index));
// We don't have `identical` info yet, so fill it in with `null` for
// now. Later, when we visit the function literal, we'll replace it.

View file

@ -0,0 +1,173 @@
// Copyright (c) 2022, 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.
// Tests that horizontal inference works properly when the invocation is an
// extension member. This is an important corner case because the front end
// adds an implicit `this` argument to extension members as part of the lowering
// process. We need to make sure that the dependency tracking logic properly
// accounts for this extra argument.
// SharedOptions=--enable-experiment=inference-update-1
testLaterUnnamedParameter(int i) {
i._laterUnnamedParameter(0, (x) {
x;
});
}
/// This special case verifies that the implementations correctly associate the
/// zeroth positional parameter with the corresponding argument (even if that
/// argument isn't in the zeroth position at the call site).
testLaterUnnamedParameterDependsOnNamedParameter(int i) {
i._laterUnnamedParameterDependsOnNamedParameter(a: 0, (x) {
x;
});
}
testEarlierUnnamedParameter(int i) {
i._earlierUnnamedParameter((x) {
x;
}, 0);
}
testLaterNamedParameter(int i) {
i._laterNamedParameter(
a: 0,
b: (x) {
x;
});
}
testEarlierNamedParameter(int i) {
i._earlierNamedParameter(
a: (x) {
x;
},
b: 0);
}
/// This special case verifies that the implementations correctly associate the
/// zeroth positional parameter with the corresponding argument (even if that
/// argument isn't in the zeroth position at the call site).
testEarlierNamedParameterDependsOnUnnamedParameter(int i) {
i._earlierNamedParameterDependsOnUnnamedParameter(a: (x) {
x;
}, 0);
}
testPropagateToReturnType(int i) {
i._propagateToReturnType(0, (x) => [x]);
}
// The test cases below exercise situations where there are multiple closures in
// the invocation, and they need to be inferred in the right order.
testClosureAsParameterType(int i) {
i._closureAsParameterType(() => 0, (h) => [h()])
;
}
testPropagateToEarlierClosure(int i) {
i._propagateToEarlierClosure((x) => [x], () => 0)
;
}
testPropagateToLaterClosure(int i) {
i._propagateToLaterClosure(() => 0, (x) => [x])
;
}
testLongDependencyChain(int i) {
i._longDependencyChain(() => [0], (x) => x.single,
(y) => {y})
;
}
testDependencyCycle(int i) {
i._dependencyCycle((x) => [x],
(y) => {y})
;
}
testPropagateFromContravariantReturnType(int i) {
i._propagateFromContravariantReturnType(() => (int i) {}, (x) => [x])
;
}
testPropagateToContravariantParameterType(int i) {
i._propagateToContravariantParameterType(() => 0, (x) => [x])
;
}
testReturnTypeRefersToMultipleTypeVars(int i) {
i._returnTypeRefersToMultipleTypeVars(() => {0: ''}, (k) {
k;
}, (v) {
v;
});
}
testUnnecessaryDueToNoDependency(int i) {
i._unnecessaryDueToNoDependency(() => 0, null);
}
testUnnecessaryDueToExplicitParameterTypeNamed(int i) {
var a = i._unnecessaryDueToExplicitParameterTypeNamed(null, ({int? x, required y}) => (x ?? 0) + y);
a;
}
testParenthesized(int i) {
i._parenthesized(0, ((x) {
x;
}));
}
testParenthesizedNamed(int i) {
i._parenthesizedNamed(
a: 0,
b: ((x) {
x;
}));
}
testParenthesizedTwice(int i) {
i._parenthesizedTwice(0, (((x) {
x;
})));
}
testParenthesizedTwiceNamed(int i) {
i._parenthesizedTwiceNamed(
a: 0,
b: (((x) {
x;
})));
}
extension on int {
T _laterUnnamedParameter<T>(T x, void Function(T) y) => throw '';
void _laterUnnamedParameterDependsOnNamedParameter<T>(void Function(T) x, {required T a}) => throw '';
void _earlierUnnamedParameter<T>(void Function(T) x, T y) => throw '';
void _laterNamedParameter<T>({required T a, required void Function(T) b}) => throw '';
void _earlierNamedParameter<T>({required void Function(T) a, required T b}) => throw '';
void _earlierNamedParameterDependsOnUnnamedParameter<T>(T b, {required void Function(T) a}) => throw '';
U _propagateToReturnType<T, U>(T x, U Function(T) y) => throw '';
U _closureAsParameterType<T, U>(T x, U Function(T) y) => throw '';
U _propagateToEarlierClosure<T, U>(U Function(T) x, T Function() y) => throw '';
U _propagateToLaterClosure<T, U>(T Function() x, U Function(T) y) => throw '';
V _longDependencyChain<T, U, V>(T Function() x, U Function(T) y, V Function(U) z) => throw '';
Map<T, U> _dependencyCycle<T, U>(T Function(U) x, U Function(T) y) => throw '';
U _propagateFromContravariantReturnType<T, U>(void Function(T) Function() x, U Function(T) y) => throw '';
U _propagateToContravariantParameterType<T, U>(T Function() x, U Function(void Function(T)) y) => throw '';
void _returnTypeRefersToMultipleTypeVars<T, U>(
Map<T, U> Function() x, void Function(T) y, void Function(U) z) => throw '';
T _unnecessaryDueToNoDependency<T>(T Function() x, T y) => throw '';
T _unnecessaryDueToExplicitParameterTypeNamed<T>(T x, T Function({required T x, required int y}) y) => throw '';
void _parenthesized<T>(T x, void Function(T) y) => throw '';
void _parenthesizedNamed<T>({required T a, required void Function(T) b}) => throw '';
void _parenthesizedTwice<T>(T x, void Function(T) y) => throw '';
void _parenthesizedTwiceNamed<T>({required T a, required void Function(T) b}) => throw '';
}
main() {}

View file

@ -0,0 +1,68 @@
testLaterUnnamedParameter(int i) {}
testLaterUnnamedParameterDependsOnNamedParameter(int i) {}
testEarlierUnnamedParameter(int i) {}
testLaterNamedParameter(int i) {}
testEarlierNamedParameter(int i) {}
testEarlierNamedParameterDependsOnUnnamedParameter(int i) {}
testPropagateToReturnType(int i) {}
testClosureAsParameterType(int i) {}
testPropagateToEarlierClosure(int i) {}
testPropagateToLaterClosure(int i) {}
testLongDependencyChain(int i) {}
testDependencyCycle(int i) {}
testPropagateFromContravariantReturnType(int i) {}
testPropagateToContravariantParameterType(int i) {}
testReturnTypeRefersToMultipleTypeVars(int i) {}
testUnnecessaryDueToNoDependency(int i) {}
testUnnecessaryDueToExplicitParameterTypeNamed(int i) {}
testParenthesized(int i) {}
testParenthesizedNamed(int i) {}
testParenthesizedTwice(int i) {}
testParenthesizedTwiceNamed(int i) {}
extension on int {
T _laterUnnamedParameter<T>(T x, void Function(T) y) => throw '';
void _laterUnnamedParameterDependsOnNamedParameter<T>(void Function(T) x,
{required T a}) =>
throw '';
void _earlierUnnamedParameter<T>(void Function(T) x, T y) => throw '';
void _laterNamedParameter<T>({required T a, required void Function(T) b}) =>
throw '';
void _earlierNamedParameter<T>({required void Function(T) a, required T b}) =>
throw '';
void _earlierNamedParameterDependsOnUnnamedParameter<T>(T b,
{required void Function(T) a}) =>
throw '';
U _propagateToReturnType<T, U>(T x, U Function(T) y) => throw '';
U _closureAsParameterType<T, U>(T x, U Function(T) y) => throw '';
U _propagateToEarlierClosure<T, U>(U Function(T) x, T Function() y) =>
throw '';
U _propagateToLaterClosure<T, U>(T Function() x, U Function(T) y) => throw '';
V _longDependencyChain<T, U, V>(
T Function() x, U Function(T) y, V Function(U) z) =>
throw '';
Map<T, U> _dependencyCycle<T, U>(T Function(U) x, U Function(T) y) =>
throw '';
U _propagateFromContravariantReturnType<T, U>(
void Function(T) Function() x, U Function(T) y) =>
throw '';
U _propagateToContravariantParameterType<T, U>(
T Function() x, U Function(void Function(T)) y) =>
throw '';
void _returnTypeRefersToMultipleTypeVars<T, U>(
Map<T, U> Function() x, void Function(T) y, void Function(U) z) =>
throw '';
T _unnecessaryDueToNoDependency<T>(T Function() x, T y) => throw '';
T _unnecessaryDueToExplicitParameterTypeNamed<T>(
T x, T Function({required T x, required int y}) y) =>
throw '';
void _parenthesized<T>(T x, void Function(T) y) => throw '';
void _parenthesizedNamed<T>({required T a, required void Function(T) b}) =>
throw '';
void _parenthesizedTwice<T>(T x, void Function(T) y) => throw '';
void _parenthesizedTwiceNamed<T>(
{required T a, required void Function(T) b}) =>
throw '';
}
main() {}

View file

@ -0,0 +1,67 @@
extension on int {
Map<T, U> _dependencyCycle<T, U>(T Function(U) x, U Function(T) y) =>
throw '';
T _laterUnnamedParameter<T>(T x, void Function(T) y) => throw '';
T _unnecessaryDueToExplicitParameterTypeNamed<T>(
T x, T Function({required T x, required int y}) y) =>
throw '';
T _unnecessaryDueToNoDependency<T>(T Function() x, T y) => throw '';
U _closureAsParameterType<T, U>(T x, U Function(T) y) => throw '';
U _propagateFromContravariantReturnType<T, U>(
void Function(T) Function() x, U Function(T) y) =>
throw '';
U _propagateToContravariantParameterType<T, U>(
T Function() x, U Function(void Function(T)) y) =>
throw '';
U _propagateToEarlierClosure<T, U>(U Function(T) x, T Function() y) =>
throw '';
U _propagateToLaterClosure<T, U>(T Function() x, U Function(T) y) => throw '';
U _propagateToReturnType<T, U>(T x, U Function(T) y) => throw '';
V _longDependencyChain<T, U, V>(
T Function() x, U Function(T) y, V Function(U) z) =>
throw '';
void _earlierNamedParameter<T>({required void Function(T) a, required T b}) =>
throw '';
void _earlierNamedParameterDependsOnUnnamedParameter<T>(T b,
{required void Function(T) a}) =>
throw '';
void _earlierUnnamedParameter<T>(void Function(T) x, T y) => throw '';
void _laterNamedParameter<T>({required T a, required void Function(T) b}) =>
throw '';
void _laterUnnamedParameterDependsOnNamedParameter<T>(void Function(T) x,
{required T a}) =>
throw '';
void _parenthesized<T>(T x, void Function(T) y) => throw '';
void _parenthesizedNamed<T>({required T a, required void Function(T) b}) =>
throw '';
void _parenthesizedTwice<T>(T x, void Function(T) y) => throw '';
void _parenthesizedTwiceNamed<T>(
{required T a, required void Function(T) b}) =>
throw '';
void _returnTypeRefersToMultipleTypeVars<T, U>(
Map<T, U> Function() x, void Function(T) y, void Function(U) z) =>
throw '';
}
main() {}
testClosureAsParameterType(int i) {}
testDependencyCycle(int i) {}
testEarlierNamedParameter(int i) {}
testEarlierNamedParameterDependsOnUnnamedParameter(int i) {}
testEarlierUnnamedParameter(int i) {}
testLaterNamedParameter(int i) {}
testLaterUnnamedParameter(int i) {}
testLaterUnnamedParameterDependsOnNamedParameter(int i) {}
testLongDependencyChain(int i) {}
testParenthesized(int i) {}
testParenthesizedNamed(int i) {}
testParenthesizedTwice(int i) {}
testParenthesizedTwiceNamed(int i) {}
testPropagateFromContravariantReturnType(int i) {}
testPropagateToContravariantParameterType(int i) {}
testPropagateToEarlierClosure(int i) {}
testPropagateToLaterClosure(int i) {}
testPropagateToReturnType(int i) {}
testReturnTypeRefersToMultipleTypeVars(int i) {}
testUnnecessaryDueToExplicitParameterTypeNamed(int i) {}
testUnnecessaryDueToNoDependency(int i) {}

View file

@ -0,0 +1,232 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:collection" as col;
extension _extension#0 on core::int {
method _laterUnnamedParameter = self::_extension#0|_laterUnnamedParameter;
tearoff _laterUnnamedParameter = self::_extension#0|get#_laterUnnamedParameter;
method _laterUnnamedParameterDependsOnNamedParameter = self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter;
tearoff _laterUnnamedParameterDependsOnNamedParameter = self::_extension#0|get#_laterUnnamedParameterDependsOnNamedParameter;
method _earlierUnnamedParameter = self::_extension#0|_earlierUnnamedParameter;
tearoff _earlierUnnamedParameter = self::_extension#0|get#_earlierUnnamedParameter;
method _laterNamedParameter = self::_extension#0|_laterNamedParameter;
tearoff _laterNamedParameter = self::_extension#0|get#_laterNamedParameter;
method _earlierNamedParameter = self::_extension#0|_earlierNamedParameter;
tearoff _earlierNamedParameter = self::_extension#0|get#_earlierNamedParameter;
method _earlierNamedParameterDependsOnUnnamedParameter = self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter;
tearoff _earlierNamedParameterDependsOnUnnamedParameter = self::_extension#0|get#_earlierNamedParameterDependsOnUnnamedParameter;
method _propagateToReturnType = self::_extension#0|_propagateToReturnType;
tearoff _propagateToReturnType = self::_extension#0|get#_propagateToReturnType;
method _closureAsParameterType = self::_extension#0|_closureAsParameterType;
tearoff _closureAsParameterType = self::_extension#0|get#_closureAsParameterType;
method _propagateToEarlierClosure = self::_extension#0|_propagateToEarlierClosure;
tearoff _propagateToEarlierClosure = self::_extension#0|get#_propagateToEarlierClosure;
method _propagateToLaterClosure = self::_extension#0|_propagateToLaterClosure;
tearoff _propagateToLaterClosure = self::_extension#0|get#_propagateToLaterClosure;
method _longDependencyChain = self::_extension#0|_longDependencyChain;
tearoff _longDependencyChain = self::_extension#0|get#_longDependencyChain;
method _dependencyCycle = self::_extension#0|_dependencyCycle;
tearoff _dependencyCycle = self::_extension#0|get#_dependencyCycle;
method _propagateFromContravariantReturnType = self::_extension#0|_propagateFromContravariantReturnType;
tearoff _propagateFromContravariantReturnType = self::_extension#0|get#_propagateFromContravariantReturnType;
method _propagateToContravariantParameterType = self::_extension#0|_propagateToContravariantParameterType;
tearoff _propagateToContravariantParameterType = self::_extension#0|get#_propagateToContravariantParameterType;
method _returnTypeRefersToMultipleTypeVars = self::_extension#0|_returnTypeRefersToMultipleTypeVars;
tearoff _returnTypeRefersToMultipleTypeVars = self::_extension#0|get#_returnTypeRefersToMultipleTypeVars;
method _unnecessaryDueToNoDependency = self::_extension#0|_unnecessaryDueToNoDependency;
tearoff _unnecessaryDueToNoDependency = self::_extension#0|get#_unnecessaryDueToNoDependency;
method _unnecessaryDueToExplicitParameterTypeNamed = self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed;
tearoff _unnecessaryDueToExplicitParameterTypeNamed = self::_extension#0|get#_unnecessaryDueToExplicitParameterTypeNamed;
method _parenthesized = self::_extension#0|_parenthesized;
tearoff _parenthesized = self::_extension#0|get#_parenthesized;
method _parenthesizedNamed = self::_extension#0|_parenthesizedNamed;
tearoff _parenthesizedNamed = self::_extension#0|get#_parenthesizedNamed;
method _parenthesizedTwice = self::_extension#0|_parenthesizedTwice;
tearoff _parenthesizedTwice = self::_extension#0|get#_parenthesizedTwice;
method _parenthesizedTwiceNamed = self::_extension#0|_parenthesizedTwiceNamed;
tearoff _parenthesizedTwiceNamed = self::_extension#0|get#_parenthesizedTwiceNamed;
}
static method testLaterUnnamedParameter(core::int i) → dynamic {
self::_extension#0|_laterUnnamedParameter<core::int>(i, 0, (core::int x) → void {
x;
});
}
static method testLaterUnnamedParameterDependsOnNamedParameter(core::int i) → dynamic {
self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<core::int>(i, (core::int x) → void {
x;
}, a: 0);
}
static method testEarlierUnnamedParameter(core::int i) → dynamic {
self::_extension#0|_earlierUnnamedParameter<core::int>(i, (core::int x) → void {
x;
}, 0);
}
static method testLaterNamedParameter(core::int i) → dynamic {
self::_extension#0|_laterNamedParameter<core::int>(i, a: 0, b: (core::int x) → void {
x;
});
}
static method testEarlierNamedParameter(core::int i) → dynamic {
self::_extension#0|_earlierNamedParameter<core::int>(i, a: (core::int x) → void {
x;
}, b: 0);
}
static method testEarlierNamedParameterDependsOnUnnamedParameter(core::int i) → dynamic {
self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<core::int>(i, 0, a: (core::int x) → void {
x;
});
}
static method testPropagateToReturnType(core::int i) → dynamic {
self::_extension#0|_propagateToReturnType<core::int, core::List<core::int>>(i, 0, (core::int x) → core::List<core::int> => <core::int>[x]);
}
static method testClosureAsParameterType(core::int i) → dynamic {
self::_extension#0|_closureAsParameterType<() → core::int, core::List<core::int>>(i, () → core::int => 0, (() → core::int h) → core::List<core::int> => <core::int>[h(){() → core::int}]);
}
static method testPropagateToEarlierClosure(core::int i) → dynamic {
self::_extension#0|_propagateToEarlierClosure<core::int, core::List<core::int>>(i, (core::int x) → core::List<core::int> => <core::int>[x], () → core::int => 0);
}
static method testPropagateToLaterClosure(core::int i) → dynamic {
self::_extension#0|_propagateToLaterClosure<core::int, core::List<core::int>>(i, () → core::int => 0, (core::int x) → core::List<core::int> => <core::int>[x]);
}
static method testLongDependencyChain(core::int i) → dynamic {
self::_extension#0|_longDependencyChain<core::List<core::int>, core::int, core::Set<core::int>>(i, () → core::List<core::int> => <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> #t1 = col::LinkedHashSet::•<core::int>();
#t1.{core::Set::add}{Invariant}(y){(core::int) → core::bool};
} =>#t1);
}
static method testDependencyCycle(core::int i) → dynamic {
self::_extension#0|_dependencyCycle<core::List<core::Object?>, core::Set<core::Object?>>(i, (core::Object? x) → core::List<core::Object?> => <core::Object?>[x], (core::Object? y) → core::Set<core::Object?> => block {
final core::Set<core::Object?> #t2 = col::LinkedHashSet::•<core::Object?>();
#t2.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool};
} =>#t2);
}
static method testPropagateFromContravariantReturnType(core::int i) → dynamic {
self::_extension#0|_propagateFromContravariantReturnType<core::int, core::List<core::int>>(i, () → (core::int) → void => (core::int i) → void {}, (core::int x) → core::List<core::int> => <core::int>[x]);
}
static method testPropagateToContravariantParameterType(core::int i) → dynamic {
self::_extension#0|_propagateToContravariantParameterType<core::int, core::List<(core::int) → void>>(i, () → core::int => 0, ((core::int) → void x) → core::List<(core::int) → void> => <(core::int) → void>[x]);
}
static method testReturnTypeRefersToMultipleTypeVars(core::int i) → dynamic {
self::_extension#0|_returnTypeRefersToMultipleTypeVars<core::int, core::String>(i, () → core::Map<core::int, core::String> => <core::int, core::String>{0: ""}, (core::int k) → void {
k;
}, (core::String v) → void {
v;
});
}
static method testUnnecessaryDueToNoDependency(core::int i) → dynamic {
self::_extension#0|_unnecessaryDueToNoDependency<core::int?>(i, () → core::int => 0, null);
}
static method testUnnecessaryDueToExplicitParameterTypeNamed(core::int i) → dynamic {
core::int? a = self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed<core::int?>(i, null, ({core::int? x = #C1, required core::int y = #C1}) → core::int => (let final core::int? #t3 = x in #t3 == null ?{core::int} 0 : #t3{core::int}).{core::num::+}(y){(core::num) → core::int});
a;
}
static method testParenthesized(core::int i) → dynamic {
self::_extension#0|_parenthesized<core::int>(i, 0, (core::int x) → void {
x;
});
}
static method testParenthesizedNamed(core::int i) → dynamic {
self::_extension#0|_parenthesizedNamed<core::int>(i, a: 0, b: (core::int x) → void {
x;
});
}
static method testParenthesizedTwice(core::int i) → dynamic {
self::_extension#0|_parenthesizedTwice<core::int>(i, 0, (core::int x) → void {
x;
});
}
static method testParenthesizedTwiceNamed(core::int i) → dynamic {
self::_extension#0|_parenthesizedTwiceNamed<core::int>(i, a: 0, b: (core::int x) → void {
x;
});
}
static method _extension#0|_laterUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_laterUnnamedParameter::T% x, (self::_extension#0|_laterUnnamedParameter::T%) → void y) → self::_extension#0|_laterUnnamedParameter::T%
return throw "";
static method _extension#0|get#_laterUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, (T%) → void) → T%
return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → T% => self::_extension#0|_laterUnnamedParameter<T%>(#this, x, y);
static method _extension#0|_laterUnnamedParameterDependsOnNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter::T%) → void x, {required self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter::T% a = #C1}) → void
return throw "";
static method _extension#0|get#_laterUnnamedParameterDependsOnNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
return <T extends core::Object? = dynamic>((T%) → void x, {T% a = #C1}) → void => self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<T%>(#this, x, a: a);
static method _extension#0|_earlierUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_earlierUnnamedParameter::T%) → void x, self::_extension#0|_earlierUnnamedParameter::T% y) → void
return throw "";
static method _extension#0|get#_earlierUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, T%) → void
return <T extends core::Object? = dynamic>((T%) → void x, T% y) → void => self::_extension#0|_earlierUnnamedParameter<T%>(#this, x, y);
static method _extension#0|_laterNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_laterNamedParameter::T% a = #C1, required (self::_extension#0|_laterNamedParameter::T%) → void b = #C1}) → void
return throw "";
static method _extension#0|get#_laterNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
return <T extends core::Object? = dynamic>({T% a = #C1, (T%) → void b = #C1}) → void => self::_extension#0|_laterNamedParameter<T%>(#this, a: a, b: b);
static method _extension#0|_earlierNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, {required (self::_extension#0|_earlierNamedParameter::T%) → void a = #C1, required self::_extension#0|_earlierNamedParameter::T% b = #C1}) → void
return throw "";
static method _extension#0|get#_earlierNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: (T%) → void, b: T%}) → void
return <T extends core::Object? = dynamic>({(T%) → void a = #C1, T% b = #C1}) → void => self::_extension#0|_earlierNamedParameter<T%>(#this, a: a, b: b);
static method _extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter::T% b, {required (self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter::T%) → void a = #C1}) → void
return throw "";
static method _extension#0|get#_earlierNamedParameterDependsOnUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, {a: (T%) → void}) → void
return <T extends core::Object? = dynamic>(T% b, {(T%) → void a = #C1}) → void => self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T%>(#this, b, a: a);
static method _extension#0|_propagateToReturnType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_propagateToReturnType::T% x, (self::_extension#0|_propagateToReturnType::T%) → self::_extension#0|_propagateToReturnType::U% y) → self::_extension#0|_propagateToReturnType::U%
return throw "";
static method _extension#0|get#_propagateToReturnType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T%, (T%) → U%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T% x, (T%) → U% y) → U% => self::_extension#0|_propagateToReturnType<T%, U%>(#this, x, y);
static method _extension#0|_closureAsParameterType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_closureAsParameterType::T% x, (self::_extension#0|_closureAsParameterType::T%) → self::_extension#0|_closureAsParameterType::U% y) → self::_extension#0|_closureAsParameterType::U%
return throw "";
static method _extension#0|get#_closureAsParameterType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T%, (T%) → U%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T% x, (T%) → U% y) → U% => self::_extension#0|_closureAsParameterType<T%, U%>(#this, x, y);
static method _extension#0|_propagateToEarlierClosure<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_propagateToEarlierClosure::T%) → self::_extension#0|_propagateToEarlierClosure::U% x, () → self::_extension#0|_propagateToEarlierClosure::T% y) → self::_extension#0|_propagateToEarlierClosure::U%
return throw "";
static method _extension#0|get#_propagateToEarlierClosure(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>((T%) → U%, () → T%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>((T%) → U% x, () → T% y) → U% => self::_extension#0|_propagateToEarlierClosure<T%, U%>(#this, x, y);
static method _extension#0|_propagateToLaterClosure<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, () → self::_extension#0|_propagateToLaterClosure::T% x, (self::_extension#0|_propagateToLaterClosure::T%) → self::_extension#0|_propagateToLaterClosure::U% y) → self::_extension#0|_propagateToLaterClosure::U%
return throw "";
static method _extension#0|get#_propagateToLaterClosure(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → T%, (T%) → U%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → T% x, (T%) → U% y) → U% => self::_extension#0|_propagateToLaterClosure<T%, U%>(#this, x, y);
static method _extension#0|get#_longDependencyChain(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic, V extends core::Object? = dynamic>(() → T%, (T%) → U%, (U%) → V%) → V%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic, V extends core::Object? = dynamic>(() → T% x, (T%) → U% y, (U%) → V% z) → V% => self::_extension#0|_longDependencyChain<T%, U%, V%>(#this, x, y, z);
static method _extension#0|_longDependencyChain<T extends core::Object? = dynamic, U extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final core::int #this, () → self::_extension#0|_longDependencyChain::T% x, (self::_extension#0|_longDependencyChain::T%) → self::_extension#0|_longDependencyChain::U% y, (self::_extension#0|_longDependencyChain::U%) → self::_extension#0|_longDependencyChain::V% z) → self::_extension#0|_longDependencyChain::V%
return throw "";
static method _extension#0|_dependencyCycle<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_dependencyCycle::U%) → self::_extension#0|_dependencyCycle::T% x, (self::_extension#0|_dependencyCycle::T%) → self::_extension#0|_dependencyCycle::U% y) → core::Map<self::_extension#0|_dependencyCycle::T%, self::_extension#0|_dependencyCycle::U%>
return throw "";
static method _extension#0|get#_dependencyCycle(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>((U%) → T%, (T%) → U%) → core::Map<T%, U%>
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>((U%) → T% x, (T%) → U% y) → core::Map<T%, U%> => self::_extension#0|_dependencyCycle<T%, U%>(#this, x, y);
static method _extension#0|_propagateFromContravariantReturnType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, () → (self::_extension#0|_propagateFromContravariantReturnType::T%) → void x, (self::_extension#0|_propagateFromContravariantReturnType::T%) → self::_extension#0|_propagateFromContravariantReturnType::U% y) → self::_extension#0|_propagateFromContravariantReturnType::U%
return throw "";
static method _extension#0|get#_propagateFromContravariantReturnType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → (T%) → void, (T%) → U%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → (T%) → void x, (T%) → U% y) → U% => self::_extension#0|_propagateFromContravariantReturnType<T%, U%>(#this, x, y);
static method _extension#0|_propagateToContravariantParameterType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, () → self::_extension#0|_propagateToContravariantParameterType::T% x, ((self::_extension#0|_propagateToContravariantParameterType::T%) → void) → self::_extension#0|_propagateToContravariantParameterType::U% y) → self::_extension#0|_propagateToContravariantParameterType::U%
return throw "";
static method _extension#0|get#_propagateToContravariantParameterType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → T%, ((T%) → void) → U%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → T% x, ((T%) → void) → U% y) → U% => self::_extension#0|_propagateToContravariantParameterType<T%, U%>(#this, x, y);
static method _extension#0|_returnTypeRefersToMultipleTypeVars<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, () → core::Map<self::_extension#0|_returnTypeRefersToMultipleTypeVars::T%, self::_extension#0|_returnTypeRefersToMultipleTypeVars::U%> x, (self::_extension#0|_returnTypeRefersToMultipleTypeVars::T%) → void y, (self::_extension#0|_returnTypeRefersToMultipleTypeVars::U%) → void z) → void
return throw "";
static method _extension#0|get#_returnTypeRefersToMultipleTypeVars(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → core::Map<T%, U%>, (T%) → void, (U%) → void) → void
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → core::Map<T%, U%> x, (T%) → void y, (U%) → void z) → void => self::_extension#0|_returnTypeRefersToMultipleTypeVars<T%, U%>(#this, x, y, z);
static method _extension#0|_unnecessaryDueToNoDependency<T extends core::Object? = dynamic>(lowered final core::int #this, () → self::_extension#0|_unnecessaryDueToNoDependency::T% x, self::_extension#0|_unnecessaryDueToNoDependency::T% y) → self::_extension#0|_unnecessaryDueToNoDependency::T%
return throw "";
static method _extension#0|get#_unnecessaryDueToNoDependency(lowered final core::int #this) → <T extends core::Object? = dynamic>(() → T%, T%) → T%
return <T extends core::Object? = dynamic>(() → T% x, T% y) → T% => self::_extension#0|_unnecessaryDueToNoDependency<T%>(#this, x, y);
static method _extension#0|_unnecessaryDueToExplicitParameterTypeNamed<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed::T% x, ({required x: self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed::T%, required y: core::int}) → self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed::T% y) → self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed::T%
return throw "";
static method _extension#0|get#_unnecessaryDueToExplicitParameterTypeNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, ({required x: T%, required y: core::int}) → T%) → T%
return <T extends core::Object? = dynamic>(T% x, ({required x: T%, required y: core::int}) → T% y) → T% => self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed<T%>(#this, x, y);
static method _extension#0|_parenthesized<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_parenthesized::T% x, (self::_extension#0|_parenthesized::T%) → void y) → void
return throw "";
static method _extension#0|get#_parenthesized(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, (T%) → void) → void
return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → void => self::_extension#0|_parenthesized<T%>(#this, x, y);
static method _extension#0|_parenthesizedNamed<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_parenthesizedNamed::T% a = #C1, required (self::_extension#0|_parenthesizedNamed::T%) → void b = #C1}) → void
return throw "";
static method _extension#0|get#_parenthesizedNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
return <T extends core::Object? = dynamic>({T% a = #C1, (T%) → void b = #C1}) → void => self::_extension#0|_parenthesizedNamed<T%>(#this, a: a, b: b);
static method _extension#0|_parenthesizedTwice<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_parenthesizedTwice::T% x, (self::_extension#0|_parenthesizedTwice::T%) → void y) → void
return throw "";
static method _extension#0|get#_parenthesizedTwice(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, (T%) → void) → void
return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → void => self::_extension#0|_parenthesizedTwice<T%>(#this, x, y);
static method _extension#0|_parenthesizedTwiceNamed<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_parenthesizedTwiceNamed::T% a = #C1, required (self::_extension#0|_parenthesizedTwiceNamed::T%) → void b = #C1}) → void
return throw "";
static method _extension#0|get#_parenthesizedTwiceNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
return <T extends core::Object? = dynamic>({T% a = #C1, (T%) → void b = #C1}) → void => self::_extension#0|_parenthesizedTwiceNamed<T%>(#this, a: a, b: b);
static method main() → dynamic {}
constants {
#C1 = null
}

View file

@ -0,0 +1,232 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:collection" as col;
extension _extension#0 on core::int {
method _laterUnnamedParameter = self::_extension#0|_laterUnnamedParameter;
tearoff _laterUnnamedParameter = self::_extension#0|get#_laterUnnamedParameter;
method _laterUnnamedParameterDependsOnNamedParameter = self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter;
tearoff _laterUnnamedParameterDependsOnNamedParameter = self::_extension#0|get#_laterUnnamedParameterDependsOnNamedParameter;
method _earlierUnnamedParameter = self::_extension#0|_earlierUnnamedParameter;
tearoff _earlierUnnamedParameter = self::_extension#0|get#_earlierUnnamedParameter;
method _laterNamedParameter = self::_extension#0|_laterNamedParameter;
tearoff _laterNamedParameter = self::_extension#0|get#_laterNamedParameter;
method _earlierNamedParameter = self::_extension#0|_earlierNamedParameter;
tearoff _earlierNamedParameter = self::_extension#0|get#_earlierNamedParameter;
method _earlierNamedParameterDependsOnUnnamedParameter = self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter;
tearoff _earlierNamedParameterDependsOnUnnamedParameter = self::_extension#0|get#_earlierNamedParameterDependsOnUnnamedParameter;
method _propagateToReturnType = self::_extension#0|_propagateToReturnType;
tearoff _propagateToReturnType = self::_extension#0|get#_propagateToReturnType;
method _closureAsParameterType = self::_extension#0|_closureAsParameterType;
tearoff _closureAsParameterType = self::_extension#0|get#_closureAsParameterType;
method _propagateToEarlierClosure = self::_extension#0|_propagateToEarlierClosure;
tearoff _propagateToEarlierClosure = self::_extension#0|get#_propagateToEarlierClosure;
method _propagateToLaterClosure = self::_extension#0|_propagateToLaterClosure;
tearoff _propagateToLaterClosure = self::_extension#0|get#_propagateToLaterClosure;
method _longDependencyChain = self::_extension#0|_longDependencyChain;
tearoff _longDependencyChain = self::_extension#0|get#_longDependencyChain;
method _dependencyCycle = self::_extension#0|_dependencyCycle;
tearoff _dependencyCycle = self::_extension#0|get#_dependencyCycle;
method _propagateFromContravariantReturnType = self::_extension#0|_propagateFromContravariantReturnType;
tearoff _propagateFromContravariantReturnType = self::_extension#0|get#_propagateFromContravariantReturnType;
method _propagateToContravariantParameterType = self::_extension#0|_propagateToContravariantParameterType;
tearoff _propagateToContravariantParameterType = self::_extension#0|get#_propagateToContravariantParameterType;
method _returnTypeRefersToMultipleTypeVars = self::_extension#0|_returnTypeRefersToMultipleTypeVars;
tearoff _returnTypeRefersToMultipleTypeVars = self::_extension#0|get#_returnTypeRefersToMultipleTypeVars;
method _unnecessaryDueToNoDependency = self::_extension#0|_unnecessaryDueToNoDependency;
tearoff _unnecessaryDueToNoDependency = self::_extension#0|get#_unnecessaryDueToNoDependency;
method _unnecessaryDueToExplicitParameterTypeNamed = self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed;
tearoff _unnecessaryDueToExplicitParameterTypeNamed = self::_extension#0|get#_unnecessaryDueToExplicitParameterTypeNamed;
method _parenthesized = self::_extension#0|_parenthesized;
tearoff _parenthesized = self::_extension#0|get#_parenthesized;
method _parenthesizedNamed = self::_extension#0|_parenthesizedNamed;
tearoff _parenthesizedNamed = self::_extension#0|get#_parenthesizedNamed;
method _parenthesizedTwice = self::_extension#0|_parenthesizedTwice;
tearoff _parenthesizedTwice = self::_extension#0|get#_parenthesizedTwice;
method _parenthesizedTwiceNamed = self::_extension#0|_parenthesizedTwiceNamed;
tearoff _parenthesizedTwiceNamed = self::_extension#0|get#_parenthesizedTwiceNamed;
}
static method testLaterUnnamedParameter(core::int i) → dynamic {
self::_extension#0|_laterUnnamedParameter<core::int>(i, 0, (core::int x) → void {
x;
});
}
static method testLaterUnnamedParameterDependsOnNamedParameter(core::int i) → dynamic {
self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<core::int>(i, (core::int x) → void {
x;
}, a: 0);
}
static method testEarlierUnnamedParameter(core::int i) → dynamic {
self::_extension#0|_earlierUnnamedParameter<core::int>(i, (core::int x) → void {
x;
}, 0);
}
static method testLaterNamedParameter(core::int i) → dynamic {
self::_extension#0|_laterNamedParameter<core::int>(i, a: 0, b: (core::int x) → void {
x;
});
}
static method testEarlierNamedParameter(core::int i) → dynamic {
self::_extension#0|_earlierNamedParameter<core::int>(i, a: (core::int x) → void {
x;
}, b: 0);
}
static method testEarlierNamedParameterDependsOnUnnamedParameter(core::int i) → dynamic {
self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<core::int>(i, 0, a: (core::int x) → void {
x;
});
}
static method testPropagateToReturnType(core::int i) → dynamic {
self::_extension#0|_propagateToReturnType<core::int, core::List<core::int>>(i, 0, (core::int x) → core::List<core::int> => <core::int>[x]);
}
static method testClosureAsParameterType(core::int i) → dynamic {
self::_extension#0|_closureAsParameterType<() → core::int, core::List<core::int>>(i, () → core::int => 0, (() → core::int h) → core::List<core::int> => <core::int>[h(){() → core::int}]);
}
static method testPropagateToEarlierClosure(core::int i) → dynamic {
self::_extension#0|_propagateToEarlierClosure<core::int, core::List<core::int>>(i, (core::int x) → core::List<core::int> => <core::int>[x], () → core::int => 0);
}
static method testPropagateToLaterClosure(core::int i) → dynamic {
self::_extension#0|_propagateToLaterClosure<core::int, core::List<core::int>>(i, () → core::int => 0, (core::int x) → core::List<core::int> => <core::int>[x]);
}
static method testLongDependencyChain(core::int i) → dynamic {
self::_extension#0|_longDependencyChain<core::List<core::int>, core::int, core::Set<core::int>>(i, () → core::List<core::int> => <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> #t1 = col::LinkedHashSet::•<core::int>();
#t1.{core::Set::add}{Invariant}(y){(core::int) → core::bool};
} =>#t1);
}
static method testDependencyCycle(core::int i) → dynamic {
self::_extension#0|_dependencyCycle<core::List<core::Object?>, core::Set<core::Object?>>(i, (core::Object? x) → core::List<core::Object?> => <core::Object?>[x], (core::Object? y) → core::Set<core::Object?> => block {
final core::Set<core::Object?> #t2 = col::LinkedHashSet::•<core::Object?>();
#t2.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool};
} =>#t2);
}
static method testPropagateFromContravariantReturnType(core::int i) → dynamic {
self::_extension#0|_propagateFromContravariantReturnType<core::int, core::List<core::int>>(i, () → (core::int) → void => (core::int i) → void {}, (core::int x) → core::List<core::int> => <core::int>[x]);
}
static method testPropagateToContravariantParameterType(core::int i) → dynamic {
self::_extension#0|_propagateToContravariantParameterType<core::int, core::List<(core::int) → void>>(i, () → core::int => 0, ((core::int) → void x) → core::List<(core::int) → void> => <(core::int) → void>[x]);
}
static method testReturnTypeRefersToMultipleTypeVars(core::int i) → dynamic {
self::_extension#0|_returnTypeRefersToMultipleTypeVars<core::int, core::String>(i, () → core::Map<core::int, core::String> => <core::int, core::String>{0: ""}, (core::int k) → void {
k;
}, (core::String v) → void {
v;
});
}
static method testUnnecessaryDueToNoDependency(core::int i) → dynamic {
self::_extension#0|_unnecessaryDueToNoDependency<core::int?>(i, () → core::int => 0, null);
}
static method testUnnecessaryDueToExplicitParameterTypeNamed(core::int i) → dynamic {
core::int? a = self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed<core::int?>(i, null, ({core::int? x = #C1, required core::int y = #C1}) → core::int => (let final core::int? #t3 = x in #t3 == null ?{core::int} 0 : #t3{core::int}).{core::num::+}(y){(core::num) → core::int});
a;
}
static method testParenthesized(core::int i) → dynamic {
self::_extension#0|_parenthesized<core::int>(i, 0, (core::int x) → void {
x;
});
}
static method testParenthesizedNamed(core::int i) → dynamic {
self::_extension#0|_parenthesizedNamed<core::int>(i, a: 0, b: (core::int x) → void {
x;
});
}
static method testParenthesizedTwice(core::int i) → dynamic {
self::_extension#0|_parenthesizedTwice<core::int>(i, 0, (core::int x) → void {
x;
});
}
static method testParenthesizedTwiceNamed(core::int i) → dynamic {
self::_extension#0|_parenthesizedTwiceNamed<core::int>(i, a: 0, b: (core::int x) → void {
x;
});
}
static method _extension#0|_laterUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_laterUnnamedParameter::T% x, (self::_extension#0|_laterUnnamedParameter::T%) → void y) → self::_extension#0|_laterUnnamedParameter::T%
return throw "";
static method _extension#0|get#_laterUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, (T%) → void) → T%
return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → T% => self::_extension#0|_laterUnnamedParameter<T%>(#this, x, y);
static method _extension#0|_laterUnnamedParameterDependsOnNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter::T%) → void x, {required self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter::T% a = #C1}) → void
return throw "";
static method _extension#0|get#_laterUnnamedParameterDependsOnNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
return <T extends core::Object? = dynamic>((T%) → void x, {T% a = #C1}) → void => self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<T%>(#this, x, a: a);
static method _extension#0|_earlierUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_earlierUnnamedParameter::T%) → void x, self::_extension#0|_earlierUnnamedParameter::T% y) → void
return throw "";
static method _extension#0|get#_earlierUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, T%) → void
return <T extends core::Object? = dynamic>((T%) → void x, T% y) → void => self::_extension#0|_earlierUnnamedParameter<T%>(#this, x, y);
static method _extension#0|_laterNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_laterNamedParameter::T% a = #C1, required (self::_extension#0|_laterNamedParameter::T%) → void b = #C1}) → void
return throw "";
static method _extension#0|get#_laterNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
return <T extends core::Object? = dynamic>({T% a = #C1, (T%) → void b = #C1}) → void => self::_extension#0|_laterNamedParameter<T%>(#this, a: a, b: b);
static method _extension#0|_earlierNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, {required (self::_extension#0|_earlierNamedParameter::T%) → void a = #C1, required self::_extension#0|_earlierNamedParameter::T% b = #C1}) → void
return throw "";
static method _extension#0|get#_earlierNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: (T%) → void, b: T%}) → void
return <T extends core::Object? = dynamic>({(T%) → void a = #C1, T% b = #C1}) → void => self::_extension#0|_earlierNamedParameter<T%>(#this, a: a, b: b);
static method _extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter::T% b, {required (self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter::T%) → void a = #C1}) → void
return throw "";
static method _extension#0|get#_earlierNamedParameterDependsOnUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, {a: (T%) → void}) → void
return <T extends core::Object? = dynamic>(T% b, {(T%) → void a = #C1}) → void => self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T%>(#this, b, a: a);
static method _extension#0|_propagateToReturnType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_propagateToReturnType::T% x, (self::_extension#0|_propagateToReturnType::T%) → self::_extension#0|_propagateToReturnType::U% y) → self::_extension#0|_propagateToReturnType::U%
return throw "";
static method _extension#0|get#_propagateToReturnType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T%, (T%) → U%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T% x, (T%) → U% y) → U% => self::_extension#0|_propagateToReturnType<T%, U%>(#this, x, y);
static method _extension#0|_closureAsParameterType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_closureAsParameterType::T% x, (self::_extension#0|_closureAsParameterType::T%) → self::_extension#0|_closureAsParameterType::U% y) → self::_extension#0|_closureAsParameterType::U%
return throw "";
static method _extension#0|get#_closureAsParameterType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T%, (T%) → U%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T% x, (T%) → U% y) → U% => self::_extension#0|_closureAsParameterType<T%, U%>(#this, x, y);
static method _extension#0|_propagateToEarlierClosure<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_propagateToEarlierClosure::T%) → self::_extension#0|_propagateToEarlierClosure::U% x, () → self::_extension#0|_propagateToEarlierClosure::T% y) → self::_extension#0|_propagateToEarlierClosure::U%
return throw "";
static method _extension#0|get#_propagateToEarlierClosure(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>((T%) → U%, () → T%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>((T%) → U% x, () → T% y) → U% => self::_extension#0|_propagateToEarlierClosure<T%, U%>(#this, x, y);
static method _extension#0|_propagateToLaterClosure<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, () → self::_extension#0|_propagateToLaterClosure::T% x, (self::_extension#0|_propagateToLaterClosure::T%) → self::_extension#0|_propagateToLaterClosure::U% y) → self::_extension#0|_propagateToLaterClosure::U%
return throw "";
static method _extension#0|get#_propagateToLaterClosure(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → T%, (T%) → U%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → T% x, (T%) → U% y) → U% => self::_extension#0|_propagateToLaterClosure<T%, U%>(#this, x, y);
static method _extension#0|get#_longDependencyChain(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic, V extends core::Object? = dynamic>(() → T%, (T%) → U%, (U%) → V%) → V%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic, V extends core::Object? = dynamic>(() → T% x, (T%) → U% y, (U%) → V% z) → V% => self::_extension#0|_longDependencyChain<T%, U%, V%>(#this, x, y, z);
static method _extension#0|_longDependencyChain<T extends core::Object? = dynamic, U extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final core::int #this, () → self::_extension#0|_longDependencyChain::T% x, (self::_extension#0|_longDependencyChain::T%) → self::_extension#0|_longDependencyChain::U% y, (self::_extension#0|_longDependencyChain::U%) → self::_extension#0|_longDependencyChain::V% z) → self::_extension#0|_longDependencyChain::V%
return throw "";
static method _extension#0|_dependencyCycle<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_dependencyCycle::U%) → self::_extension#0|_dependencyCycle::T% x, (self::_extension#0|_dependencyCycle::T%) → self::_extension#0|_dependencyCycle::U% y) → core::Map<self::_extension#0|_dependencyCycle::T%, self::_extension#0|_dependencyCycle::U%>
return throw "";
static method _extension#0|get#_dependencyCycle(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>((U%) → T%, (T%) → U%) → core::Map<T%, U%>
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>((U%) → T% x, (T%) → U% y) → core::Map<T%, U%> => self::_extension#0|_dependencyCycle<T%, U%>(#this, x, y);
static method _extension#0|_propagateFromContravariantReturnType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, () → (self::_extension#0|_propagateFromContravariantReturnType::T%) → void x, (self::_extension#0|_propagateFromContravariantReturnType::T%) → self::_extension#0|_propagateFromContravariantReturnType::U% y) → self::_extension#0|_propagateFromContravariantReturnType::U%
return throw "";
static method _extension#0|get#_propagateFromContravariantReturnType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → (T%) → void, (T%) → U%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → (T%) → void x, (T%) → U% y) → U% => self::_extension#0|_propagateFromContravariantReturnType<T%, U%>(#this, x, y);
static method _extension#0|_propagateToContravariantParameterType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, () → self::_extension#0|_propagateToContravariantParameterType::T% x, ((self::_extension#0|_propagateToContravariantParameterType::T%) → void) → self::_extension#0|_propagateToContravariantParameterType::U% y) → self::_extension#0|_propagateToContravariantParameterType::U%
return throw "";
static method _extension#0|get#_propagateToContravariantParameterType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → T%, ((T%) → void) → U%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → T% x, ((T%) → void) → U% y) → U% => self::_extension#0|_propagateToContravariantParameterType<T%, U%>(#this, x, y);
static method _extension#0|_returnTypeRefersToMultipleTypeVars<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, () → core::Map<self::_extension#0|_returnTypeRefersToMultipleTypeVars::T%, self::_extension#0|_returnTypeRefersToMultipleTypeVars::U%> x, (self::_extension#0|_returnTypeRefersToMultipleTypeVars::T%) → void y, (self::_extension#0|_returnTypeRefersToMultipleTypeVars::U%) → void z) → void
return throw "";
static method _extension#0|get#_returnTypeRefersToMultipleTypeVars(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → core::Map<T%, U%>, (T%) → void, (U%) → void) → void
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → core::Map<T%, U%> x, (T%) → void y, (U%) → void z) → void => self::_extension#0|_returnTypeRefersToMultipleTypeVars<T%, U%>(#this, x, y, z);
static method _extension#0|_unnecessaryDueToNoDependency<T extends core::Object? = dynamic>(lowered final core::int #this, () → self::_extension#0|_unnecessaryDueToNoDependency::T% x, self::_extension#0|_unnecessaryDueToNoDependency::T% y) → self::_extension#0|_unnecessaryDueToNoDependency::T%
return throw "";
static method _extension#0|get#_unnecessaryDueToNoDependency(lowered final core::int #this) → <T extends core::Object? = dynamic>(() → T%, T%) → T%
return <T extends core::Object? = dynamic>(() → T% x, T% y) → T% => self::_extension#0|_unnecessaryDueToNoDependency<T%>(#this, x, y);
static method _extension#0|_unnecessaryDueToExplicitParameterTypeNamed<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed::T% x, ({required x: self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed::T%, required y: core::int}) → self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed::T% y) → self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed::T%
return throw "";
static method _extension#0|get#_unnecessaryDueToExplicitParameterTypeNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, ({required x: T%, required y: core::int}) → T%) → T%
return <T extends core::Object? = dynamic>(T% x, ({required x: T%, required y: core::int}) → T% y) → T% => self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed<T%>(#this, x, y);
static method _extension#0|_parenthesized<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_parenthesized::T% x, (self::_extension#0|_parenthesized::T%) → void y) → void
return throw "";
static method _extension#0|get#_parenthesized(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, (T%) → void) → void
return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → void => self::_extension#0|_parenthesized<T%>(#this, x, y);
static method _extension#0|_parenthesizedNamed<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_parenthesizedNamed::T% a = #C1, required (self::_extension#0|_parenthesizedNamed::T%) → void b = #C1}) → void
return throw "";
static method _extension#0|get#_parenthesizedNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
return <T extends core::Object? = dynamic>({T% a = #C1, (T%) → void b = #C1}) → void => self::_extension#0|_parenthesizedNamed<T%>(#this, a: a, b: b);
static method _extension#0|_parenthesizedTwice<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_parenthesizedTwice::T% x, (self::_extension#0|_parenthesizedTwice::T%) → void y) → void
return throw "";
static method _extension#0|get#_parenthesizedTwice(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, (T%) → void) → void
return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → void => self::_extension#0|_parenthesizedTwice<T%>(#this, x, y);
static method _extension#0|_parenthesizedTwiceNamed<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_parenthesizedTwiceNamed::T% a = #C1, required (self::_extension#0|_parenthesizedTwiceNamed::T%) → void b = #C1}) → void
return throw "";
static method _extension#0|get#_parenthesizedTwiceNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
return <T extends core::Object? = dynamic>({T% a = #C1, (T%) → void b = #C1}) → void => self::_extension#0|_parenthesizedTwiceNamed<T%>(#this, a: a, b: b);
static method main() → dynamic {}
constants {
#C1 = null
}

View file

@ -0,0 +1,176 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
extension _extension#0 on core::int {
method _laterUnnamedParameter = self::_extension#0|_laterUnnamedParameter;
tearoff _laterUnnamedParameter = self::_extension#0|get#_laterUnnamedParameter;
method _laterUnnamedParameterDependsOnNamedParameter = self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter;
tearoff _laterUnnamedParameterDependsOnNamedParameter = self::_extension#0|get#_laterUnnamedParameterDependsOnNamedParameter;
method _earlierUnnamedParameter = self::_extension#0|_earlierUnnamedParameter;
tearoff _earlierUnnamedParameter = self::_extension#0|get#_earlierUnnamedParameter;
method _laterNamedParameter = self::_extension#0|_laterNamedParameter;
tearoff _laterNamedParameter = self::_extension#0|get#_laterNamedParameter;
method _earlierNamedParameter = self::_extension#0|_earlierNamedParameter;
tearoff _earlierNamedParameter = self::_extension#0|get#_earlierNamedParameter;
method _earlierNamedParameterDependsOnUnnamedParameter = self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter;
tearoff _earlierNamedParameterDependsOnUnnamedParameter = self::_extension#0|get#_earlierNamedParameterDependsOnUnnamedParameter;
method _propagateToReturnType = self::_extension#0|_propagateToReturnType;
tearoff _propagateToReturnType = self::_extension#0|get#_propagateToReturnType;
method _closureAsParameterType = self::_extension#0|_closureAsParameterType;
tearoff _closureAsParameterType = self::_extension#0|get#_closureAsParameterType;
method _propagateToEarlierClosure = self::_extension#0|_propagateToEarlierClosure;
tearoff _propagateToEarlierClosure = self::_extension#0|get#_propagateToEarlierClosure;
method _propagateToLaterClosure = self::_extension#0|_propagateToLaterClosure;
tearoff _propagateToLaterClosure = self::_extension#0|get#_propagateToLaterClosure;
method _longDependencyChain = self::_extension#0|_longDependencyChain;
tearoff _longDependencyChain = self::_extension#0|get#_longDependencyChain;
method _dependencyCycle = self::_extension#0|_dependencyCycle;
tearoff _dependencyCycle = self::_extension#0|get#_dependencyCycle;
method _propagateFromContravariantReturnType = self::_extension#0|_propagateFromContravariantReturnType;
tearoff _propagateFromContravariantReturnType = self::_extension#0|get#_propagateFromContravariantReturnType;
method _propagateToContravariantParameterType = self::_extension#0|_propagateToContravariantParameterType;
tearoff _propagateToContravariantParameterType = self::_extension#0|get#_propagateToContravariantParameterType;
method _returnTypeRefersToMultipleTypeVars = self::_extension#0|_returnTypeRefersToMultipleTypeVars;
tearoff _returnTypeRefersToMultipleTypeVars = self::_extension#0|get#_returnTypeRefersToMultipleTypeVars;
method _unnecessaryDueToNoDependency = self::_extension#0|_unnecessaryDueToNoDependency;
tearoff _unnecessaryDueToNoDependency = self::_extension#0|get#_unnecessaryDueToNoDependency;
method _unnecessaryDueToExplicitParameterTypeNamed = self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed;
tearoff _unnecessaryDueToExplicitParameterTypeNamed = self::_extension#0|get#_unnecessaryDueToExplicitParameterTypeNamed;
method _parenthesized = self::_extension#0|_parenthesized;
tearoff _parenthesized = self::_extension#0|get#_parenthesized;
method _parenthesizedNamed = self::_extension#0|_parenthesizedNamed;
tearoff _parenthesizedNamed = self::_extension#0|get#_parenthesizedNamed;
method _parenthesizedTwice = self::_extension#0|_parenthesizedTwice;
tearoff _parenthesizedTwice = self::_extension#0|get#_parenthesizedTwice;
method _parenthesizedTwiceNamed = self::_extension#0|_parenthesizedTwiceNamed;
tearoff _parenthesizedTwiceNamed = self::_extension#0|get#_parenthesizedTwiceNamed;
}
static method testLaterUnnamedParameter(core::int i) → dynamic
;
static method testLaterUnnamedParameterDependsOnNamedParameter(core::int i) → dynamic
;
static method testEarlierUnnamedParameter(core::int i) → dynamic
;
static method testLaterNamedParameter(core::int i) → dynamic
;
static method testEarlierNamedParameter(core::int i) → dynamic
;
static method testEarlierNamedParameterDependsOnUnnamedParameter(core::int i) → dynamic
;
static method testPropagateToReturnType(core::int i) → dynamic
;
static method testClosureAsParameterType(core::int i) → dynamic
;
static method testPropagateToEarlierClosure(core::int i) → dynamic
;
static method testPropagateToLaterClosure(core::int i) → dynamic
;
static method testLongDependencyChain(core::int i) → dynamic
;
static method testDependencyCycle(core::int i) → dynamic
;
static method testPropagateFromContravariantReturnType(core::int i) → dynamic
;
static method testPropagateToContravariantParameterType(core::int i) → dynamic
;
static method testReturnTypeRefersToMultipleTypeVars(core::int i) → dynamic
;
static method testUnnecessaryDueToNoDependency(core::int i) → dynamic
;
static method testUnnecessaryDueToExplicitParameterTypeNamed(core::int i) → dynamic
;
static method testParenthesized(core::int i) → dynamic
;
static method testParenthesizedNamed(core::int i) → dynamic
;
static method testParenthesizedTwice(core::int i) → dynamic
;
static method testParenthesizedTwiceNamed(core::int i) → dynamic
;
static method _extension#0|_laterUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_laterUnnamedParameter::T% x, (self::_extension#0|_laterUnnamedParameter::T%) → void y) → self::_extension#0|_laterUnnamedParameter::T%
;
static method _extension#0|get#_laterUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, (T%) → void) → T%
return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → T% => self::_extension#0|_laterUnnamedParameter<T%>(#this, x, y);
static method _extension#0|_laterUnnamedParameterDependsOnNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter::T%) → void x, {required self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter::T% a}) → void
;
static method _extension#0|get#_laterUnnamedParameterDependsOnNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
return <T extends core::Object? = dynamic>((T%) → void x, {T% a}) → void => self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<T%>(#this, x, a: a);
static method _extension#0|_earlierUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_earlierUnnamedParameter::T%) → void x, self::_extension#0|_earlierUnnamedParameter::T% y) → void
;
static method _extension#0|get#_earlierUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, T%) → void
return <T extends core::Object? = dynamic>((T%) → void x, T% y) → void => self::_extension#0|_earlierUnnamedParameter<T%>(#this, x, y);
static method _extension#0|_laterNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_laterNamedParameter::T% a, required (self::_extension#0|_laterNamedParameter::T%) → void b}) → void
;
static method _extension#0|get#_laterNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_laterNamedParameter<T%>(#this, a: a, b: b);
static method _extension#0|_earlierNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, {required (self::_extension#0|_earlierNamedParameter::T%) → void a, required self::_extension#0|_earlierNamedParameter::T% b}) → void
;
static method _extension#0|get#_earlierNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: (T%) → void, b: T%}) → void
return <T extends core::Object? = dynamic>({(T%) → void a, T% b}) → void => self::_extension#0|_earlierNamedParameter<T%>(#this, a: a, b: b);
static method _extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter::T% b, {required (self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter::T%) → void a}) → void
;
static method _extension#0|get#_earlierNamedParameterDependsOnUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, {a: (T%) → void}) → void
return <T extends core::Object? = dynamic>(T% b, {(T%) → void a}) → void => self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T%>(#this, b, a: a);
static method _extension#0|_propagateToReturnType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_propagateToReturnType::T% x, (self::_extension#0|_propagateToReturnType::T%) → self::_extension#0|_propagateToReturnType::U% y) → self::_extension#0|_propagateToReturnType::U%
;
static method _extension#0|get#_propagateToReturnType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T%, (T%) → U%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T% x, (T%) → U% y) → U% => self::_extension#0|_propagateToReturnType<T%, U%>(#this, x, y);
static method _extension#0|_closureAsParameterType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_closureAsParameterType::T% x, (self::_extension#0|_closureAsParameterType::T%) → self::_extension#0|_closureAsParameterType::U% y) → self::_extension#0|_closureAsParameterType::U%
;
static method _extension#0|get#_closureAsParameterType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T%, (T%) → U%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T% x, (T%) → U% y) → U% => self::_extension#0|_closureAsParameterType<T%, U%>(#this, x, y);
static method _extension#0|_propagateToEarlierClosure<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_propagateToEarlierClosure::T%) → self::_extension#0|_propagateToEarlierClosure::U% x, () → self::_extension#0|_propagateToEarlierClosure::T% y) → self::_extension#0|_propagateToEarlierClosure::U%
;
static method _extension#0|get#_propagateToEarlierClosure(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>((T%) → U%, () → T%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>((T%) → U% x, () → T% y) → U% => self::_extension#0|_propagateToEarlierClosure<T%, U%>(#this, x, y);
static method _extension#0|_propagateToLaterClosure<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, () → self::_extension#0|_propagateToLaterClosure::T% x, (self::_extension#0|_propagateToLaterClosure::T%) → self::_extension#0|_propagateToLaterClosure::U% y) → self::_extension#0|_propagateToLaterClosure::U%
;
static method _extension#0|get#_propagateToLaterClosure(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → T%, (T%) → U%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → T% x, (T%) → U% y) → U% => self::_extension#0|_propagateToLaterClosure<T%, U%>(#this, x, y);
static method _extension#0|get#_longDependencyChain(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic, V extends core::Object? = dynamic>(() → T%, (T%) → U%, (U%) → V%) → V%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic, V extends core::Object? = dynamic>(() → T% x, (T%) → U% y, (U%) → V% z) → V% => self::_extension#0|_longDependencyChain<T%, U%, V%>(#this, x, y, z);
static method _extension#0|_longDependencyChain<T extends core::Object? = dynamic, U extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final core::int #this, () → self::_extension#0|_longDependencyChain::T% x, (self::_extension#0|_longDependencyChain::T%) → self::_extension#0|_longDependencyChain::U% y, (self::_extension#0|_longDependencyChain::U%) → self::_extension#0|_longDependencyChain::V% z) → self::_extension#0|_longDependencyChain::V%
;
static method _extension#0|_dependencyCycle<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_dependencyCycle::U%) → self::_extension#0|_dependencyCycle::T% x, (self::_extension#0|_dependencyCycle::T%) → self::_extension#0|_dependencyCycle::U% y) → core::Map<self::_extension#0|_dependencyCycle::T%, self::_extension#0|_dependencyCycle::U%>
;
static method _extension#0|get#_dependencyCycle(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>((U%) → T%, (T%) → U%) → core::Map<T%, U%>
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>((U%) → T% x, (T%) → U% y) → core::Map<T%, U%> => self::_extension#0|_dependencyCycle<T%, U%>(#this, x, y);
static method _extension#0|_propagateFromContravariantReturnType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, () → (self::_extension#0|_propagateFromContravariantReturnType::T%) → void x, (self::_extension#0|_propagateFromContravariantReturnType::T%) → self::_extension#0|_propagateFromContravariantReturnType::U% y) → self::_extension#0|_propagateFromContravariantReturnType::U%
;
static method _extension#0|get#_propagateFromContravariantReturnType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → (T%) → void, (T%) → U%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → (T%) → void x, (T%) → U% y) → U% => self::_extension#0|_propagateFromContravariantReturnType<T%, U%>(#this, x, y);
static method _extension#0|_propagateToContravariantParameterType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, () → self::_extension#0|_propagateToContravariantParameterType::T% x, ((self::_extension#0|_propagateToContravariantParameterType::T%) → void) → self::_extension#0|_propagateToContravariantParameterType::U% y) → self::_extension#0|_propagateToContravariantParameterType::U%
;
static method _extension#0|get#_propagateToContravariantParameterType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → T%, ((T%) → void) → U%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → T% x, ((T%) → void) → U% y) → U% => self::_extension#0|_propagateToContravariantParameterType<T%, U%>(#this, x, y);
static method _extension#0|_returnTypeRefersToMultipleTypeVars<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, () → core::Map<self::_extension#0|_returnTypeRefersToMultipleTypeVars::T%, self::_extension#0|_returnTypeRefersToMultipleTypeVars::U%> x, (self::_extension#0|_returnTypeRefersToMultipleTypeVars::T%) → void y, (self::_extension#0|_returnTypeRefersToMultipleTypeVars::U%) → void z) → void
;
static method _extension#0|get#_returnTypeRefersToMultipleTypeVars(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → core::Map<T%, U%>, (T%) → void, (U%) → void) → void
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → core::Map<T%, U%> x, (T%) → void y, (U%) → void z) → void => self::_extension#0|_returnTypeRefersToMultipleTypeVars<T%, U%>(#this, x, y, z);
static method _extension#0|_unnecessaryDueToNoDependency<T extends core::Object? = dynamic>(lowered final core::int #this, () → self::_extension#0|_unnecessaryDueToNoDependency::T% x, self::_extension#0|_unnecessaryDueToNoDependency::T% y) → self::_extension#0|_unnecessaryDueToNoDependency::T%
;
static method _extension#0|get#_unnecessaryDueToNoDependency(lowered final core::int #this) → <T extends core::Object? = dynamic>(() → T%, T%) → T%
return <T extends core::Object? = dynamic>(() → T% x, T% y) → T% => self::_extension#0|_unnecessaryDueToNoDependency<T%>(#this, x, y);
static method _extension#0|_unnecessaryDueToExplicitParameterTypeNamed<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed::T% x, ({required x: self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed::T%, required y: core::int}) → self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed::T% y) → self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed::T%
;
static method _extension#0|get#_unnecessaryDueToExplicitParameterTypeNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, ({required x: T%, required y: core::int}) → T%) → T%
return <T extends core::Object? = dynamic>(T% x, ({required x: T%, required y: core::int}) → T% y) → T% => self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed<T%>(#this, x, y);
static method _extension#0|_parenthesized<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_parenthesized::T% x, (self::_extension#0|_parenthesized::T%) → void y) → void
;
static method _extension#0|get#_parenthesized(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, (T%) → void) → void
return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → void => self::_extension#0|_parenthesized<T%>(#this, x, y);
static method _extension#0|_parenthesizedNamed<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_parenthesizedNamed::T% a, required (self::_extension#0|_parenthesizedNamed::T%) → void b}) → void
;
static method _extension#0|get#_parenthesizedNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_parenthesizedNamed<T%>(#this, a: a, b: b);
static method _extension#0|_parenthesizedTwice<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_parenthesizedTwice::T% x, (self::_extension#0|_parenthesizedTwice::T%) → void y) → void
;
static method _extension#0|get#_parenthesizedTwice(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, (T%) → void) → void
return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → void => self::_extension#0|_parenthesizedTwice<T%>(#this, x, y);
static method _extension#0|_parenthesizedTwiceNamed<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_parenthesizedTwiceNamed::T% a, required (self::_extension#0|_parenthesizedTwiceNamed::T%) → void b}) → void
;
static method _extension#0|get#_parenthesizedTwiceNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
return <T extends core::Object? = dynamic>({T% a, (T%) → void b}) → void => self::_extension#0|_parenthesizedTwiceNamed<T%>(#this, a: a, b: b);
static method main() → dynamic
;

View file

@ -0,0 +1,232 @@
library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
import "dart:collection" as col;
extension _extension#0 on core::int {
method _laterUnnamedParameter = self::_extension#0|_laterUnnamedParameter;
tearoff _laterUnnamedParameter = self::_extension#0|get#_laterUnnamedParameter;
method _laterUnnamedParameterDependsOnNamedParameter = self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter;
tearoff _laterUnnamedParameterDependsOnNamedParameter = self::_extension#0|get#_laterUnnamedParameterDependsOnNamedParameter;
method _earlierUnnamedParameter = self::_extension#0|_earlierUnnamedParameter;
tearoff _earlierUnnamedParameter = self::_extension#0|get#_earlierUnnamedParameter;
method _laterNamedParameter = self::_extension#0|_laterNamedParameter;
tearoff _laterNamedParameter = self::_extension#0|get#_laterNamedParameter;
method _earlierNamedParameter = self::_extension#0|_earlierNamedParameter;
tearoff _earlierNamedParameter = self::_extension#0|get#_earlierNamedParameter;
method _earlierNamedParameterDependsOnUnnamedParameter = self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter;
tearoff _earlierNamedParameterDependsOnUnnamedParameter = self::_extension#0|get#_earlierNamedParameterDependsOnUnnamedParameter;
method _propagateToReturnType = self::_extension#0|_propagateToReturnType;
tearoff _propagateToReturnType = self::_extension#0|get#_propagateToReturnType;
method _closureAsParameterType = self::_extension#0|_closureAsParameterType;
tearoff _closureAsParameterType = self::_extension#0|get#_closureAsParameterType;
method _propagateToEarlierClosure = self::_extension#0|_propagateToEarlierClosure;
tearoff _propagateToEarlierClosure = self::_extension#0|get#_propagateToEarlierClosure;
method _propagateToLaterClosure = self::_extension#0|_propagateToLaterClosure;
tearoff _propagateToLaterClosure = self::_extension#0|get#_propagateToLaterClosure;
method _longDependencyChain = self::_extension#0|_longDependencyChain;
tearoff _longDependencyChain = self::_extension#0|get#_longDependencyChain;
method _dependencyCycle = self::_extension#0|_dependencyCycle;
tearoff _dependencyCycle = self::_extension#0|get#_dependencyCycle;
method _propagateFromContravariantReturnType = self::_extension#0|_propagateFromContravariantReturnType;
tearoff _propagateFromContravariantReturnType = self::_extension#0|get#_propagateFromContravariantReturnType;
method _propagateToContravariantParameterType = self::_extension#0|_propagateToContravariantParameterType;
tearoff _propagateToContravariantParameterType = self::_extension#0|get#_propagateToContravariantParameterType;
method _returnTypeRefersToMultipleTypeVars = self::_extension#0|_returnTypeRefersToMultipleTypeVars;
tearoff _returnTypeRefersToMultipleTypeVars = self::_extension#0|get#_returnTypeRefersToMultipleTypeVars;
method _unnecessaryDueToNoDependency = self::_extension#0|_unnecessaryDueToNoDependency;
tearoff _unnecessaryDueToNoDependency = self::_extension#0|get#_unnecessaryDueToNoDependency;
method _unnecessaryDueToExplicitParameterTypeNamed = self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed;
tearoff _unnecessaryDueToExplicitParameterTypeNamed = self::_extension#0|get#_unnecessaryDueToExplicitParameterTypeNamed;
method _parenthesized = self::_extension#0|_parenthesized;
tearoff _parenthesized = self::_extension#0|get#_parenthesized;
method _parenthesizedNamed = self::_extension#0|_parenthesizedNamed;
tearoff _parenthesizedNamed = self::_extension#0|get#_parenthesizedNamed;
method _parenthesizedTwice = self::_extension#0|_parenthesizedTwice;
tearoff _parenthesizedTwice = self::_extension#0|get#_parenthesizedTwice;
method _parenthesizedTwiceNamed = self::_extension#0|_parenthesizedTwiceNamed;
tearoff _parenthesizedTwiceNamed = self::_extension#0|get#_parenthesizedTwiceNamed;
}
static method testLaterUnnamedParameter(core::int i) → dynamic {
self::_extension#0|_laterUnnamedParameter<core::int>(i, 0, (core::int x) → void {
x;
});
}
static method testLaterUnnamedParameterDependsOnNamedParameter(core::int i) → dynamic {
self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<core::int>(i, (core::int x) → void {
x;
}, a: 0);
}
static method testEarlierUnnamedParameter(core::int i) → dynamic {
self::_extension#0|_earlierUnnamedParameter<core::int>(i, (core::int x) → void {
x;
}, 0);
}
static method testLaterNamedParameter(core::int i) → dynamic {
self::_extension#0|_laterNamedParameter<core::int>(i, a: 0, b: (core::int x) → void {
x;
});
}
static method testEarlierNamedParameter(core::int i) → dynamic {
self::_extension#0|_earlierNamedParameter<core::int>(i, a: (core::int x) → void {
x;
}, b: 0);
}
static method testEarlierNamedParameterDependsOnUnnamedParameter(core::int i) → dynamic {
self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<core::int>(i, 0, a: (core::int x) → void {
x;
});
}
static method testPropagateToReturnType(core::int i) → dynamic {
self::_extension#0|_propagateToReturnType<core::int, core::List<core::int>>(i, 0, (core::int x) → core::List<core::int> => core::_GrowableList::_literal1<core::int>(x));
}
static method testClosureAsParameterType(core::int i) → dynamic {
self::_extension#0|_closureAsParameterType<() → core::int, core::List<core::int>>(i, () → core::int => 0, (() → core::int h) → core::List<core::int> => core::_GrowableList::_literal1<core::int>(h(){() → core::int}));
}
static method testPropagateToEarlierClosure(core::int i) → dynamic {
self::_extension#0|_propagateToEarlierClosure<core::int, core::List<core::int>>(i, (core::int x) → core::List<core::int> => core::_GrowableList::_literal1<core::int>(x), () → core::int => 0);
}
static method testPropagateToLaterClosure(core::int i) → dynamic {
self::_extension#0|_propagateToLaterClosure<core::int, core::List<core::int>>(i, () → core::int => 0, (core::int x) → core::List<core::int> => core::_GrowableList::_literal1<core::int>(x));
}
static method testLongDependencyChain(core::int i) → dynamic {
self::_extension#0|_longDependencyChain<core::List<core::int>, core::int, core::Set<core::int>>(i, () → 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> #t1 = new col::_CompactLinkedHashSet::•<core::int>();
#t1.{core::Set::add}{Invariant}(y){(core::int) → core::bool};
} =>#t1);
}
static method testDependencyCycle(core::int i) → dynamic {
self::_extension#0|_dependencyCycle<core::List<core::Object?>, core::Set<core::Object?>>(i, (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?> #t2 = new col::_CompactLinkedHashSet::•<core::Object?>();
#t2.{core::Set::add}{Invariant}(y){(core::Object?) → core::bool};
} =>#t2);
}
static method testPropagateFromContravariantReturnType(core::int i) → dynamic {
self::_extension#0|_propagateFromContravariantReturnType<core::int, core::List<core::int>>(i, () → (core::int) → void => (core::int i) → void {}, (core::int x) → core::List<core::int> => core::_GrowableList::_literal1<core::int>(x));
}
static method testPropagateToContravariantParameterType(core::int i) → dynamic {
self::_extension#0|_propagateToContravariantParameterType<core::int, core::List<(core::int) → void>>(i, () → core::int => 0, ((core::int) → void x) → core::List<(core::int) → void> => core::_GrowableList::_literal1<(core::int) → void>(x));
}
static method testReturnTypeRefersToMultipleTypeVars(core::int i) → dynamic {
self::_extension#0|_returnTypeRefersToMultipleTypeVars<core::int, core::String>(i, () → core::Map<core::int, core::String> => <core::int, core::String>{0: ""}, (core::int k) → void {
k;
}, (core::String v) → void {
v;
});
}
static method testUnnecessaryDueToNoDependency(core::int i) → dynamic {
self::_extension#0|_unnecessaryDueToNoDependency<core::int?>(i, () → core::int => 0, null);
}
static method testUnnecessaryDueToExplicitParameterTypeNamed(core::int i) → dynamic {
core::int? a = self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed<core::int?>(i, null, ({core::int? x = #C1, required core::int y = #C1}) → core::int => (let final core::int? #t3 = x in #t3 == null ?{core::int} 0 : #t3{core::int}).{core::num::+}(y){(core::num) → core::int});
a;
}
static method testParenthesized(core::int i) → dynamic {
self::_extension#0|_parenthesized<core::int>(i, 0, (core::int x) → void {
x;
});
}
static method testParenthesizedNamed(core::int i) → dynamic {
self::_extension#0|_parenthesizedNamed<core::int>(i, a: 0, b: (core::int x) → void {
x;
});
}
static method testParenthesizedTwice(core::int i) → dynamic {
self::_extension#0|_parenthesizedTwice<core::int>(i, 0, (core::int x) → void {
x;
});
}
static method testParenthesizedTwiceNamed(core::int i) → dynamic {
self::_extension#0|_parenthesizedTwiceNamed<core::int>(i, a: 0, b: (core::int x) → void {
x;
});
}
static method _extension#0|_laterUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_laterUnnamedParameter::T% x, (self::_extension#0|_laterUnnamedParameter::T%) → void y) → self::_extension#0|_laterUnnamedParameter::T%
return throw "";
static method _extension#0|get#_laterUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, (T%) → void) → T%
return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → T% => self::_extension#0|_laterUnnamedParameter<T%>(#this, x, y);
static method _extension#0|_laterUnnamedParameterDependsOnNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter::T%) → void x, {required self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter::T% a = #C1}) → void
return throw "";
static method _extension#0|get#_laterUnnamedParameterDependsOnNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, {a: T%}) → void
return <T extends core::Object? = dynamic>((T%) → void x, {T% a = #C1}) → void => self::_extension#0|_laterUnnamedParameterDependsOnNamedParameter<T%>(#this, x, a: a);
static method _extension#0|_earlierUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_earlierUnnamedParameter::T%) → void x, self::_extension#0|_earlierUnnamedParameter::T% y) → void
return throw "";
static method _extension#0|get#_earlierUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>((T%) → void, T%) → void
return <T extends core::Object? = dynamic>((T%) → void x, T% y) → void => self::_extension#0|_earlierUnnamedParameter<T%>(#this, x, y);
static method _extension#0|_laterNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_laterNamedParameter::T% a = #C1, required (self::_extension#0|_laterNamedParameter::T%) → void b = #C1}) → void
return throw "";
static method _extension#0|get#_laterNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
return <T extends core::Object? = dynamic>({T% a = #C1, (T%) → void b = #C1}) → void => self::_extension#0|_laterNamedParameter<T%>(#this, a: a, b: b);
static method _extension#0|_earlierNamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, {required (self::_extension#0|_earlierNamedParameter::T%) → void a = #C1, required self::_extension#0|_earlierNamedParameter::T% b = #C1}) → void
return throw "";
static method _extension#0|get#_earlierNamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: (T%) → void, b: T%}) → void
return <T extends core::Object? = dynamic>({(T%) → void a = #C1, T% b = #C1}) → void => self::_extension#0|_earlierNamedParameter<T%>(#this, a: a, b: b);
static method _extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter::T% b, {required (self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter::T%) → void a = #C1}) → void
return throw "";
static method _extension#0|get#_earlierNamedParameterDependsOnUnnamedParameter(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, {a: (T%) → void}) → void
return <T extends core::Object? = dynamic>(T% b, {(T%) → void a = #C1}) → void => self::_extension#0|_earlierNamedParameterDependsOnUnnamedParameter<T%>(#this, b, a: a);
static method _extension#0|_propagateToReturnType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_propagateToReturnType::T% x, (self::_extension#0|_propagateToReturnType::T%) → self::_extension#0|_propagateToReturnType::U% y) → self::_extension#0|_propagateToReturnType::U%
return throw "";
static method _extension#0|get#_propagateToReturnType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T%, (T%) → U%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T% x, (T%) → U% y) → U% => self::_extension#0|_propagateToReturnType<T%, U%>(#this, x, y);
static method _extension#0|_closureAsParameterType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_closureAsParameterType::T% x, (self::_extension#0|_closureAsParameterType::T%) → self::_extension#0|_closureAsParameterType::U% y) → self::_extension#0|_closureAsParameterType::U%
return throw "";
static method _extension#0|get#_closureAsParameterType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T%, (T%) → U%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(T% x, (T%) → U% y) → U% => self::_extension#0|_closureAsParameterType<T%, U%>(#this, x, y);
static method _extension#0|_propagateToEarlierClosure<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_propagateToEarlierClosure::T%) → self::_extension#0|_propagateToEarlierClosure::U% x, () → self::_extension#0|_propagateToEarlierClosure::T% y) → self::_extension#0|_propagateToEarlierClosure::U%
return throw "";
static method _extension#0|get#_propagateToEarlierClosure(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>((T%) → U%, () → T%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>((T%) → U% x, () → T% y) → U% => self::_extension#0|_propagateToEarlierClosure<T%, U%>(#this, x, y);
static method _extension#0|_propagateToLaterClosure<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, () → self::_extension#0|_propagateToLaterClosure::T% x, (self::_extension#0|_propagateToLaterClosure::T%) → self::_extension#0|_propagateToLaterClosure::U% y) → self::_extension#0|_propagateToLaterClosure::U%
return throw "";
static method _extension#0|get#_propagateToLaterClosure(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → T%, (T%) → U%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → T% x, (T%) → U% y) → U% => self::_extension#0|_propagateToLaterClosure<T%, U%>(#this, x, y);
static method _extension#0|get#_longDependencyChain(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic, V extends core::Object? = dynamic>(() → T%, (T%) → U%, (U%) → V%) → V%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic, V extends core::Object? = dynamic>(() → T% x, (T%) → U% y, (U%) → V% z) → V% => self::_extension#0|_longDependencyChain<T%, U%, V%>(#this, x, y, z);
static method _extension#0|_longDependencyChain<T extends core::Object? = dynamic, U extends core::Object? = dynamic, V extends core::Object? = dynamic>(lowered final core::int #this, () → self::_extension#0|_longDependencyChain::T% x, (self::_extension#0|_longDependencyChain::T%) → self::_extension#0|_longDependencyChain::U% y, (self::_extension#0|_longDependencyChain::U%) → self::_extension#0|_longDependencyChain::V% z) → self::_extension#0|_longDependencyChain::V%
return throw "";
static method _extension#0|_dependencyCycle<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, (self::_extension#0|_dependencyCycle::U%) → self::_extension#0|_dependencyCycle::T% x, (self::_extension#0|_dependencyCycle::T%) → self::_extension#0|_dependencyCycle::U% y) → core::Map<self::_extension#0|_dependencyCycle::T%, self::_extension#0|_dependencyCycle::U%>
return throw "";
static method _extension#0|get#_dependencyCycle(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>((U%) → T%, (T%) → U%) → core::Map<T%, U%>
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>((U%) → T% x, (T%) → U% y) → core::Map<T%, U%> => self::_extension#0|_dependencyCycle<T%, U%>(#this, x, y);
static method _extension#0|_propagateFromContravariantReturnType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, () → (self::_extension#0|_propagateFromContravariantReturnType::T%) → void x, (self::_extension#0|_propagateFromContravariantReturnType::T%) → self::_extension#0|_propagateFromContravariantReturnType::U% y) → self::_extension#0|_propagateFromContravariantReturnType::U%
return throw "";
static method _extension#0|get#_propagateFromContravariantReturnType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → (T%) → void, (T%) → U%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → (T%) → void x, (T%) → U% y) → U% => self::_extension#0|_propagateFromContravariantReturnType<T%, U%>(#this, x, y);
static method _extension#0|_propagateToContravariantParameterType<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, () → self::_extension#0|_propagateToContravariantParameterType::T% x, ((self::_extension#0|_propagateToContravariantParameterType::T%) → void) → self::_extension#0|_propagateToContravariantParameterType::U% y) → self::_extension#0|_propagateToContravariantParameterType::U%
return throw "";
static method _extension#0|get#_propagateToContravariantParameterType(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → T%, ((T%) → void) → U%) → U%
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → T% x, ((T%) → void) → U% y) → U% => self::_extension#0|_propagateToContravariantParameterType<T%, U%>(#this, x, y);
static method _extension#0|_returnTypeRefersToMultipleTypeVars<T extends core::Object? = dynamic, U extends core::Object? = dynamic>(lowered final core::int #this, () → core::Map<self::_extension#0|_returnTypeRefersToMultipleTypeVars::T%, self::_extension#0|_returnTypeRefersToMultipleTypeVars::U%> x, (self::_extension#0|_returnTypeRefersToMultipleTypeVars::T%) → void y, (self::_extension#0|_returnTypeRefersToMultipleTypeVars::U%) → void z) → void
return throw "";
static method _extension#0|get#_returnTypeRefersToMultipleTypeVars(lowered final core::int #this) → <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → core::Map<T%, U%>, (T%) → void, (U%) → void) → void
return <T extends core::Object? = dynamic, U extends core::Object? = dynamic>(() → core::Map<T%, U%> x, (T%) → void y, (U%) → void z) → void => self::_extension#0|_returnTypeRefersToMultipleTypeVars<T%, U%>(#this, x, y, z);
static method _extension#0|_unnecessaryDueToNoDependency<T extends core::Object? = dynamic>(lowered final core::int #this, () → self::_extension#0|_unnecessaryDueToNoDependency::T% x, self::_extension#0|_unnecessaryDueToNoDependency::T% y) → self::_extension#0|_unnecessaryDueToNoDependency::T%
return throw "";
static method _extension#0|get#_unnecessaryDueToNoDependency(lowered final core::int #this) → <T extends core::Object? = dynamic>(() → T%, T%) → T%
return <T extends core::Object? = dynamic>(() → T% x, T% y) → T% => self::_extension#0|_unnecessaryDueToNoDependency<T%>(#this, x, y);
static method _extension#0|_unnecessaryDueToExplicitParameterTypeNamed<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed::T% x, ({required x: self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed::T%, required y: core::int}) → self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed::T% y) → self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed::T%
return throw "";
static method _extension#0|get#_unnecessaryDueToExplicitParameterTypeNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, ({required x: T%, required y: core::int}) → T%) → T%
return <T extends core::Object? = dynamic>(T% x, ({required x: T%, required y: core::int}) → T% y) → T% => self::_extension#0|_unnecessaryDueToExplicitParameterTypeNamed<T%>(#this, x, y);
static method _extension#0|_parenthesized<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_parenthesized::T% x, (self::_extension#0|_parenthesized::T%) → void y) → void
return throw "";
static method _extension#0|get#_parenthesized(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, (T%) → void) → void
return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → void => self::_extension#0|_parenthesized<T%>(#this, x, y);
static method _extension#0|_parenthesizedNamed<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_parenthesizedNamed::T% a = #C1, required (self::_extension#0|_parenthesizedNamed::T%) → void b = #C1}) → void
return throw "";
static method _extension#0|get#_parenthesizedNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
return <T extends core::Object? = dynamic>({T% a = #C1, (T%) → void b = #C1}) → void => self::_extension#0|_parenthesizedNamed<T%>(#this, a: a, b: b);
static method _extension#0|_parenthesizedTwice<T extends core::Object? = dynamic>(lowered final core::int #this, self::_extension#0|_parenthesizedTwice::T% x, (self::_extension#0|_parenthesizedTwice::T%) → void y) → void
return throw "";
static method _extension#0|get#_parenthesizedTwice(lowered final core::int #this) → <T extends core::Object? = dynamic>(T%, (T%) → void) → void
return <T extends core::Object? = dynamic>(T% x, (T%) → void y) → void => self::_extension#0|_parenthesizedTwice<T%>(#this, x, y);
static method _extension#0|_parenthesizedTwiceNamed<T extends core::Object? = dynamic>(lowered final core::int #this, {required self::_extension#0|_parenthesizedTwiceNamed::T% a = #C1, required (self::_extension#0|_parenthesizedTwiceNamed::T%) → void b = #C1}) → void
return throw "";
static method _extension#0|get#_parenthesizedTwiceNamed(lowered final core::int #this) → <T extends core::Object? = dynamic>({a: T%, b: (T%) → void}) → void
return <T extends core::Object? = dynamic>({T% a = #C1, (T%) → void b = #C1}) → void => self::_extension#0|_parenthesizedTwiceNamed<T%>(#this, a: a, b: b);
static method main() → dynamic {}
constants {
#C1 = null
}

View file

@ -0,0 +1,214 @@
// Copyright (c) 2022, 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.
// Tests that horizontal inference works properly when the invocation is an
// extension member. This is an important corner case because the front end
// adds an implicit `this` argument to extension members as part of the lowering
// process. We need to make sure that the dependency tracking logic properly
// accounts for this extra argument.
// SharedOptions=--enable-experiment=inference-update-1
import '../static_type_helper.dart';
testLaterUnnamedParameter(int i) {
i._laterUnnamedParameter(0, (x) {
x.expectStaticType<Exactly<int>>();
});
}
/// This special case verifies that the implementations correctly associate the
/// zeroth positional parameter with the corresponding argument (even if that
/// argument isn't in the zeroth position at the call site).
testLaterUnnamedParameterDependsOnNamedParameter(int i) {
i._laterUnnamedParameterDependsOnNamedParameter(a: 0, (x) {
x.expectStaticType<Exactly<int>>();
});
}
testEarlierUnnamedParameter(int i) {
i._earlierUnnamedParameter((x) {
x.expectStaticType<Exactly<int>>();
}, 0);
}
testLaterNamedParameter(int i) {
i._laterNamedParameter(
a: 0,
b: (x) {
x.expectStaticType<Exactly<int>>();
});
}
testEarlierNamedParameter(int i) {
i._earlierNamedParameter(
a: (x) {
x.expectStaticType<Exactly<int>>();
},
b: 0);
}
/// This special case verifies that the implementations correctly associate the
/// zeroth positional parameter with the corresponding argument (even if that
/// argument isn't in the zeroth position at the call site).
testEarlierNamedParameterDependsOnUnnamedParameter(int i) {
i._earlierNamedParameterDependsOnUnnamedParameter(a: (x) {
x.expectStaticType<Exactly<int>>();
}, 0);
}
testPropagateToReturnType(int i) {
i
._propagateToReturnType(0, (x) => [x])
.expectStaticType<Exactly<List<int>>>();
}
// The test cases below exercise situations where there are multiple closures in
// the invocation, and they need to be inferred in the right order.
testClosureAsParameterType(int i) {
i
._closureAsParameterType(
() => 0, (h) => [h()]..expectStaticType<Exactly<List<int>>>())
.expectStaticType<Exactly<List<int>>>();
}
testPropagateToEarlierClosure(int i) {
i
._propagateToEarlierClosure(
(x) => [x]..expectStaticType<Exactly<List<int>>>(), () => 0)
.expectStaticType<Exactly<List<int>>>();
}
testPropagateToLaterClosure(int i) {
i
._propagateToLaterClosure(
() => 0, (x) => [x]..expectStaticType<Exactly<List<int>>>())
.expectStaticType<Exactly<List<int>>>();
}
testLongDependencyChain(int i) {
i
._longDependencyChain(
() => [0],
(x) => x.single..expectStaticType<Exactly<int>>(),
(y) => {y}..expectStaticType<Exactly<Set<int>>>())
.expectStaticType<Exactly<Set<int>>>();
}
testDependencyCycle(int i) {
i
._dependencyCycle((x) => [x]..expectStaticType<Exactly<List<Object?>>>(),
(y) => {y}..expectStaticType<Exactly<Set<Object?>>>())
.expectStaticType<Exactly<Map<List<Object?>, Set<Object?>>>>();
}
testPropagateFromContravariantReturnType(int i) {
i
._propagateFromContravariantReturnType(
() => (int i) {}, (x) => [x]..expectStaticType<Exactly<List<int>>>())
.expectStaticType<Exactly<List<int>>>();
}
testPropagateToContravariantParameterType(int i) {
i
._propagateToContravariantParameterType(() => 0,
(x) => [x]..expectStaticType<Exactly<List<void Function(int)>>>())
.expectStaticType<Exactly<List<void Function(int)>>>();
}
testReturnTypeRefersToMultipleTypeVars(int i) {
i._returnTypeRefersToMultipleTypeVars(() => {0: ''}, (k) {
k.expectStaticType<Exactly<int>>();
}, (v) {
v.expectStaticType<Exactly<String>>();
});
}
testUnnecessaryDueToNoDependency(int i) {
i
._unnecessaryDueToNoDependency(() => 0, null)
.expectStaticType<Exactly<int?>>();
}
testUnnecessaryDueToExplicitParameterTypeNamed(int i) {
var a = i._unnecessaryDueToExplicitParameterTypeNamed(
null, ({int? x, required y}) => (x ?? 0) + y);
a.expectStaticType<Exactly<int?>>();
}
testParenthesized(int i) {
i._parenthesized(0, ((x) {
x.expectStaticType<Exactly<int>>();
}));
}
testParenthesizedNamed(int i) {
i._parenthesizedNamed(
a: 0,
b: ((x) {
x.expectStaticType<Exactly<int>>();
}));
}
testParenthesizedTwice(int i) {
i._parenthesizedTwice(0, (((x) {
x.expectStaticType<Exactly<int>>();
})));
}
testParenthesizedTwiceNamed(int i) {
i._parenthesizedTwiceNamed(
a: 0,
b: (((x) {
x.expectStaticType<Exactly<int>>();
})));
}
extension on int {
T _laterUnnamedParameter<T>(T x, void Function(T) y) => throw '';
void _laterUnnamedParameterDependsOnNamedParameter<T>(void Function(T) x,
{required T a}) =>
throw '';
void _earlierUnnamedParameter<T>(void Function(T) x, T y) => throw '';
void _laterNamedParameter<T>({required T a, required void Function(T) b}) =>
throw '';
void _earlierNamedParameter<T>({required void Function(T) a, required T b}) =>
throw '';
void _earlierNamedParameterDependsOnUnnamedParameter<T>(T b,
{required void Function(T) a}) =>
throw '';
U _propagateToReturnType<T, U>(T x, U Function(T) y) => throw '';
U _closureAsParameterType<T, U>(T x, U Function(T) y) => throw '';
U _propagateToEarlierClosure<T, U>(U Function(T) x, T Function() y) =>
throw '';
U _propagateToLaterClosure<T, U>(T Function() x, U Function(T) y) => throw '';
V _longDependencyChain<T, U, V>(
T Function() x, U Function(T) y, V Function(U) z) =>
throw '';
Map<T, U> _dependencyCycle<T, U>(T Function(U) x, U Function(T) y) =>
throw '';
U _propagateFromContravariantReturnType<T, U>(
void Function(T) Function() x, U Function(T) y) =>
throw '';
U _propagateToContravariantParameterType<T, U>(
T Function() x, U Function(void Function(T)) y) =>
throw '';
void _returnTypeRefersToMultipleTypeVars<T, U>(
Map<T, U> Function() x, void Function(T) y, void Function(U) z) =>
throw '';
T _unnecessaryDueToNoDependency<T>(T Function() x, T y) => throw '';
T _unnecessaryDueToExplicitParameterTypeNamed<T>(
T x, T Function({required T x, required int y}) y) =>
throw '';
void _parenthesized<T>(T x, void Function(T) y) => throw '';
void _parenthesizedNamed<T>({required T a, required void Function(T) b}) =>
throw '';
void _parenthesizedTwice<T>(T x, void Function(T) y) => throw '';
void _parenthesizedTwiceNamed<T>(
{required T a, required void Function(T) b}) =>
throw '';
}
main() {}