Index: pkg/analyzer/lib/dart/element/type.dart |
diff --git a/pkg/analyzer/lib/dart/element/type.dart b/pkg/analyzer/lib/dart/element/type.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..bfdac9ab2b4039d03d0084503d8bf01be1a18108 |
--- /dev/null |
+++ b/pkg/analyzer/lib/dart/element/type.dart |
@@ -0,0 +1,627 @@ |
+// Copyright (c) 2014, 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 analyzer.dart.element.type; |
+ |
+import 'package:analyzer/dart/element/element.dart'; |
+import 'package:analyzer/src/generated/element.dart' show InterfaceTypeImpl; |
+ |
+/** |
+ * The type associated with elements in the element model. |
+ * |
+ * Clients may not extend, implement or mix-in this class. |
+ */ |
+abstract class DartType { |
+ /** |
+ * An empty list of types. |
+ */ |
+ static const List<DartType> EMPTY_LIST = const <DartType>[]; |
+ |
+ /** |
+ * Return the name of this type as it should appear when presented to users in |
+ * contexts such as error messages. |
+ */ |
+ String get displayName; |
+ |
+ /** |
+ * Return the element representing the declaration of this type, or `null` if |
+ * the type has not, or cannot, be associated with an element. The former case |
+ * will occur if the element model is not yet complete; the latter case will |
+ * occur if this object represents an undefined type. |
+ */ |
+ Element get element; |
+ |
+ /** |
+ * Return `true` if this type represents the bottom type. |
+ */ |
+ bool get isBottom; |
+ |
+ /** |
+ * Return `true` if this type represents the type 'Function' defined in the |
+ * dart:core library. |
+ */ |
+ bool get isDartCoreFunction; |
+ |
+ /** |
+ * Return `true` if this type represents the type 'dynamic'. |
+ */ |
+ bool get isDynamic; |
+ |
+ /** |
+ * Return `true` if this type represents the type 'Object'. |
+ */ |
+ bool get isObject; |
+ |
+ /** |
+ * Return `true` if this type represents a typename that couldn't be resolved. |
+ */ |
+ bool get isUndefined; |
+ |
+ /** |
+ * Return `true` if this type represents the type 'void'. |
+ */ |
+ bool get isVoid; |
+ |
+ /** |
+ * Return the name of this type, or `null` if the type does not have a name, |
+ * such as when the type represents the type of an unnamed function. |
+ */ |
+ String get name; |
+ |
+ /** |
+ * Return `true` if this type is assignable to the given [type]. A type |
+ * <i>T</i> may be assigned to a type <i>S</i>, written <i>T</i> ⇔ |
+ * <i>S</i>, iff either <i>T</i> <: <i>S</i> or <i>S</i> <: <i>T</i>. |
+ */ |
+ bool isAssignableTo(DartType type); |
+ |
+ /** |
+ * Return `true` if this type is more specific than the given [type]. |
+ */ |
+ bool isMoreSpecificThan(DartType type); |
+ |
+ /** |
+ * Return `true` if this type is a subtype of the given [type]. |
+ */ |
+ bool isSubtypeOf(DartType type); |
+ |
+ /** |
+ * Return `true` if this type is a supertype of the given [type]. A type |
+ * <i>S</i> is a supertype of <i>T</i>, written <i>S</i> :> <i>T</i>, iff |
+ * <i>T</i> is a subtype of <i>S</i>. |
+ */ |
+ bool isSupertypeOf(DartType type); |
+ |
+ /** |
+ * Return the type resulting from substituting the given [argumentTypes] for |
+ * the given [parameterTypes] in this type. The specification defines this |
+ * operation in section 2: |
+ * <blockquote> |
+ * The notation <i>[x<sub>1</sub>, ..., x<sub>n</sub>/y<sub>1</sub>, ..., |
+ * y<sub>n</sub>]E</i> denotes a copy of <i>E</i> in which all occurrences of |
+ * <i>y<sub>i</sub>, 1 <= i <= n</i> have been replaced with |
+ * <i>x<sub>i</sub></i>. |
+ * </blockquote> |
+ * Note that, contrary to the specification, this method will not create a |
+ * copy of this type if no substitutions were required, but will return this |
+ * type directly. |
+ * |
+ * Note too that the current implementation of this method is only guaranteed |
+ * to work when the parameter types are type variables. |
+ */ |
+ DartType substitute2( |
+ List<DartType> argumentTypes, List<DartType> parameterTypes); |
+} |
+ |
+/** |
+ * The type of a function, method, constructor, getter, or setter. Function |
+ * types come in three variations: |
+ * |
+ * * The types of functions that only have required parameters. These have the |
+ * general form <i>(T<sub>1</sub>, …, T<sub>n</sub>) → T</i>. |
+ * * The types of functions with optional positional parameters. These have the |
+ * general form <i>(T<sub>1</sub>, …, T<sub>n</sub>, [T<sub>n+1</sub> |
+ * …, T<sub>n+k</sub>]) → T</i>. |
+ * * The types of functions with named parameters. These have the general form |
+ * <i>(T<sub>1</sub>, …, T<sub>n</sub>, {T<sub>x1</sub> x1, …, |
+ * T<sub>xk</sub> xk}) → T</i>. |
+ * |
+ * Clients may not extend, implement or mix-in this class. |
+ */ |
+abstract class FunctionType implements ParameterizedType { |
+ /** |
+ * The type parameters of this generic function. For example `<T> T -> T`. |
+ * |
+ * These are distinct from the [typeParameters] list, which contains type |
+ * parameters from surrounding contexts, and thus are free type variables from |
+ * the perspective of this function type. |
+ */ |
+ List<TypeParameterElement> get boundTypeParameters; |
+ |
+ /** |
+ * Return a map from the names of named parameters to the types of the named |
+ * parameters of this type of function. The entries in the map will be |
+ * iterated in the same order as the order in which the named parameters were |
+ * defined. If there were no named parameters declared then the map will be |
+ * empty. |
+ */ |
+ Map<String, DartType> get namedParameterTypes; |
+ |
+ /** |
+ * Return a list containing the types of the normal parameters of this type of |
+ * function. The parameter types are in the same order as they appear in the |
+ * declaration of the function. |
+ */ |
+ List<DartType> get normalParameterTypes; |
+ |
+ /** |
+ * Return a map from the names of optional (positional) parameters to the |
+ * types of the optional parameters of this type of function. The entries in |
+ * the map will be iterated in the same order as the order in which the |
+ * optional parameters were defined. If there were no optional parameters |
+ * declared then the map will be empty. |
+ */ |
+ List<DartType> get optionalParameterTypes; |
+ |
+ /** |
+ * Return a list containing the parameters elements of this type of function. |
+ * The parameter types are in the same order as they appear in the declaration |
+ * of the function. |
+ */ |
+ List<ParameterElement> get parameters; |
+ |
+ /** |
+ * Return the type of object returned by this type of function. |
+ */ |
+ DartType get returnType; |
+ |
+ /** |
+ * Return the type resulting from instantiating (replacing) the given |
+ * [argumentTypes] for this function's bound type parameters. |
+ */ |
+ FunctionType instantiate(List<DartType> argumentTypes); |
+ |
+ /** |
+ * Return `true` if this type is a subtype of the given [type]. |
+ * |
+ * A function type <i>(T<sub>1</sub>, …, T<sub>n</sub>) → T</i> is |
+ * a subtype of the function type <i>(S<sub>1</sub>, …, S<sub>n</sub>) |
+ * → S</i>, if all of the following conditions are met: |
+ * |
+ * * Either |
+ * * <i>S</i> is void, or |
+ * * <i>T ⇔ S</i>. |
+ * |
+ * * For all <i>i</i>, 1 <= <i>i</i> <= <i>n</i>, <i>T<sub>i</sub> ⇔ |
+ * S<sub>i</sub></i>. |
+ * |
+ * A function type <i>(T<sub>1</sub>, …, T<sub>n</sub>, |
+ * [T<sub>n+1</sub>, …, T<sub>n+k</sub>]) → T</i> is a subtype of |
+ * the function type <i>(S<sub>1</sub>, …, S<sub>n</sub>, |
+ * [S<sub>n+1</sub>, …, S<sub>n+m</sub>]) → S</i>, if all of the |
+ * following conditions are met: |
+ * |
+ * * Either |
+ * * <i>S</i> is void, or |
+ * * <i>T ⇔ S</i>. |
+ * |
+ * * <i>k</i> >= <i>m</i> and for all <i>i</i>, 1 <= <i>i</i> <= <i>n+m</i>, |
+ * <i>T<sub>i</sub> ⇔ S<sub>i</sub></i>. |
+ * |
+ * A function type <i>(T<sub>1</sub>, …, T<sub>n</sub>, |
+ * {T<sub>x1</sub> x1, …, T<sub>xk</sub> xk}) → T</i> is a subtype |
+ * of the function type <i>(S<sub>1</sub>, …, S<sub>n</sub>, |
+ * {S<sub>y1</sub> y1, …, S<sub>ym</sub> ym}) → S</i>, if all of |
+ * the following conditions are met: |
+ * * Either |
+ * * <i>S</i> is void, |
+ * * or <i>T ⇔ S</i>. |
+ * |
+ * * For all <i>i</i>, 1 <= <i>i</i> <= <i>n</i>, <i>T<sub>i</sub> ⇔ |
+ * S<sub>i</sub></i>. |
+ * * <i>k</i> >= <i>m</i> and <i>y<sub>i</sub></i> in <i>{x<sub>1</sub>, |
+ * …, x<sub>k</sub>}</i>, 1 <= <i>i</i> <= <i>m</i>. |
+ * * For all <i>y<sub>i</sub></i> in <i>{y<sub>1</sub>, …, |
+ * y<sub>m</sub>}</i>, <i>y<sub>i</sub> = x<sub>j</sub> => Tj ⇔ Si</i>. |
+ * |
+ * In addition, the following subtype rules apply: |
+ * |
+ * <i>(T<sub>1</sub>, …, T<sub>n</sub>, []) → T <: (T<sub>1</sub>, |
+ * …, T<sub>n</sub>) → T.</i><br> |
+ * <i>(T<sub>1</sub>, …, T<sub>n</sub>) → T <: (T<sub>1</sub>, |
+ * …, T<sub>n</sub>, {}) → T.</i><br> |
+ * <i>(T<sub>1</sub>, …, T<sub>n</sub>, {}) → T <: (T<sub>1</sub>, |
+ * …, T<sub>n</sub>) → T.</i><br> |
+ * <i>(T<sub>1</sub>, …, T<sub>n</sub>) → T <: (T<sub>1</sub>, |
+ * …, T<sub>n</sub>, []) → T.</i> |
+ * |
+ * All functions implement the class `Function`. However not all function |
+ * types are a subtype of `Function`. If an interface type <i>I</i> includes a |
+ * method named `call()`, and the type of `call()` is the function type |
+ * <i>F</i>, then <i>I</i> is considered to be a subtype of <i>F</i>. |
+ */ |
+ @override |
+ bool isSubtypeOf(DartType type); |
+ |
+ @override |
+ FunctionType substitute2( |
+ List<DartType> argumentTypes, List<DartType> parameterTypes); |
+ |
+ /** |
+ * Return the type resulting from substituting the given [argumentTypes] for |
+ * this type's parameters. This is fully equivalent to |
+ * `substitute(argumentTypes, getTypeArguments())`. |
+ */ |
+ @deprecated // use instantiate |
+ FunctionType substitute3(List<DartType> argumentTypes); |
+} |
+ |
+/** |
+ * The type introduced by either a class or an interface, or a reference to such |
+ * a type. |
+ * |
+ * Clients may not extend, implement or mix-in this class. |
+ */ |
+abstract class InterfaceType implements ParameterizedType { |
+ /** |
+ * An empty list of types. |
+ */ |
+ static const List<InterfaceType> EMPTY_LIST = const <InterfaceType>[]; |
+ |
+ /** |
+ * Return a list containing all of the accessors (getters and setters) |
+ * declared in this type. |
+ */ |
+ List<PropertyAccessorElement> get accessors; |
+ |
+ /** |
+ * Return a list containing all of the constructors declared in this type. |
+ */ |
+ List<ConstructorElement> get constructors; |
+ |
+ @override |
+ ClassElement get element; |
+ |
+ /** |
+ * Return a list containing all of the interfaces that are implemented by this |
+ * interface. Note that this is <b>not</b>, in general, equivalent to getting |
+ * the interfaces from this type's element because the types returned by this |
+ * method will have had their type parameters replaced. |
+ */ |
+ List<InterfaceType> get interfaces; |
+ |
+ /** |
+ * Return a list containing all of the methods declared in this type. |
+ */ |
+ List<MethodElement> get methods; |
+ |
+ /** |
+ * Return a list containing all of the mixins that are applied to the class |
+ * being extended in order to derive the superclass of this class. Note that |
+ * this is <b>not</b>, in general, equivalent to getting the mixins from this |
+ * type's element because the types returned by this method will have had |
+ * their type parameters replaced. |
+ */ |
+ List<InterfaceType> get mixins; |
+ |
+ /** |
+ * Return the type representing the superclass of this type, or null if this |
+ * type represents the class 'Object'. Note that this is <b>not</b>, in |
+ * general, equivalent to getting the superclass from this type's element |
+ * because the type returned by this method will have had it's type parameters |
+ * replaced. |
+ */ |
+ InterfaceType get superclass; |
+ |
+ /** |
+ * Return the element representing the getter with the given [name] that is |
+ * declared in this class, or `null` if this class does not declare a getter |
+ * with the given name. |
+ */ |
+ PropertyAccessorElement getGetter(String name); |
+ |
+ /** |
+ * Return the element representing the method with the given [name] that is |
+ * declared in this class, or `null` if this class does not declare a method |
+ * with the given name. |
+ */ |
+ MethodElement getMethod(String name); |
+ |
+ /** |
+ * Return the element representing the setter with the given [name] that is |
+ * declared in this class, or `null` if this class does not declare a setter |
+ * with the given name. |
+ */ |
+ PropertyAccessorElement getSetter(String name); |
+ |
+ /** |
+ * Return `true` if this type is a direct supertype of the given [type]. The |
+ * implicit interface of class <i>I</i> is a direct supertype of the implicit |
+ * interface of class <i>J</i> iff: |
+ * |
+ * * <i>I</i> is Object, and <i>J</i> has no extends clause. |
+ * * <i>I</i> is listed in the extends clause of <i>J</i>. |
+ * * <i>I</i> is listed in the implements clause of <i>J</i>. |
+ * * <i>I</i> is listed in the with clause of <i>J</i>. |
+ * * <i>J</i> is a mixin application of the mixin of <i>I</i>. |
+ */ |
+ bool isDirectSupertypeOf(InterfaceType type); |
+ |
+ /** |
+ * Return `true` if this type is more specific than the given [type]. An |
+ * interface type <i>T</i> is more specific than an interface type <i>S</i>, |
+ * written <i>T « S</i>, if one of the following conditions is met: |
+ * |
+ * * Reflexivity: <i>T</i> is <i>S</i>. |
+ * * <i>T</i> is bottom. |
+ * * <i>S</i> is dynamic. |
+ * * Direct supertype: <i>S</i> is a direct supertype of <i>T</i>. |
+ * * <i>T</i> is a type parameter and <i>S</i> is the upper bound of <i>T</i>. |
+ * * Covariance: <i>T</i> is of the form <i>I<T<sub>1</sub>, …, |
+ * T<sub>n</sub>></i> and S</i> is of the form <i>I<S<sub>1</sub>, |
+ * …, S<sub>n</sub>></i> and <i>T<sub>i</sub> « |
+ * S<sub>i</sub></i>, <i>1 <= i <= n</i>. |
+ * * Transitivity: <i>T « U</i> and <i>U « S</i>. |
+ */ |
+ @override |
+ bool isMoreSpecificThan(DartType type); |
+ |
+ /** |
+ * Return `true` if this type is a subtype of the given [type]. An interface |
+ * type <i>T</i> is a subtype of an interface type <i>S</i>, written <i>T</i> |
+ * <: <i>S</i>, iff <i>[bottom/dynamic]T</i> « <i>S</i> (<i>T</i> is |
+ * more specific than <i>S</i>). If an interface type <i>I</i> includes a |
+ * method named <i>call()</i>, and the type of <i>call()</i> is the function |
+ * type <i>F</i>, then <i>I</i> is considered to be a subtype of <i>F</i>. |
+ */ |
+ @override |
+ bool isSubtypeOf(DartType type); |
+ |
+ /** |
+ * Return the element representing the constructor that results from looking |
+ * up the constructor with the given [name] in this class with respect to the |
+ * given [library], or `null` if the look up fails. The behavior of this |
+ * method is defined by the Dart Language Specification in section 12.11.1: |
+ * <blockquote> |
+ * If <i>e</i> is of the form <b>new</b> <i>T.id()</i> then let <i>q<i> be the |
+ * constructor <i>T.id</i>, otherwise let <i>q<i> be the constructor <i>T<i>. |
+ * Otherwise, if <i>q</i> is not defined or not accessible, a |
+ * NoSuchMethodException is thrown. |
+ * </blockquote> |
+ */ |
+ ConstructorElement lookUpConstructor(String name, LibraryElement library); |
+ |
+ /** |
+ * Return the element representing the getter that results from looking up the |
+ * getter with the given [name] in this class with respect to the given |
+ * [library], or `null` if the look up fails. The behavior of this method is |
+ * defined by the Dart Language Specification in section 12.15.1: |
+ * <blockquote> |
+ * The result of looking up getter (respectively setter) <i>m</i> in class |
+ * <i>C</i> with respect to library <i>L</i> is: |
+ * * If <i>C</i> declares an instance getter (respectively setter) named |
+ * <i>m</i> that is accessible to <i>L</i>, then that getter (respectively |
+ * setter) is the result of the lookup. Otherwise, if <i>C</i> has a |
+ * superclass <i>S</i>, then the result of the lookup is the result of |
+ * looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect |
+ * to <i>L</i>. Otherwise, we say that the lookup has failed. |
+ * </blockquote> |
+ */ |
+ PropertyAccessorElement lookUpGetter(String name, LibraryElement library); |
+ |
+ /** |
+ * Return the element representing the getter that results from looking up the |
+ * getter with the given [name] in the superclass of this class with respect |
+ * to the given [library], or `null` if the look up fails. The behavior of |
+ * this method is defined by the Dart Language Specification in section |
+ * 12.15.1: |
+ * <blockquote> |
+ * The result of looking up getter (respectively setter) <i>m</i> in class |
+ * <i>C</i> with respect to library <i>L</i> is: |
+ * * If <i>C</i> declares an instance getter (respectively setter) named |
+ * <i>m</i> that is accessible to <i>L</i>, then that getter (respectively |
+ * setter) is the result of the lookup. Otherwise, if <i>C</i> has a |
+ * superclass <i>S</i>, then the result of the lookup is the result of |
+ * looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect |
+ * to <i>L</i>. Otherwise, we say that the lookup has failed. |
+ * </blockquote> |
+ */ |
+ PropertyAccessorElement lookUpGetterInSuperclass( |
+ String name, LibraryElement library); |
+ |
+ /** |
+ * Look up the member with the given [name] in this type and all extended |
+ * and mixed in classes, and by default including [thisType]. If the search |
+ * fails, this will then search interfaces. |
+ * |
+ * Return the element representing the member that was found, or `null` if |
+ * there is no getter with the given name. |
+ * |
+ * The [library] determines if a private member name is visible, and does not |
+ * need to be supplied for public names. |
+ */ |
+ PropertyAccessorElement lookUpInheritedGetter(String name, |
+ {LibraryElement library, bool thisType: true}); |
+ |
+ /** |
+ * Look up the member with the given [name] in this type and all extended |
+ * and mixed in classes, starting from this type. If the search fails, |
+ * search interfaces. |
+ * |
+ * Return the element representing the member that was found, or `null` if |
+ * there is no getter with the given name. |
+ * |
+ * The [library] determines if a private member name is visible, and does not |
+ * need to be supplied for public names. |
+ */ |
+ ExecutableElement lookUpInheritedGetterOrMethod(String name, |
+ {LibraryElement library}); |
+ |
+ /** |
+ * Look up the member with the given [name] in this type and all extended |
+ * and mixed in classes, and by default including [thisType]. If the search |
+ * fails, this will then search interfaces. |
+ * |
+ * Return the element representing the member that was found, or `null` if |
+ * there is no getter with the given name. |
+ * |
+ * The [library] determines if a private member name is visible, and does not |
+ * need to be supplied for public names. |
+ */ |
+ MethodElement lookUpInheritedMethod(String name, |
+ {LibraryElement library, bool thisType: true}); |
+ |
+ /** |
+ * Look up the member with the given [name] in this type and all extended |
+ * and mixed in classes, and by default including [thisType]. If the search |
+ * fails, this will then search interfaces. |
+ * |
+ * Return the element representing the member that was found, or `null` if |
+ * there is no getter with the given name. |
+ * |
+ * The [library] determines if a private member name is visible, and does not |
+ * need to be supplied for public names. |
+ */ |
+ PropertyAccessorElement lookUpInheritedSetter(String name, |
+ {LibraryElement library, bool thisType: true}); |
+ |
+ /** |
+ * Return the element representing the method that results from looking up the |
+ * method with the given [name] in this class with respect to the given |
+ * [library], or `null` if the look up fails. The behavior of this method is |
+ * defined by the Dart Language Specification in section 12.15.1: |
+ * <blockquote> |
+ * The result of looking up method <i>m</i> in class <i>C</i> with respect to |
+ * library <i>L</i> is: |
+ * * If <i>C</i> declares an instance method named <i>m</i> that is accessible |
+ * to <i>L</i>, then that method is the result of the lookup. Otherwise, if |
+ * <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the |
+ * result of looking up method <i>m</i> in <i>S</i> with respect to <i>L</i> |
+ * Otherwise, we say that the lookup has failed. |
+ * </blockquote> |
+ */ |
+ MethodElement lookUpMethod(String name, LibraryElement library); |
+ |
+ /** |
+ * Return the element representing the method that results from looking up the |
+ * method with the given [name] in the superclass of this class with respect |
+ * to the given [library], or `null` if the look up fails. The behavior of |
+ * this method is defined by the Dart Language Specification in section |
+ * 12.15.1: |
+ * <blockquote> |
+ * The result of looking up method <i>m</i> in class <i>C</i> with respect to |
+ * library <i>L</i> is: |
+ * * If <i>C</i> declares an instance method named <i>m</i> that is accessible |
+ * to <i>L</i>, then that method is the result of the lookup. Otherwise, if |
+ * <i>C</i> has a superclass <i>S</i>, then the result of the lookup is the |
+ * result of looking up method <i>m</i> in <i>S</i> with respect to <i>L</i>. |
+ * Otherwise, we say that the lookup has failed. |
+ * </blockquote> |
+ */ |
+ MethodElement lookUpMethodInSuperclass(String name, LibraryElement library); |
+ |
+ /** |
+ * Return the element representing the setter that results from looking up the |
+ * setter with the given [name] in this class with respect to the given |
+ * [library], or `null` if the look up fails. The behavior of this method is |
+ * defined by the Dart Language Specification in section 12.16: |
+ * <blockquote> |
+ * The result of looking up getter (respectively setter) <i>m</i> in class |
+ * <i>C</i> with respect to library <i>L</i> is: |
+ * * If <i>C</i> declares an instance getter (respectively setter) named |
+ * <i>m</i> that is accessible to <i>L</i>, then that getter (respectively |
+ * setter) is the result of the lookup. Otherwise, if <i>C</i> has a |
+ * superclass <i>S</i>, then the result of the lookup is the result of |
+ * looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect |
+ * to <i>L</i>. Otherwise, we say that the lookup has failed. |
+ * </blockquote> |
+ */ |
+ PropertyAccessorElement lookUpSetter(String name, LibraryElement library); |
+ |
+ /** |
+ * Return the element representing the setter that results from looking up the |
+ * setter with the given [name] in the superclass of this class with respect |
+ * to the given [library], or `null` if the look up fails. The behavior of |
+ * this method is defined by the Dart Language Specification in section 12.16: |
+ * <blockquote> |
+ * The result of looking up getter (respectively setter) <i>m</i> in class |
+ * <i>C</i> with respect to library <i>L</i> is: |
+ * * If <i>C</i> declares an instance getter (respectively setter) named |
+ * <i>m</i> that is accessible to <i>L</i>, then that getter (respectively |
+ * setter) is the result of the lookup. Otherwise, if <i>C</i> has a |
+ * superclass <i>S</i>, then the result of the lookup is the result of |
+ * looking up getter (respectively setter) <i>m</i> in <i>S</i> with respect |
+ * to <i>L</i>. Otherwise, we say that the lookup has failed. |
+ * </blockquote> |
+ */ |
+ PropertyAccessorElement lookUpSetterInSuperclass( |
+ String name, LibraryElement library); |
+ |
+ @override |
+ InterfaceType substitute2( |
+ List<DartType> argumentTypes, List<DartType> parameterTypes); |
+ |
+ /** |
+ * Return the type resulting from substituting the given arguments for this |
+ * type's parameters. This is fully equivalent to `substitute2(argumentTypes, |
+ * getTypeArguments())`. |
+ */ |
+ // TODO(jmesserly): introduce a new "instantiate" and deprecate this. |
+ // The new "instantiate" should work similar to FunctionType.instantiate, |
+ // which uses [boundTypeParameters] to model type parameters that haven't been |
+ // filled in yet. Those are kept separate from already-substituted type |
+ // parameters or free variables from the enclosing scopes, which allows nested |
+ // generics to work, such as a generic method in a generic class. |
+ InterfaceType substitute4(List<DartType> argumentTypes); |
+ |
+ /** |
+ * Returns a "smart" version of the "least upper bound" of the given types. |
+ * |
+ * If these types have the same element and differ only in terms of the type |
+ * arguments, attempts to find a compatible set of type arguments. |
+ * |
+ * Otherwise, returns the same result as [DartType.getLeastUpperBound]. |
+ */ |
+ // TODO(brianwilkerson) This needs to be deprecated and moved to TypeSystem. |
+ static InterfaceType getSmartLeastUpperBound( |
+ InterfaceType first, InterfaceType second) => |
+ InterfaceTypeImpl.getSmartLeastUpperBound(first, second); |
+} |
+ |
+/** |
+ * A type with type parameters, such as a class or function type alias. |
+ * |
+ * Clients may not extend, implement or mix-in this class. |
+ */ |
+abstract class ParameterizedType implements DartType { |
+ /** |
+ * Return a list containing the actual types of the type arguments. If this |
+ * type's element does not have type parameters, then the array should be |
+ * empty (although it is possible for type arguments to be erroneously |
+ * declared). If the element has type parameters and the actual type does not |
+ * explicitly include argument values, then the type "dynamic" will be |
+ * automatically provided. |
+ */ |
+ List<DartType> get typeArguments; |
+ |
+ /** |
+ * Return a list containing all of the type parameters declared for this type. |
+ */ |
+ List<TypeParameterElement> get typeParameters; |
+} |
+ |
+/** |
+ * The type introduced by a type parameter. |
+ * |
+ * Clients may not extend, implement or mix-in this class. |
+ */ |
+abstract class TypeParameterType implements DartType { |
+ /** |
+ * An empty list of type parameter types. |
+ */ |
+ static const List<TypeParameterType> EMPTY_LIST = const <TypeParameterType>[]; |
+ |
+ @override |
+ TypeParameterElement get element; |
+} |