OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library elements.modelx; | 5 library elements.modelx; |
6 | 6 |
7 import '../common.dart'; | 7 import '../common.dart'; |
8 import '../common/resolution.dart' show Resolution, ParsingContext; | 8 import '../common/resolution.dart' show Resolution, ParsingContext; |
9 import '../compiler.dart' show Compiler; | 9 import '../compiler.dart' show Compiler; |
10 import '../constants/constant_constructors.dart'; | 10 import '../constants/constant_constructors.dart'; |
11 import '../constants/constructors.dart'; | 11 import '../constants/constructors.dart'; |
12 import '../constants/expressions.dart'; | 12 import '../constants/expressions.dart'; |
13 import '../dart_types.dart'; | 13 import '../dart_types.dart'; |
14 import '../diagnostics/messages.dart' show MessageTemplate; | 14 import '../diagnostics/messages.dart' show MessageTemplate; |
15 import '../ordered_typeset.dart' show OrderedTypeSet; | 15 import '../ordered_typeset.dart' show OrderedTypeSet; |
16 import '../resolution/class_members.dart' show ClassMemberMixin; | 16 import '../resolution/class_members.dart' show ClassMemberMixin; |
17 import '../resolution/scope.dart' | 17 import '../resolution/scope.dart' |
18 show ClassScope, LibraryScope, Scope, TypeDeclarationScope; | 18 show |
| 19 ClassScope, |
| 20 LibraryScope, |
| 21 Scope, |
| 22 TypeDeclarationScope; |
19 import '../resolution/resolution.dart' show AnalyzableElementX; | 23 import '../resolution/resolution.dart' show AnalyzableElementX; |
20 import '../resolution/tree_elements.dart' show TreeElements; | 24 import '../resolution/tree_elements.dart' show TreeElements; |
21 import '../resolution/typedefs.dart' show TypedefCyclicVisitor; | 25 import '../resolution/typedefs.dart' show TypedefCyclicVisitor; |
22 import '../script.dart'; | 26 import '../script.dart'; |
23 import '../tokens/token.dart' show ErrorToken, Token; | 27 import '../tokens/token.dart' show ErrorToken, Token; |
24 import '../tokens/token_constants.dart' as Tokens show EOF_TOKEN; | 28 import '../tokens/token_constants.dart' as Tokens show EOF_TOKEN; |
25 import '../tree/tree.dart'; | 29 import '../tree/tree.dart'; |
26 import '../util/util.dart'; | 30 import '../util/util.dart'; |
27 | 31 |
28 import 'common.dart'; | 32 import 'common.dart'; |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
281 return visitor.visitErroneousElement(this, arg); | 285 return visitor.visitErroneousElement(this, arg); |
282 } | 286 } |
283 | 287 |
284 @override | 288 @override |
285 get isEffectiveTargetMalformed { | 289 get isEffectiveTargetMalformed { |
286 throw new UnsupportedError("isEffectiveTargetMalformed"); | 290 throw new UnsupportedError("isEffectiveTargetMalformed"); |
287 } | 291 } |
288 | 292 |
289 @override | 293 @override |
290 bool get isFromEnvironmentConstructor => false; | 294 bool get isFromEnvironmentConstructor => false; |
| 295 |
| 296 @override |
| 297 List<DartType> get typeVariables => unsupported(); |
291 } | 298 } |
292 | 299 |
293 /// A constructor that was synthesized to recover from a compile-time error. | 300 /// A constructor that was synthesized to recover from a compile-time error. |
294 class ErroneousConstructorElementX extends ErroneousElementX | 301 class ErroneousConstructorElementX extends ErroneousElementX |
295 with | 302 with |
296 PatchMixin<FunctionElement>, | 303 PatchMixin<FunctionElement>, |
297 AnalyzableElementX, | 304 AnalyzableElementX, |
298 ConstantConstructorMixin | 305 ConstantConstructorMixin |
299 implements ConstructorElementX { | 306 implements ConstructorElementX { |
300 // TODO(ahe): Instead of subclassing [ErroneousElementX], this class should | 307 // TODO(ahe): Instead of subclassing [ErroneousElementX], this class should |
(...skipping 1355 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1656 } | 1663 } |
1657 | 1664 |
1658 /// [Element] for a parameter-like element. | 1665 /// [Element] for a parameter-like element. |
1659 class FormalElementX extends ElementX | 1666 class FormalElementX extends ElementX |
1660 with AstElementMixin | 1667 with AstElementMixin |
1661 implements FormalElement { | 1668 implements FormalElement { |
1662 final VariableDefinitions definitions; | 1669 final VariableDefinitions definitions; |
1663 final Identifier identifier; | 1670 final Identifier identifier; |
1664 DartType typeCache; | 1671 DartType typeCache; |
1665 | 1672 |
| 1673 @override |
| 1674 List<DartType> get typeVariables => functionSignature.typeVariables; |
| 1675 |
1666 /** | 1676 /** |
1667 * Function signature for a variable with a function type. The signature is | 1677 * Function signature for a variable with a function type. The signature is |
1668 * kept to provide full information about parameter names through the mirror | 1678 * kept to provide full information about parameter names through the mirror |
1669 * system. | 1679 * system. |
1670 */ | 1680 */ |
1671 FunctionSignature _functionSignatureCache; | 1681 FunctionSignature _functionSignatureCache; |
1672 | 1682 |
1673 FormalElementX(ElementKind elementKind, FunctionTypedElement enclosingElement, | 1683 FormalElementX(ElementKind elementKind, FunctionTypedElement enclosingElement, |
1674 this.definitions, Identifier identifier) | 1684 this.definitions, Identifier identifier) |
1675 : this.identifier = identifier, | 1685 : this.identifier = identifier, |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1885 return getter != null && getter.isAbstract || | 1895 return getter != null && getter.isAbstract || |
1886 setter != null && setter.isAbstract; | 1896 setter != null && setter.isAbstract; |
1887 } | 1897 } |
1888 } | 1898 } |
1889 | 1899 |
1890 // TODO(johnniwinther): [FunctionSignature] should be merged with | 1900 // TODO(johnniwinther): [FunctionSignature] should be merged with |
1891 // [FunctionType]. | 1901 // [FunctionType]. |
1892 // TODO(karlklose): all these lists should have element type [FormalElement]. | 1902 // TODO(karlklose): all these lists should have element type [FormalElement]. |
1893 class FunctionSignatureX extends FunctionSignatureCommon | 1903 class FunctionSignatureX extends FunctionSignatureCommon |
1894 implements FunctionSignature { | 1904 implements FunctionSignature { |
| 1905 final List<DartType> typeVariables; |
1895 final List<Element> requiredParameters; | 1906 final List<Element> requiredParameters; |
1896 final List<Element> optionalParameters; | 1907 final List<Element> optionalParameters; |
1897 final int requiredParameterCount; | 1908 final int requiredParameterCount; |
1898 final int optionalParameterCount; | 1909 final int optionalParameterCount; |
1899 final bool optionalParametersAreNamed; | 1910 final bool optionalParametersAreNamed; |
1900 final List<Element> orderedOptionalParameters; | 1911 final List<Element> orderedOptionalParameters; |
1901 final FunctionType type; | 1912 final FunctionType type; |
1902 final bool hasOptionalParameters; | 1913 final bool hasOptionalParameters; |
1903 | 1914 |
1904 FunctionSignatureX( | 1915 FunctionSignatureX( |
1905 {this.requiredParameters: const <Element>[], | 1916 {this.typeVariables: const <DartType>[], |
| 1917 this.requiredParameters: const <Element>[], |
1906 this.requiredParameterCount: 0, | 1918 this.requiredParameterCount: 0, |
1907 List<Element> optionalParameters: const <Element>[], | 1919 List<Element> optionalParameters: const <Element>[], |
1908 this.optionalParameterCount: 0, | 1920 this.optionalParameterCount: 0, |
1909 this.optionalParametersAreNamed: false, | 1921 this.optionalParametersAreNamed: false, |
1910 this.orderedOptionalParameters: const <Element>[], | 1922 this.orderedOptionalParameters: const <Element>[], |
1911 this.type}) | 1923 this.type}) |
1912 : optionalParameters = optionalParameters, | 1924 : optionalParameters = optionalParameters, |
1913 hasOptionalParameters = !optionalParameters.isEmpty; | 1925 hasOptionalParameters = !optionalParameters.isEmpty; |
1914 } | 1926 } |
1915 | 1927 |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1976 } | 1988 } |
1977 | 1989 |
1978 FunctionType get type { | 1990 FunctionType get type { |
1979 assert(invariant(this, typeCache != null, | 1991 assert(invariant(this, typeCache != null, |
1980 message: "Type has not been computed for $this.")); | 1992 message: "Type has not been computed for $this.")); |
1981 return typeCache; | 1993 return typeCache; |
1982 } | 1994 } |
1983 | 1995 |
1984 FunctionElement asFunctionElement() => this; | 1996 FunctionElement asFunctionElement() => this; |
1985 | 1997 |
| 1998 @override |
| 1999 Scope buildScope() => new TypeDeclarationScope(super.buildScope(), this); |
| 2000 |
1986 String toString() { | 2001 String toString() { |
1987 if (isPatch) { | 2002 if (isPatch) { |
1988 return 'patch ${super.toString()}'; | 2003 return 'patch ${super.toString()}'; |
1989 } else if (isPatched) { | 2004 } else if (isPatched) { |
1990 return 'origin ${super.toString()}'; | 2005 return 'origin ${super.toString()}'; |
1991 } else { | 2006 } else { |
1992 return super.toString(); | 2007 return super.toString(); |
1993 } | 2008 } |
1994 } | 2009 } |
1995 | 2010 |
1996 bool get isAbstract => false; | 2011 bool get isAbstract => false; |
1997 | 2012 |
1998 // A function is defined by the implementation element. | 2013 // A function is defined by the implementation element. |
1999 AstElement get definingElement => implementation; | 2014 AstElement get definingElement => implementation; |
| 2015 |
| 2016 @override |
| 2017 List<DartType> get typeVariables => functionSignature.typeVariables; |
2000 } | 2018 } |
2001 | 2019 |
2002 abstract class FunctionElementX extends BaseFunctionElementX | 2020 abstract class FunctionElementX extends BaseFunctionElementX |
2003 with AnalyzableElementX | 2021 with AnalyzableElementX |
2004 implements MethodElement { | 2022 implements MethodElement { |
2005 FunctionElementX( | 2023 FunctionElementX( |
2006 String name, ElementKind kind, Modifiers modifiers, Element enclosing) | 2024 String name, ElementKind kind, Modifiers modifiers, Element enclosing) |
2007 : super(name, kind, modifiers, enclosing); | 2025 : super(name, kind, modifiers, enclosing); |
2008 | 2026 |
2009 MemberElement get memberContext => this; | 2027 MemberElement get memberContext => this; |
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2147 } | 2165 } |
2148 } | 2166 } |
2149 | 2167 |
2150 bool get isFromEnvironmentConstructor { | 2168 bool get isFromEnvironmentConstructor { |
2151 return name == 'fromEnvironment' && | 2169 return name == 'fromEnvironment' && |
2152 library.isDartCore && | 2170 library.isDartCore && |
2153 (enclosingClass.name == 'bool' || | 2171 (enclosingClass.name == 'bool' || |
2154 enclosingClass.name == 'int' || | 2172 enclosingClass.name == 'int' || |
2155 enclosingClass.name == 'String'); | 2173 enclosingClass.name == 'String'); |
2156 } | 2174 } |
| 2175 |
| 2176 /// Returns the empty list of type variables by default. |
| 2177 @override |
| 2178 List<DartType> get typeVariables => functionSignature.typeVariables; |
2157 } | 2179 } |
2158 | 2180 |
2159 abstract class ConstructorElementX extends FunctionElementX | 2181 abstract class ConstructorElementX extends FunctionElementX |
2160 with ConstantConstructorMixin | 2182 with ConstantConstructorMixin |
2161 implements ConstructorElement { | 2183 implements ConstructorElement { |
2162 bool isRedirectingGenerative = false; | 2184 bool isRedirectingGenerative = false; |
2163 | 2185 |
2164 ConstructorElementX( | 2186 ConstructorElementX( |
2165 String name, ElementKind kind, Modifiers modifiers, Element enclosing) | 2187 String name, ElementKind kind, Modifiers modifiers, Element enclosing) |
2166 : super(name, kind, modifiers, enclosing); | 2188 : super(name, kind, modifiers, enclosing); |
(...skipping 940 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3107 | 3129 |
3108 class TypeVariableElementX extends ElementX | 3130 class TypeVariableElementX extends ElementX |
3109 with AstElementMixin | 3131 with AstElementMixin |
3110 implements TypeVariableElement { | 3132 implements TypeVariableElement { |
3111 final int index; | 3133 final int index; |
3112 final Node node; | 3134 final Node node; |
3113 TypeVariableType typeCache; | 3135 TypeVariableType typeCache; |
3114 DartType boundCache; | 3136 DartType boundCache; |
3115 | 3137 |
3116 TypeVariableElementX( | 3138 TypeVariableElementX( |
3117 String name, TypeDeclarationElement enclosing, this.index, this.node) | 3139 String name, GenericElement enclosing, this.index, this.node) |
3118 : super(name, ElementKind.TYPE_VARIABLE, enclosing); | 3140 : super(name, ElementKind.TYPE_VARIABLE, enclosing); |
3119 | 3141 |
3120 TypeDeclarationElement get typeDeclaration => enclosingElement; | 3142 GenericElement get typeDeclaration => enclosingElement; |
3121 | 3143 |
3122 TypeVariableType computeType(Resolution resolution) => type; | 3144 TypeVariableType computeType(Resolution resolution) => type; |
3123 | 3145 |
3124 TypeVariableType get type { | 3146 TypeVariableType get type { |
3125 assert(invariant(this, typeCache != null, | 3147 assert(invariant(this, typeCache != null, |
3126 message: "Type has not been set on $this.")); | 3148 message: "Type has not been set on $this.")); |
3127 return typeCache; | 3149 return typeCache; |
3128 } | 3150 } |
3129 | 3151 |
3130 DartType get bound { | 3152 DartType get bound { |
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3274 if (definingElement.isField) { | 3296 if (definingElement.isField) { |
3275 FieldElement field = definingElement; | 3297 FieldElement field = definingElement; |
3276 body = field.initializer; | 3298 body = field.initializer; |
3277 } else if (node != null && node.asFunctionExpression() != null) { | 3299 } else if (node != null && node.asFunctionExpression() != null) { |
3278 body = node.asFunctionExpression().body; | 3300 body = node.asFunctionExpression().body; |
3279 } | 3301 } |
3280 return new ParsedResolvedAst( | 3302 return new ParsedResolvedAst( |
3281 declaration, node, body, definingElement.treeElements); | 3303 declaration, node, body, definingElement.treeElements); |
3282 } | 3304 } |
3283 } | 3305 } |
OLD | NEW |