blob: 38c403d72c961ef34b7bbaa15fe1739f063e00b1 [file] [log] [blame]
// 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 _js_helper;
/// Support class for generic function type instantiation (binding of types).
///
abstract 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.
newRti.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.
class Instantiation1<T1> extends Instantiation {
Instantiation1(Closure f) : super(f);
List get _types => [T1];
}
class Instantiation2<T1, T2> extends Instantiation {
Instantiation2(Closure f) : super(f);
List get _types => [T1, T2];
}
class Instantiation3<T1, T2, T3> extends Instantiation {
Instantiation3(Closure f) : super(f);
List get _types => [T1, T2, T3];
}
class Instantiation4<T1, T2, T3, T4> extends Instantiation {
Instantiation4(Closure f) : super(f);
List get _types => [T1, T2, T3, T4];
}
class Instantiation5<T1, T2, T3, T4, T5> extends Instantiation {
Instantiation5(Closure f) : super(f);
List get _types => [T1, T2, T3, T4, T5];
}
class Instantiation6<T1, T2, T3, T4, T5, T6> extends Instantiation {
Instantiation6(Closure f) : super(f);
List get _types => [T1, T2, T3, T4, T5, T6];
}
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];
}
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];
}
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];
}
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];
}
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];
}
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];
}
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];
}
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];
}
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];
}
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];
}
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
];
}
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
];
}
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
];
}
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 new Instantiation1<T1>(f);
}
Instantiation instantiate2<T1, T2>(Closure f) {
return new Instantiation2<T1, T2>(f);
}
Instantiation instantiate3<T1, T2, T3>(Closure f) {
return new Instantiation3<T1, T2, T3>(f);
}
Instantiation instantiate4<T1, T2, T3, T4>(Closure f) {
return new Instantiation4<T1, T2, T3, T4>(f);
}
Instantiation instantiate5<T1, T2, T3, T4, T5>(Closure f) {
return new Instantiation5<T1, T2, T3, T4, T5>(f);
}
Instantiation instantiate6<T1, T2, T3, T4, T5, T6>(Closure f) {
return new Instantiation6<T1, T2, T3, T4, T5, T6>(f);
}
Instantiation instantiate7<T1, T2, T3, T4, T5, T6, T7>(Closure f) {
return new Instantiation7<T1, T2, T3, T4, T5, T6, T7>(f);
}
Instantiation instantiate8<T1, T2, T3, T4, T5, T6, T7, T8>(Closure f) {
return new Instantiation8<T1, T2, T3, T4, T5, T6, T7, T8>(f);
}
Instantiation instantiate9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(Closure f) {
return new 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 new 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 new 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 new 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 new 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 new 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 new 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 new 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 new 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 new 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 new 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 new Instantiation20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,
T13, T14, T15, T16, T17, T18, T19, T20>(f);
}