| // Copyright (c) 2019, 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. |
| |
| library dart2js.js_model.type_recipe; |
| |
| import '../elements/types.dart'; |
| |
| /// A TypeEnvironmentStructure describes the shape or layout of a reified type |
| /// environment. |
| /// |
| /// A type environment maps type parameter variables to type values. The type |
| /// variables are mostly elided in the runtime representation, replaced by |
| /// indexes into the reified environment. |
| abstract class TypeEnvironmentStructure {} |
| |
| /// A singleton type environment maps a binds a single value. |
| class SingletonTypeEnvironmentStructure extends TypeEnvironmentStructure { |
| final TypeVariableType variable; |
| |
| SingletonTypeEnvironmentStructure(this.variable); |
| |
| @override |
| String toString() => 'SingletonTypeEnvironmentStructure($variable)'; |
| } |
| |
| /// A type environment containing an interface type and/or a tuple of function |
| /// type parameters. |
| class FullTypeEnvironmentStructure extends TypeEnvironmentStructure { |
| final InterfaceType classType; |
| final List<TypeVariableType> bindings; |
| |
| FullTypeEnvironmentStructure({this.classType, this.bindings = const []}); |
| |
| @override |
| String toString() => 'FullTypeEnvironmentStructure($classType, $bindings)'; |
| } |
| |
| /// A TypeRecipe is evaluated against a type environment to produce either a |
| /// type, or another type environment. |
| abstract class TypeRecipe {} |
| |
| /// A recipe that yields a reified type. |
| class TypeExpressionRecipe extends TypeRecipe { |
| final DartType type; |
| |
| TypeExpressionRecipe(this.type); |
| |
| @override |
| String toString() => 'TypeExpressionRecipe($type)'; |
| } |
| |
| /// A recipe that yields a reified type environment. |
| abstract class TypeEnvironmentRecipe extends TypeRecipe {} |
| |
| /// A recipe that yields a reified type environment that binds a single generic |
| /// function type parameter. |
| class SingletonTypeEnvironmentRecipe extends TypeEnvironmentRecipe { |
| final DartType type; |
| |
| SingletonTypeEnvironmentRecipe(this.type); |
| |
| @override |
| String toString() => 'SingletonTypeEnvironmentRecipe($type)'; |
| } |
| |
| /// A recipe that yields a reified type environment that binds a class instance |
| /// type and/or a tuple of types, usually generic function type arguments. |
| /// |
| /// With no class is also used as a tuple of types. |
| class FullTypeEnvironmentRecipe extends TypeEnvironmentRecipe { |
| /// Type expression for the interface type of a class scope. `null` for |
| /// environments outside a class scope or a class scope where no supertype is |
| /// generic, or where optimization has determined that no use of the |
| /// environment requires any of the class type variables. |
| final InterfaceType classType; |
| |
| // Type expressions for the tuple of function type arguments. |
| final List<DartType> types; |
| |
| FullTypeEnvironmentRecipe({this.classType, this.types = const []}); |
| |
| @override |
| String toString() => 'FullTypeEnvironmentRecipe($classType, $types)'; |
| } |