blob: 91b5a1f4817ee24d15564bd8e93f0441eeb6d95a [file] [log] [blame] [edit]
// Copyright (c) 2018, 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.
part of 'dart:_js_helper';
/// Support final class for generic function type instantiation (binding of types).
///
abstract final class Instantiation extends Closure {
final Closure _genericClosure;
Instantiation(this._genericClosure) {
// TODO(sra): Copy some metadata used by Function.apply.
// Mark support code as used. The JS condition is inscrutable to dart2js,
// so the 'if (false)' is in the final program.
// TODO(sra): Find a better way to do this. Generating the signature methods
// earlier as SSA on the instantiation closures should achieve this.
if (JS('bool', 'false')) {
// [instantiatedGenericFunctionType] is called from injected $signature
// methods with runtime type representations.
rti.instantiatedGenericFunctionType(JS('', '0'), JS('', '0'));
}
}
bool operator ==(Object other) =>
other is Instantiation &&
this._genericClosure == other._genericClosure &&
this.runtimeType == other.runtimeType;
int get hashCode => Object.hash(_genericClosure, runtimeType);
/// Returns a list of the bound types.
List get _types;
String toString() {
var types = "<${_types.join(', ')}>";
// TODO(sra): Refactor Closure formatting to place type arguments inside,
// e.g. "Closure 'map<String>' of Instance of 'JSArray<int>'".
return '$_genericClosure with $types';
}
}
/// Instantiation classes are subclasses of [Instantiation]. For now we have a
/// fixed number of subclasses. Later we might generate the classes on demand.
final class Instantiation1<T1> extends Instantiation {
Instantiation1(Closure f) : super(f);
List get _types => [T1];
}
final class Instantiation2<T1, T2> extends Instantiation {
Instantiation2(Closure f) : super(f);
List get _types => [T1, T2];
}
final class Instantiation3<T1, T2, T3> extends Instantiation {
Instantiation3(Closure f) : super(f);
List get _types => [T1, T2, T3];
}
final class Instantiation4<T1, T2, T3, T4> extends Instantiation {
Instantiation4(Closure f) : super(f);
List get _types => [T1, T2, T3, T4];
}
final class Instantiation5<T1, T2, T3, T4, T5> extends Instantiation {
Instantiation5(Closure f) : super(f);
List get _types => [T1, T2, T3, T4, T5];
}
final class Instantiation6<T1, T2, T3, T4, T5, T6> extends Instantiation {
Instantiation6(Closure f) : super(f);
List get _types => [T1, T2, T3, T4, T5, T6];
}
final class Instantiation7<T1, T2, T3, T4, T5, T6, T7> extends Instantiation {
Instantiation7(Closure f) : super(f);
List get _types => [T1, T2, T3, T4, T5, T6, T7];
}
final class Instantiation8<T1, T2, T3, T4, T5, T6, T7, T8>
extends Instantiation {
Instantiation8(Closure f) : super(f);
List get _types => [T1, T2, T3, T4, T5, T6, T7, T8];
}
final class Instantiation9<T1, T2, T3, T4, T5, T6, T7, T8, T9>
extends Instantiation {
Instantiation9(Closure f) : super(f);
List get _types => [T1, T2, T3, T4, T5, T6, T7, T8, T9];
}
final class Instantiation10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>
extends Instantiation {
Instantiation10(Closure f) : super(f);
List get _types => [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10];
}
final class Instantiation11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>
extends Instantiation {
Instantiation11(Closure f) : super(f);
List get _types => [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11];
}
final class Instantiation12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>
extends Instantiation {
Instantiation12(Closure f) : super(f);
List get _types => [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12];
}
final class Instantiation13<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13
>
extends Instantiation {
Instantiation13(Closure f) : super(f);
List get _types => [T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13];
}
final class Instantiation14<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14
>
extends Instantiation {
Instantiation14(Closure f) : super(f);
List get _types => [
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
];
}
final class Instantiation15<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15
>
extends Instantiation {
Instantiation15(Closure f) : super(f);
List get _types => [
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
];
}
final class Instantiation16<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
T16
>
extends Instantiation {
Instantiation16(Closure f) : super(f);
List get _types => [
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
T16,
];
}
final class Instantiation17<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
T16,
T17
>
extends Instantiation {
Instantiation17(Closure f) : super(f);
List get _types => [
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
T16,
T17,
];
}
final class Instantiation18<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
T16,
T17,
T18
>
extends Instantiation {
Instantiation18(Closure f) : super(f);
List get _types => [
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
T16,
T17,
T18,
];
}
final class Instantiation19<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
T16,
T17,
T18,
T19
>
extends Instantiation {
Instantiation19(Closure f) : super(f);
List get _types => [
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
T16,
T17,
T18,
T19,
];
}
final class Instantiation20<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
T16,
T17,
T18,
T19,
T20
>
extends Instantiation {
Instantiation20(Closure f) : super(f);
List get _types => [
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
T16,
T17,
T18,
T19,
T20,
];
}
Instantiation instantiate1<T1>(Closure f) {
return Instantiation1<T1>(f);
}
Instantiation instantiate2<T1, T2>(Closure f) {
return Instantiation2<T1, T2>(f);
}
Instantiation instantiate3<T1, T2, T3>(Closure f) {
return Instantiation3<T1, T2, T3>(f);
}
Instantiation instantiate4<T1, T2, T3, T4>(Closure f) {
return Instantiation4<T1, T2, T3, T4>(f);
}
Instantiation instantiate5<T1, T2, T3, T4, T5>(Closure f) {
return Instantiation5<T1, T2, T3, T4, T5>(f);
}
Instantiation instantiate6<T1, T2, T3, T4, T5, T6>(Closure f) {
return Instantiation6<T1, T2, T3, T4, T5, T6>(f);
}
Instantiation instantiate7<T1, T2, T3, T4, T5, T6, T7>(Closure f) {
return Instantiation7<T1, T2, T3, T4, T5, T6, T7>(f);
}
Instantiation instantiate8<T1, T2, T3, T4, T5, T6, T7, T8>(Closure f) {
return Instantiation8<T1, T2, T3, T4, T5, T6, T7, T8>(f);
}
Instantiation instantiate9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(Closure f) {
return Instantiation9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(f);
}
Instantiation instantiate10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(
Closure f,
) {
return Instantiation10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(f);
}
Instantiation instantiate11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(
Closure f,
) {
return Instantiation11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(f);
}
Instantiation instantiate12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(
Closure f,
) {
return Instantiation12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(f);
}
Instantiation instantiate13<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13
>(Closure f) {
return Instantiation13<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13
>(f);
}
Instantiation instantiate14<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14
>(Closure f) {
return Instantiation14<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14
>(f);
}
Instantiation instantiate15<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15
>(Closure f) {
return Instantiation15<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15
>(f);
}
Instantiation instantiate16<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
T16
>(Closure f) {
return Instantiation16<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
T16
>(f);
}
Instantiation instantiate17<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
T16,
T17
>(Closure f) {
return Instantiation17<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
T16,
T17
>(f);
}
Instantiation instantiate18<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
T16,
T17,
T18
>(Closure f) {
return Instantiation18<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
T16,
T17,
T18
>(f);
}
Instantiation instantiate19<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
T16,
T17,
T18,
T19
>(Closure f) {
return Instantiation19<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
T16,
T17,
T18,
T19
>(f);
}
Instantiation instantiate20<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
T16,
T17,
T18,
T19,
T20
>(Closure f) {
return Instantiation20<
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
T16,
T17,
T18,
T19,
T20
>(f);
}