| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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'); | 5 #library('elements'); |
| 6 | 6 |
| 7 #import('dart:uri'); | 7 #import('dart:uri'); |
| 8 | 8 |
| 9 #import('../tree/tree.dart'); | 9 #import('../tree/tree.dart'); |
| 10 #import('../scanner/scannerlib.dart'); | 10 #import('../scanner/scannerlib.dart'); |
| (...skipping 975 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 986 * Creates the type variables, their type and corresponding element, for the | 986 * Creates the type variables, their type and corresponding element, for the |
| 987 * type variables declared in [parameter] on [element]. The bounds of the type | 987 * type variables declared in [parameter] on [element]. The bounds of the type |
| 988 * variables are not set until [element] has been resolved. | 988 * variables are not set until [element] has been resolved. |
| 989 */ | 989 */ |
| 990 static Link<Type> createTypeVariables(TypeDeclarationElement element, | 990 static Link<Type> createTypeVariables(TypeDeclarationElement element, |
| 991 NodeList parameters) { | 991 NodeList parameters) { |
| 992 if (parameters === null) return const EmptyLink<Type>(); | 992 if (parameters === null) return const EmptyLink<Type>(); |
| 993 | 993 |
| 994 // Create types and elements for type variable. | 994 // Create types and elements for type variable. |
| 995 var arguments = new LinkBuilder<Type>(); | 995 var arguments = new LinkBuilder<Type>(); |
| 996 for (Link<Node> link = parameters.nodes; !link.isEmpty(); link = link.tail)
{ | 996 for (Link link = parameters.nodes; !link.isEmpty(); link = link.tail) { |
| 997 TypeVariable node = link.head; | 997 TypeVariable node = link.head; |
| 998 SourceString variableName = node.name.source; | 998 SourceString variableName = node.name.source; |
| 999 TypeVariableElement variableElement = | 999 TypeVariableElement variableElement = |
| 1000 new TypeVariableElement(variableName, element, node); | 1000 new TypeVariableElement(variableName, element, node); |
| 1001 TypeVariableType variableType = new TypeVariableType(variableElement); | 1001 TypeVariableType variableType = new TypeVariableType(variableElement); |
| 1002 variableElement.type = variableType; | 1002 variableElement.type = variableType; |
| 1003 arguments.addLast(variableType); | 1003 arguments.addLast(variableType); |
| 1004 } | 1004 } |
| 1005 return arguments.toLink(); | 1005 return arguments.toLink(); |
| 1006 } | 1006 } |
| 1007 } | 1007 } |
| 1008 | 1008 |
| 1009 class ClassElement extends ScopeContainerElement | 1009 class ClassElement extends ScopeContainerElement |
| 1010 implements TypeDeclarationElement { | 1010 implements TypeDeclarationElement { |
| 1011 static final int STATE_NOT_STARTED = 0; | 1011 static final int STATE_NOT_STARTED = 0; |
| 1012 static final int STATE_STARTED = 1; | 1012 static final int STATE_STARTED = 1; |
| 1013 static final int STATE_DONE = 2; | 1013 static final int STATE_DONE = 2; |
| 1014 | 1014 |
| 1015 final int id; | 1015 final int id; |
| 1016 InterfaceType type; | 1016 InterfaceType type; |
| 1017 Type supertype; | 1017 Type supertype; |
| 1018 Type defaultClass; | 1018 Type defaultClass; |
| 1019 Link<Type> interfaces; | 1019 Link<Type> interfaces; |
| 1020 SourceString nativeName; | 1020 SourceString nativeName; |
| 1021 | 1021 int supertypeLoadState; |
| 1022 int _supertypeLoadState = STATE_NOT_STARTED; | 1022 int resolutionState; |
| 1023 int get supertypeLoadState() => _supertypeLoadState; | |
| 1024 void set supertypeLoadState(int state) { | |
| 1025 assert(state == _supertypeLoadState + 1); | |
| 1026 assert(state <= STATE_DONE); | |
| 1027 _supertypeLoadState = state; | |
| 1028 } | |
| 1029 | |
| 1030 int _resolutionState = STATE_NOT_STARTED; | |
| 1031 int get resolutionState() => _resolutionState; | |
| 1032 void set resolutionState(int state) { | |
| 1033 assert(state == _resolutionState + 1); | |
| 1034 assert(state <= STATE_DONE); | |
| 1035 _resolutionState = state; | |
| 1036 } | |
| 1037 | 1023 |
| 1038 // backendMembers are members that have been added by the backend to simplify | 1024 // backendMembers are members that have been added by the backend to simplify |
| 1039 // compilation. They don't have any user-side counter-part. | 1025 // compilation. They don't have any user-side counter-part. |
| 1040 Link<Element> backendMembers = const EmptyLink<Element>(); | 1026 Link<Element> backendMembers = const EmptyLink<Element>(); |
| 1041 | 1027 |
| 1042 Link<Type> allSupertypes; | 1028 Link<Type> allSupertypes; |
| 1043 | 1029 |
| 1044 // Lazily applied patch of class members. | 1030 // Lazily applied patch of class members. |
| 1045 ClassElement patch = null; | 1031 ClassElement patch = null; |
| 1046 | 1032 |
| 1047 ClassElement(SourceString name, Element enclosing, this.id) | 1033 ClassElement(SourceString name, Element enclosing, this.id, int initialState) |
| 1048 : super(name, ElementKind.CLASS, enclosing); | 1034 : supertypeLoadState = initialState, |
| 1035 resolutionState = initialState, |
| 1036 super(name, ElementKind.CLASS, enclosing); |
| 1049 | 1037 |
| 1050 InterfaceType computeType(compiler) { | 1038 InterfaceType computeType(compiler) { |
| 1051 if (type == null) { | 1039 if (type == null) { |
| 1052 ClassNode node = parseNode(compiler); | 1040 ClassNode node = parseNode(compiler); |
| 1053 Link<Type> parameters = | 1041 Link<Type> parameters = |
| 1054 TypeDeclarationElement.createTypeVariables(this, node.typeParameters); | 1042 TypeDeclarationElement.createTypeVariables(this, node.typeParameters); |
| 1055 type = new InterfaceType(this, parameters); | 1043 type = new InterfaceType(this, parameters); |
| 1056 } | 1044 } |
| 1057 return type; | 1045 return type; |
| 1058 } | 1046 } |
| (...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1510 Node parseNode(compiler) => cachedNode; | 1498 Node parseNode(compiler) => cachedNode; |
| 1511 | 1499 |
| 1512 String toString() => "${enclosingElement.toString()}.${name.slowToString()}"; | 1500 String toString() => "${enclosingElement.toString()}.${name.slowToString()}"; |
| 1513 | 1501 |
| 1514 TypeVariableElement cloneTo(Element enclosing, DiagnosticListener listener) { | 1502 TypeVariableElement cloneTo(Element enclosing, DiagnosticListener listener) { |
| 1515 TypeVariableElement result = | 1503 TypeVariableElement result = |
| 1516 new TypeVariableElement(name, enclosing, cachedNode, type, bound); | 1504 new TypeVariableElement(name, enclosing, cachedNode, type, bound); |
| 1517 return result; | 1505 return result; |
| 1518 } | 1506 } |
| 1519 } | 1507 } |
| OLD | NEW |