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 interface TreeElements { | 5 interface TreeElements { |
6 Element operator[](Node node); | 6 Element operator[](Node node); |
7 Selector getSelector(Send send); | 7 Selector getSelector(Send send); |
8 Type getType(TypeAnnotation annotation); | 8 DartType getType(TypeAnnotation annotation); |
9 } | 9 } |
10 | 10 |
11 class TreeElementMapping implements TreeElements { | 11 class TreeElementMapping implements TreeElements { |
12 Map<Node, Element> map; | 12 Map<Node, Element> map; |
13 Map<Node, Selector> selectors; | 13 Map<Node, Selector> selectors; |
14 Map<TypeAnnotation, Type> types; | 14 Map<TypeAnnotation, DartType> types; |
15 | 15 |
16 TreeElementMapping() | 16 TreeElementMapping() |
17 : map = new LinkedHashMap<Node, Element>(), | 17 : map = new LinkedHashMap<Node, Element>(), |
18 selectors = new LinkedHashMap<Node, Selector>(), | 18 selectors = new LinkedHashMap<Node, Selector>(), |
19 types = new LinkedHashMap<TypeAnnotation, Type>(); | 19 types = new LinkedHashMap<TypeAnnotation, DartType>(); |
20 | 20 |
21 operator []=(Node node, Element element) => map[node] = element; | 21 operator []=(Node node, Element element) => map[node] = element; |
22 operator [](Node node) => map[node]; | 22 operator [](Node node) => map[node]; |
23 void remove(Node node) { map.remove(node); } | 23 void remove(Node node) { map.remove(node); } |
24 | 24 |
25 void setType(TypeAnnotation annotation, Type type) { | 25 void setType(TypeAnnotation annotation, DartType type) { |
26 types[annotation] = type; | 26 types[annotation] = type; |
27 } | 27 } |
28 | 28 |
29 Type getType(TypeAnnotation annotation) => types[annotation]; | 29 DartType getType(TypeAnnotation annotation) => types[annotation]; |
30 | 30 |
31 void setSelector(Node node, Selector selector) { | 31 void setSelector(Node node, Selector selector) { |
32 selectors[node] = selector; | 32 selectors[node] = selector; |
33 } | 33 } |
34 | 34 |
35 Selector getSelector(Node node) => selectors[node]; | 35 Selector getSelector(Node node) => selectors[node]; |
36 } | 36 } |
37 | 37 |
38 class ResolverTask extends CompilerTask { | 38 class ResolverTask extends CompilerTask { |
39 ResolverTask(Compiler compiler) : super(compiler); | 39 ResolverTask(Compiler compiler) : super(compiler); |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
143 | 143 |
144 void visitBody(ResolverVisitor visitor, Statement body) { | 144 void visitBody(ResolverVisitor visitor, Statement body) { |
145 visitor.visit(body); | 145 visitor.visit(body); |
146 } | 146 } |
147 | 147 |
148 void resolveConstructorImplementation(FunctionElement constructor, | 148 void resolveConstructorImplementation(FunctionElement constructor, |
149 FunctionExpression node) { | 149 FunctionExpression node) { |
150 if (constructor.defaultImplementation !== constructor) return; | 150 if (constructor.defaultImplementation !== constructor) return; |
151 ClassElement intrface = constructor.getEnclosingClass(); | 151 ClassElement intrface = constructor.getEnclosingClass(); |
152 if (!intrface.isInterface()) return; | 152 if (!intrface.isInterface()) return; |
153 Type defaultType = intrface.defaultClass; | 153 DartType defaultType = intrface.defaultClass; |
154 if (defaultType === null) { | 154 if (defaultType === null) { |
155 error(node, MessageKind.NO_DEFAULT_CLASS, [intrface.name]); | 155 error(node, MessageKind.NO_DEFAULT_CLASS, [intrface.name]); |
156 } | 156 } |
157 ClassElement defaultClass = defaultType.element; | 157 ClassElement defaultClass = defaultType.element; |
158 defaultClass.ensureResolved(compiler); | 158 defaultClass.ensureResolved(compiler); |
159 assert(defaultClass.resolutionState == STATE_DONE); | 159 assert(defaultClass.resolutionState == STATE_DONE); |
160 assert(defaultClass.supertypeLoadState == STATE_DONE); | 160 assert(defaultClass.supertypeLoadState == STATE_DONE); |
161 if (defaultClass.isInterface()) { | 161 if (defaultClass.isInterface()) { |
162 error(node, MessageKind.CANNOT_INSTANTIATE_INTERFACE, | 162 error(node, MessageKind.CANNOT_INSTANTIATE_INTERFACE, |
163 [defaultClass.name]); | 163 [defaultClass.name]); |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
197 } | 197 } |
198 | 198 |
199 TreeElements resolveParameter(Element element) { | 199 TreeElements resolveParameter(Element element) { |
200 Node tree = element.parseNode(compiler); | 200 Node tree = element.parseNode(compiler); |
201 ResolverVisitor visitor = | 201 ResolverVisitor visitor = |
202 new ResolverVisitor(compiler, element.enclosingElement); | 202 new ResolverVisitor(compiler, element.enclosingElement); |
203 initializerDo(tree, visitor.visit); | 203 initializerDo(tree, visitor.visit); |
204 return visitor.mapping; | 204 return visitor.mapping; |
205 } | 205 } |
206 | 206 |
207 Type resolveTypeAnnotation(Element element, TypeAnnotation annotation) { | 207 DartType resolveTypeAnnotation(Element element, TypeAnnotation annotation) { |
208 if (annotation === null) return compiler.types.dynamicType; | 208 if (annotation === null) return compiler.types.dynamicType; |
209 ResolverVisitor visitor = new ResolverVisitor(compiler, element); | 209 ResolverVisitor visitor = new ResolverVisitor(compiler, element); |
210 Type result = visitor.resolveTypeAnnotation(annotation); | 210 DartType result = visitor.resolveTypeAnnotation(annotation); |
211 if (result === null) { | 211 if (result === null) { |
212 // TODO(karklose): warning. | 212 // TODO(karklose): warning. |
213 return compiler.types.dynamicType; | 213 return compiler.types.dynamicType; |
214 } | 214 } |
215 return result; | 215 return result; |
216 } | 216 } |
217 | 217 |
218 /** | 218 /** |
219 * Load and resolve the supertypes of [cls]. | 219 * Load and resolve the supertypes of [cls]. |
220 * | 220 * |
221 * Warning: do not call this method directly. It should only be | 221 * Warning: do not call this method directly. It should only be |
222 * called by [resolveClass] and [ClassSupertypeResolver]. | 222 * called by [resolveClass] and [ClassSupertypeResolver]. |
223 */ | 223 */ |
224 void loadSupertypes(ClassElement cls, Node from) { | 224 void loadSupertypes(ClassElement cls, Node from) { |
225 compiler.withCurrentElement(cls, () => measure(() { | 225 compiler.withCurrentElement(cls, () => measure(() { |
226 if (cls.supertypeLoadState == STATE_DONE) return; | 226 if (cls.supertypeLoadState == STATE_DONE) return; |
227 if (cls.supertypeLoadState == STATE_STARTED) { | 227 if (cls.supertypeLoadState == STATE_STARTED) { |
228 compiler.reportMessage( | 228 compiler.reportMessage( |
229 compiler.spanFromNode(from), | 229 compiler.spanFromNode(from), |
230 MessageKind.CYCLIC_CLASS_HIERARCHY.error([cls.name]), | 230 MessageKind.CYCLIC_CLASS_HIERARCHY.error([cls.name]), |
231 api.Diagnostic.ERROR); | 231 api.Diagnostic.ERROR); |
232 cls.supertypeLoadState = STATE_DONE; | 232 cls.supertypeLoadState = STATE_DONE; |
233 cls.allSupertypes = const EmptyLink<Type>().prepend( | 233 cls.allSupertypes = const EmptyLink<DartType>().prepend( |
234 compiler.objectClass.computeType(compiler)); | 234 compiler.objectClass.computeType(compiler)); |
235 // TODO(ahe): We should also set cls.supertype here to avoid | 235 // TODO(ahe): We should also set cls.supertype here to avoid |
236 // creating a malformed class hierarchy. | 236 // creating a malformed class hierarchy. |
237 return; | 237 return; |
238 } | 238 } |
239 cls.supertypeLoadState = STATE_STARTED; | 239 cls.supertypeLoadState = STATE_STARTED; |
240 compiler.withCurrentElement(cls, () { | 240 compiler.withCurrentElement(cls, () { |
241 // TODO(ahe): Cache the node in cls. | 241 // TODO(ahe): Cache the node in cls. |
242 cls.parseNode(compiler).accept(new ClassSupertypeResolver(compiler, | 242 cls.parseNode(compiler).accept(new ClassSupertypeResolver(compiler, |
243 cls)); | 243 cls)); |
(...skipping 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
420 visitor.visit(node); | 420 visitor.visit(node); |
421 | 421 |
422 element.isBeingResolved = false; | 422 element.isBeingResolved = false; |
423 element.isResolved = true; | 423 element.isResolved = true; |
424 }); | 424 }); |
425 }); | 425 }); |
426 } | 426 } |
427 | 427 |
428 FunctionType computeFunctionType(Element element, | 428 FunctionType computeFunctionType(Element element, |
429 FunctionSignature signature) { | 429 FunctionSignature signature) { |
430 LinkBuilder<Type> parameterTypes = new LinkBuilder<Type>(); | 430 LinkBuilder<DartType> parameterTypes = new LinkBuilder<DartType>(); |
431 for (Link<Element> link = signature.requiredParameters; | 431 for (Link<Element> link = signature.requiredParameters; |
432 !link.isEmpty(); | 432 !link.isEmpty(); |
433 link = link.tail) { | 433 link = link.tail) { |
434 parameterTypes.addLast(link.head.computeType(compiler)); | 434 parameterTypes.addLast(link.head.computeType(compiler)); |
435 // TODO(karlklose): optional parameters. | 435 // TODO(karlklose): optional parameters. |
436 } | 436 } |
437 return new FunctionType(signature.returnType, | 437 return new FunctionType(signature.returnType, |
438 parameterTypes.toLink(), | 438 parameterTypes.toLink(), |
439 element); | 439 element); |
440 } | 440 } |
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
835 } | 835 } |
836 } else { | 836 } else { |
837 return scope.lookup(typeName.source); | 837 return scope.lookup(typeName.source); |
838 } | 838 } |
839 } | 839 } |
840 | 840 |
841 // TODO(johnniwinther): Change [onFailure] and [whenResolved] to use boolean | 841 // TODO(johnniwinther): Change [onFailure] and [whenResolved] to use boolean |
842 // flags instead of closures. | 842 // flags instead of closures. |
843 // TODO(johnniwinther): Should never return [null] but instead an erroneous | 843 // TODO(johnniwinther): Should never return [null] but instead an erroneous |
844 // type. | 844 // type. |
845 Type resolveTypeAnnotation(TypeAnnotation node, | 845 DartType resolveTypeAnnotation(TypeAnnotation node, |
846 [Scope inScope, ClassElement inClass, | 846 [Scope inScope, ClassElement inClass, |
847 onFailure(Node, MessageKind, [List arguments]), | 847 onFailure(Node, MessageKind, [List arguments]), |
848 whenResolved(Node, Type)]) { | 848 whenResolved(Node, Type)]) { |
849 if (onFailure === null) { | 849 if (onFailure === null) { |
850 onFailure = (n, k, [arguments]) {}; | 850 onFailure = (n, k, [arguments]) {}; |
851 } | 851 } |
852 if (whenResolved === null) { | 852 if (whenResolved === null) { |
853 whenResolved = (n, t) {}; | 853 whenResolved = (n, t) {}; |
854 } | 854 } |
855 if (inClass !== null) { | 855 if (inClass !== null) { |
856 inScope = inClass.buildScope(); | 856 inScope = inClass.buildScope(); |
857 } | 857 } |
858 if (inScope === null) { | 858 if (inScope === null) { |
859 compiler.internalError('resolveTypeAnnotation: no scope specified'); | 859 compiler.internalError('resolveTypeAnnotation: no scope specified'); |
860 } | 860 } |
861 return resolveTypeAnnotationInContext(inScope, node, onFailure, | 861 return resolveTypeAnnotationInContext(inScope, node, onFailure, |
862 whenResolved); | 862 whenResolved); |
863 } | 863 } |
864 | 864 |
865 Type resolveTypeAnnotationInContext(Scope scope, TypeAnnotation node, | 865 DartType resolveTypeAnnotationInContext(Scope scope, TypeAnnotation node, |
866 onFailure, whenResolved) { | 866 onFailure, whenResolved) { |
867 Element element = resolveTypeName(scope, node); | 867 Element element = resolveTypeName(scope, node); |
868 Type type; | 868 DartType type; |
869 if (element === null) { | 869 if (element === null) { |
870 onFailure(node, MessageKind.CANNOT_RESOLVE_TYPE, [node.typeName]); | 870 onFailure(node, MessageKind.CANNOT_RESOLVE_TYPE, [node.typeName]); |
871 } else if (!element.impliesType()) { | 871 } else if (!element.impliesType()) { |
872 onFailure(node, MessageKind.NOT_A_TYPE, [node.typeName]); | 872 onFailure(node, MessageKind.NOT_A_TYPE, [node.typeName]); |
873 } else { | 873 } else { |
874 if (element === compiler.types.voidType.element || | 874 if (element === compiler.types.voidType.element || |
875 element === compiler.types.dynamicType.element) { | 875 element === compiler.types.dynamicType.element) { |
876 type = element.computeType(compiler); | 876 type = element.computeType(compiler); |
877 } else if (element.isClass()) { | 877 } else if (element.isClass()) { |
878 ClassElement cls = element; | 878 ClassElement cls = element; |
879 cls.ensureResolved(compiler); | 879 cls.ensureResolved(compiler); |
880 Link<Type> arguments = | 880 Link<DartType> arguments = |
881 resolveTypeArguments(node, cls.typeVariables, scope, | 881 resolveTypeArguments(node, cls.typeVariables, scope, |
882 onFailure, whenResolved); | 882 onFailure, whenResolved); |
883 if (cls.typeVariables.isEmpty() && arguments.isEmpty()) { | 883 if (cls.typeVariables.isEmpty() && arguments.isEmpty()) { |
884 // Use the canonical type if it has no type parameters. | 884 // Use the canonical type if it has no type parameters. |
885 type = cls.computeType(compiler); | 885 type = cls.computeType(compiler); |
886 } else { | 886 } else { |
887 type = new InterfaceType(cls, arguments); | 887 type = new InterfaceType(cls, arguments); |
888 } | 888 } |
889 } else if (element.isTypedef()) { | 889 } else if (element.isTypedef()) { |
890 TypedefElement typdef = element; | 890 TypedefElement typdef = element; |
891 // TODO(ahe): Should be [ensureResolved]. | 891 // TODO(ahe): Should be [ensureResolved]. |
892 compiler.resolveTypedef(typdef); | 892 compiler.resolveTypedef(typdef); |
893 typdef.computeType(compiler); | 893 typdef.computeType(compiler); |
894 Link<Type> arguments = resolveTypeArguments( | 894 Link<DartType> arguments = resolveTypeArguments( |
895 node, typdef.typeVariables, | 895 node, typdef.typeVariables, |
896 scope, onFailure, whenResolved); | 896 scope, onFailure, whenResolved); |
897 if (typdef.typeVariables.isEmpty() && arguments.isEmpty()) { | 897 if (typdef.typeVariables.isEmpty() && arguments.isEmpty()) { |
898 // Return the canonical type if it has no type parameters. | 898 // Return the canonical type if it has no type parameters. |
899 type = typdef.computeType(compiler); | 899 type = typdef.computeType(compiler); |
900 } else { | 900 } else { |
901 type = new TypedefType(typdef, arguments); | 901 type = new TypedefType(typdef, arguments); |
902 } | 902 } |
903 } else if (element.isTypeVariable()) { | 903 } else if (element.isTypeVariable()) { |
904 type = element.computeType(compiler); | 904 type = element.computeType(compiler); |
905 } else { | 905 } else { |
906 compiler.cancel("unexpected element kind ${element.kind}", | 906 compiler.cancel("unexpected element kind ${element.kind}", |
907 node: node); | 907 node: node); |
908 } | 908 } |
909 } | 909 } |
910 whenResolved(node, type); | 910 whenResolved(node, type); |
911 return type; | 911 return type; |
912 } | 912 } |
913 | 913 |
914 Link<Type> resolveTypeArguments(TypeAnnotation node, | 914 Link<DartType> resolveTypeArguments(TypeAnnotation node, |
915 Link<Type> typeVariables, | 915 Link<DartType> typeVariables, |
916 Scope scope, onFailure, whenResolved) { | 916 Scope scope, onFailure, whenResolved) { |
917 if (node.typeArguments == null) { | 917 if (node.typeArguments == null) { |
918 return const EmptyLink<Type>(); | 918 return const EmptyLink<DartType>(); |
919 } | 919 } |
920 var arguments = new LinkBuilder<Type>(); | 920 var arguments = new LinkBuilder<DartType>(); |
921 for (Link<Node> typeArguments = node.typeArguments.nodes; | 921 for (Link<Node> typeArguments = node.typeArguments.nodes; |
922 !typeArguments.isEmpty(); | 922 !typeArguments.isEmpty(); |
923 typeArguments = typeArguments.tail) { | 923 typeArguments = typeArguments.tail) { |
924 if (typeVariables.isEmpty()) { | 924 if (typeVariables.isEmpty()) { |
925 onFailure(typeArguments.head, MessageKind.ADDITIONAL_TYPE_ARGUMENT); | 925 onFailure(typeArguments.head, MessageKind.ADDITIONAL_TYPE_ARGUMENT); |
926 } | 926 } |
927 Type argType = resolveTypeAnnotationInContext(scope, | 927 DartType argType = resolveTypeAnnotationInContext(scope, |
928 typeArguments.head, | 928 typeArguments.head, |
929 onFailure, | 929 onFailure, |
930 whenResolved); | 930 whenResolved); |
931 arguments.addLast(argType); | 931 arguments.addLast(argType); |
932 if (!typeVariables.isEmpty()) { | 932 if (!typeVariables.isEmpty()) { |
933 typeVariables = typeVariables.tail; | 933 typeVariables = typeVariables.tail; |
934 } | 934 } |
935 } | 935 } |
936 if (!typeVariables.isEmpty()) { | 936 if (!typeVariables.isEmpty()) { |
937 onFailure(node.typeArguments, MessageKind.MISSING_TYPE_ARGUMENT); | 937 onFailure(node.typeArguments, MessageKind.MISSING_TYPE_ARGUMENT); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1022 if ((element.kind.category & allowedCategory) == 0) { | 1022 if ((element.kind.category & allowedCategory) == 0) { |
1023 // TODO(ahe): Improve error message. Need UX input. | 1023 // TODO(ahe): Improve error message. Need UX input. |
1024 error(node, MessageKind.GENERIC, ["is not an expression $element"]); | 1024 error(node, MessageKind.GENERIC, ["is not an expression $element"]); |
1025 } | 1025 } |
1026 } | 1026 } |
1027 return useElement(node, element); | 1027 return useElement(node, element); |
1028 } | 1028 } |
1029 } | 1029 } |
1030 | 1030 |
1031 Element visitTypeAnnotation(TypeAnnotation node) { | 1031 Element visitTypeAnnotation(TypeAnnotation node) { |
1032 Type type = resolveTypeAnnotation(node); | 1032 DartType type = resolveTypeAnnotation(node); |
1033 if (type !== null) return type.element; | 1033 if (type !== null) return type.element; |
1034 return null; | 1034 return null; |
1035 } | 1035 } |
1036 | 1036 |
1037 Element defineElement(Node node, Element element, | 1037 Element defineElement(Node node, Element element, |
1038 [bool doAddToScope = true]) { | 1038 [bool doAddToScope = true]) { |
1039 compiler.ensure(element !== null); | 1039 compiler.ensure(element !== null); |
1040 mapping[node] = element; | 1040 mapping[node] = element; |
1041 if (doAddToScope) { | 1041 if (doAddToScope) { |
1042 Element existing = scope.add(element); | 1042 Element existing = scope.add(element); |
1043 if (existing != element) { | 1043 if (existing != element) { |
1044 error(node, MessageKind.DUPLICATE_DEFINITION, [node]); | 1044 error(node, MessageKind.DUPLICATE_DEFINITION, [node]); |
1045 } | 1045 } |
1046 } | 1046 } |
1047 return element; | 1047 return element; |
1048 } | 1048 } |
1049 | 1049 |
1050 Element useElement(Node node, Element element) { | 1050 Element useElement(Node node, Element element) { |
1051 if (element === null) return null; | 1051 if (element === null) return null; |
1052 return mapping[node] = element; | 1052 return mapping[node] = element; |
1053 } | 1053 } |
1054 | 1054 |
1055 Type useType(TypeAnnotation annotation, Type type) { | 1055 DartType useType(TypeAnnotation annotation, DartType type) { |
1056 if (type !== null) { | 1056 if (type !== null) { |
1057 mapping.setType(annotation, type); | 1057 mapping.setType(annotation, type); |
1058 useElement(annotation, type.element); | 1058 useElement(annotation, type.element); |
1059 } | 1059 } |
1060 return type; | 1060 return type; |
1061 } | 1061 } |
1062 | 1062 |
1063 void setupFunction(FunctionExpression node, FunctionElement function) { | 1063 void setupFunction(FunctionExpression node, FunctionElement function) { |
1064 scope = new MethodScope(scope, function); | 1064 scope = new MethodScope(scope, function); |
1065 // Put the parameters in scope. | 1065 // Put the parameters in scope. |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1235 } else if (resolvedReceiver.kind === ElementKind.PREFIX) { | 1235 } else if (resolvedReceiver.kind === ElementKind.PREFIX) { |
1236 PrefixElement prefix = resolvedReceiver; | 1236 PrefixElement prefix = resolvedReceiver; |
1237 target = prefix.lookupLocalMember(name); | 1237 target = prefix.lookupLocalMember(name); |
1238 if (target == null) { | 1238 if (target == null) { |
1239 error(node, MessageKind.NO_SUCH_LIBRARY_MEMBER, [prefix.name, name]); | 1239 error(node, MessageKind.NO_SUCH_LIBRARY_MEMBER, [prefix.name, name]); |
1240 } | 1240 } |
1241 } | 1241 } |
1242 return target; | 1242 return target; |
1243 } | 1243 } |
1244 | 1244 |
1245 Type resolveTypeTest(Node argument) { | 1245 DartType resolveTypeTest(Node argument) { |
1246 TypeAnnotation node = argument.asTypeAnnotation(); | 1246 TypeAnnotation node = argument.asTypeAnnotation(); |
1247 if (node === null) { | 1247 if (node === null) { |
1248 // node is of the form !Type. | 1248 // node is of the form !Type. |
1249 node = argument.asSend().receiver.asTypeAnnotation(); | 1249 node = argument.asSend().receiver.asTypeAnnotation(); |
1250 if (node === null) compiler.cancel("malformed send"); | 1250 if (node === null) compiler.cancel("malformed send"); |
1251 } | 1251 } |
1252 return resolveTypeRequired(node); | 1252 return resolveTypeRequired(node); |
1253 } | 1253 } |
1254 | 1254 |
1255 static Selector computeSendSelector(Send node, LibraryElement library) { | 1255 static Selector computeSendSelector(Send node, LibraryElement library) { |
(...skipping 322 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1578 } else { | 1578 } else { |
1579 // Resolve and store the type this annotation resolves to. The type | 1579 // Resolve and store the type this annotation resolves to. The type |
1580 // is used in the backend, e.g., for creating runtime type information. | 1580 // is used in the backend, e.g., for creating runtime type information. |
1581 // TODO(karlklose): This will resolve the class element again. Refactor | 1581 // TODO(karlklose): This will resolve the class element again. Refactor |
1582 // so we can use the TypeResolver. | 1582 // so we can use the TypeResolver. |
1583 resolveTypeRequired(annotation); | 1583 resolveTypeRequired(annotation); |
1584 } | 1584 } |
1585 return constructor; | 1585 return constructor; |
1586 } | 1586 } |
1587 | 1587 |
1588 Type resolveTypeRequired(TypeAnnotation node) { | 1588 DartType resolveTypeRequired(TypeAnnotation node) { |
1589 bool old = typeRequired; | 1589 bool old = typeRequired; |
1590 typeRequired = true; | 1590 typeRequired = true; |
1591 Type result = resolveTypeAnnotation(node); | 1591 DartType result = resolveTypeAnnotation(node); |
1592 typeRequired = old; | 1592 typeRequired = old; |
1593 return result; | 1593 return result; |
1594 } | 1594 } |
1595 | 1595 |
1596 Type resolveTypeAnnotation(TypeAnnotation node) { | 1596 DartType resolveTypeAnnotation(TypeAnnotation node) { |
1597 Function report = typeRequired ? error : warning; | 1597 Function report = typeRequired ? error : warning; |
1598 return typeResolver.resolveTypeAnnotation(node, inScope: scope, | 1598 return typeResolver.resolveTypeAnnotation(node, inScope: scope, |
1599 onFailure: report, | 1599 onFailure: report, |
1600 whenResolved: useType); | 1600 whenResolved: useType); |
1601 } | 1601 } |
1602 | 1602 |
1603 visitModifiers(Modifiers node) { | 1603 visitModifiers(Modifiers node) { |
1604 // TODO(ngeoffray): Implement this. | 1604 // TODO(ngeoffray): Implement this. |
1605 unimplemented(node, 'modifiers'); | 1605 unimplemented(node, 'modifiers'); |
1606 } | 1606 } |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1851 visitIn(node.type, blockScope); | 1851 visitIn(node.type, blockScope); |
1852 visitIn(node.formals, blockScope); | 1852 visitIn(node.formals, blockScope); |
1853 visitIn(node.block, blockScope); | 1853 visitIn(node.block, blockScope); |
1854 } | 1854 } |
1855 | 1855 |
1856 visitTypedef(Typedef node) { | 1856 visitTypedef(Typedef node) { |
1857 unimplemented(node, 'typedef'); | 1857 unimplemented(node, 'typedef'); |
1858 } | 1858 } |
1859 } | 1859 } |
1860 | 1860 |
1861 class TypeDefinitionVisitor extends CommonResolverVisitor<Type> { | 1861 class TypeDefinitionVisitor extends CommonResolverVisitor<DartType> { |
1862 Scope scope; | 1862 Scope scope; |
1863 TypeDeclarationElement element; | 1863 TypeDeclarationElement element; |
1864 TypeResolver typeResolver; | 1864 TypeResolver typeResolver; |
1865 | 1865 |
1866 TypeDefinitionVisitor(Compiler compiler, TypeDeclarationElement element) | 1866 TypeDefinitionVisitor(Compiler compiler, TypeDeclarationElement element) |
1867 : this.element = element, | 1867 : this.element = element, |
1868 scope = element.buildEnclosingScope(), | 1868 scope = element.buildEnclosingScope(), |
1869 typeResolver = new TypeResolver(compiler), | 1869 typeResolver = new TypeResolver(compiler), |
1870 super(compiler); | 1870 super(compiler); |
1871 | 1871 |
1872 void resolveTypeVariableBounds(NodeList node) { | 1872 void resolveTypeVariableBounds(NodeList node) { |
1873 if (node === null) return; | 1873 if (node === null) return; |
1874 | 1874 |
1875 var nameSet = new Set<SourceString>(); | 1875 var nameSet = new Set<SourceString>(); |
1876 // Resolve the bounds of type variables. | 1876 // Resolve the bounds of type variables. |
1877 Link<Type> typeLink = element.typeVariables; | 1877 Link<DartType> typeLink = element.typeVariables; |
1878 Link<Node> nodeLink = node.nodes; | 1878 Link<Node> nodeLink = node.nodes; |
1879 while (!nodeLink.isEmpty()) { | 1879 while (!nodeLink.isEmpty()) { |
1880 TypeVariableType typeVariable = typeLink.head; | 1880 TypeVariableType typeVariable = typeLink.head; |
1881 SourceString typeName = typeVariable.name; | 1881 SourceString typeName = typeVariable.name; |
1882 TypeVariable typeNode = nodeLink.head; | 1882 TypeVariable typeNode = nodeLink.head; |
1883 if (nameSet.contains(typeName)) { | 1883 if (nameSet.contains(typeName)) { |
1884 error(typeNode, MessageKind.DUPLICATE_TYPE_VARIABLE_NAME, [typeName]); | 1884 error(typeNode, MessageKind.DUPLICATE_TYPE_VARIABLE_NAME, [typeName]); |
1885 } | 1885 } |
1886 nameSet.add(typeName); | 1886 nameSet.add(typeName); |
1887 | 1887 |
1888 TypeVariableElement variableElement = typeVariable.element; | 1888 TypeVariableElement variableElement = typeVariable.element; |
1889 if (typeNode.bound !== null) { | 1889 if (typeNode.bound !== null) { |
1890 Type boundType = typeResolver.resolveTypeAnnotation( | 1890 DartType boundType = typeResolver.resolveTypeAnnotation( |
1891 typeNode.bound, inScope: scope, onFailure: warning); | 1891 typeNode.bound, inScope: scope, onFailure: warning); |
1892 if (boundType !== null && boundType.element == variableElement) { | 1892 if (boundType !== null && boundType.element == variableElement) { |
1893 // TODO(johnniwinther): Check for more general cycles, like | 1893 // TODO(johnniwinther): Check for more general cycles, like |
1894 // [: <A extends B, B extends C, C extends B> :]. | 1894 // [: <A extends B, B extends C, C extends B> :]. |
1895 warning(node, MessageKind.CYCLIC_TYPE_VARIABLE, | 1895 warning(node, MessageKind.CYCLIC_TYPE_VARIABLE, |
1896 [variableElement.name]); | 1896 [variableElement.name]); |
1897 } else if (boundType !== null) { | 1897 } else if (boundType !== null) { |
1898 variableElement.bound = boundType; | 1898 variableElement.bound = boundType; |
1899 } else { | 1899 } else { |
1900 // TODO(johnniwinther): Should be an erroneous type. | 1900 // TODO(johnniwinther): Should be an erroneous type. |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1942 * resolved, but it cannot call [ResolverTask.resolveClass] directly | 1942 * resolved, but it cannot call [ResolverTask.resolveClass] directly |
1943 * or indirectly (through [ClassElement.ensureResolved]) for any other | 1943 * or indirectly (through [ClassElement.ensureResolved]) for any other |
1944 * types. | 1944 * types. |
1945 */ | 1945 */ |
1946 class ClassResolverVisitor extends TypeDefinitionVisitor { | 1946 class ClassResolverVisitor extends TypeDefinitionVisitor { |
1947 ClassElement get element => super.element; | 1947 ClassElement get element => super.element; |
1948 | 1948 |
1949 ClassResolverVisitor(Compiler compiler, ClassElement classElement) | 1949 ClassResolverVisitor(Compiler compiler, ClassElement classElement) |
1950 : super(compiler, classElement); | 1950 : super(compiler, classElement); |
1951 | 1951 |
1952 Type visitClassNode(ClassNode node) { | 1952 DartType visitClassNode(ClassNode node) { |
1953 compiler.ensure(element !== null); | 1953 compiler.ensure(element !== null); |
1954 compiler.ensure(element.resolutionState == STATE_STARTED); | 1954 compiler.ensure(element.resolutionState == STATE_STARTED); |
1955 | 1955 |
1956 InterfaceType type = element.computeType(compiler); | 1956 InterfaceType type = element.computeType(compiler); |
1957 scope = new TypeDeclarationScope(scope, element); | 1957 scope = new TypeDeclarationScope(scope, element); |
1958 // TODO(ahe): It is not safe to call resolveTypeVariableBounds yet. | 1958 // TODO(ahe): It is not safe to call resolveTypeVariableBounds yet. |
1959 // As a side-effect, this may get us back here trying to | 1959 // As a side-effect, this may get us back here trying to |
1960 // resolve this class again. | 1960 // resolve this class again. |
1961 resolveTypeVariableBounds(node.typeParameters); | 1961 resolveTypeVariableBounds(node.typeParameters); |
1962 | 1962 |
1963 // Find super type. | 1963 // Find super type. |
1964 Type supertype = visit(node.superclass); | 1964 DartType supertype = visit(node.superclass); |
1965 if (supertype !== null && supertype.element.isExtendable()) { | 1965 if (supertype !== null && supertype.element.isExtendable()) { |
1966 element.supertype = supertype; | 1966 element.supertype = supertype; |
1967 if (isBlackListed(supertype)) { | 1967 if (isBlackListed(supertype)) { |
1968 error(node.superclass, MessageKind.CANNOT_EXTEND, [supertype]); | 1968 error(node.superclass, MessageKind.CANNOT_EXTEND, [supertype]); |
1969 } | 1969 } |
1970 } else if (supertype !== null) { | 1970 } else if (supertype !== null) { |
1971 error(node.superclass, MessageKind.TYPE_NAME_EXPECTED); | 1971 error(node.superclass, MessageKind.TYPE_NAME_EXPECTED); |
1972 } | 1972 } |
1973 final objectElement = compiler.objectClass; | 1973 final objectElement = compiler.objectClass; |
1974 if (element !== objectElement && element.supertype === null) { | 1974 if (element !== objectElement && element.supertype === null) { |
1975 if (objectElement === null) { | 1975 if (objectElement === null) { |
1976 compiler.internalError("Internal error: cannot resolve Object", | 1976 compiler.internalError("Internal error: cannot resolve Object", |
1977 node: node); | 1977 node: node); |
1978 } else { | 1978 } else { |
1979 objectElement.ensureResolved(compiler); | 1979 objectElement.ensureResolved(compiler); |
1980 } | 1980 } |
1981 // TODO(ahe): This should be objectElement.computeType(...). | 1981 // TODO(ahe): This should be objectElement.computeType(...). |
1982 element.supertype = new InterfaceType(objectElement); | 1982 element.supertype = new InterfaceType(objectElement); |
1983 } | 1983 } |
1984 assert(element.interfaces === null); | 1984 assert(element.interfaces === null); |
1985 Link<Type> interfaces = const EmptyLink<Type>(); | 1985 Link<DartType> interfaces = const EmptyLink<DartType>(); |
1986 for (Link<Node> link = node.interfaces.nodes; | 1986 for (Link<Node> link = node.interfaces.nodes; |
1987 !link.isEmpty(); | 1987 !link.isEmpty(); |
1988 link = link.tail) { | 1988 link = link.tail) { |
1989 Type interfaceType = visit(link.head); | 1989 DartType interfaceType = visit(link.head); |
1990 if (interfaceType !== null && interfaceType.element.isExtendable()) { | 1990 if (interfaceType !== null && interfaceType.element.isExtendable()) { |
1991 interfaces = interfaces.prepend(interfaceType); | 1991 interfaces = interfaces.prepend(interfaceType); |
1992 if (isBlackListed(interfaceType)) { | 1992 if (isBlackListed(interfaceType)) { |
1993 error(link.head, MessageKind.CANNOT_IMPLEMENT, [interfaceType]); | 1993 error(link.head, MessageKind.CANNOT_IMPLEMENT, [interfaceType]); |
1994 } | 1994 } |
1995 } else { | 1995 } else { |
1996 error(link.head, MessageKind.TYPE_NAME_EXPECTED); | 1996 error(link.head, MessageKind.TYPE_NAME_EXPECTED); |
1997 } | 1997 } |
1998 } | 1998 } |
1999 element.interfaces = interfaces; | 1999 element.interfaces = interfaces; |
2000 calculateAllSupertypes(element); | 2000 calculateAllSupertypes(element); |
2001 | 2001 |
2002 if (node.defaultClause !== null) { | 2002 if (node.defaultClause !== null) { |
2003 element.defaultClass = visit(node.defaultClause); | 2003 element.defaultClass = visit(node.defaultClause); |
2004 } | 2004 } |
2005 addDefaultConstructorIfNeeded(element); | 2005 addDefaultConstructorIfNeeded(element); |
2006 return element.computeType(compiler); | 2006 return element.computeType(compiler); |
2007 } | 2007 } |
2008 | 2008 |
2009 Type visitTypeAnnotation(TypeAnnotation node) { | 2009 DartType visitTypeAnnotation(TypeAnnotation node) { |
2010 return visit(node.typeName); | 2010 return visit(node.typeName); |
2011 } | 2011 } |
2012 | 2012 |
2013 Type visitIdentifier(Identifier node) { | 2013 DartType visitIdentifier(Identifier node) { |
2014 Element element = scope.lookup(node.source); | 2014 Element element = scope.lookup(node.source); |
2015 if (element === null) { | 2015 if (element === null) { |
2016 error(node, MessageKind.CANNOT_RESOLVE_TYPE, [node]); | 2016 error(node, MessageKind.CANNOT_RESOLVE_TYPE, [node]); |
2017 return null; | 2017 return null; |
2018 } else if (!element.impliesType() && !element.isTypeVariable()) { | 2018 } else if (!element.impliesType() && !element.isTypeVariable()) { |
2019 error(node, MessageKind.NOT_A_TYPE, [node]); | 2019 error(node, MessageKind.NOT_A_TYPE, [node]); |
2020 return null; | 2020 return null; |
2021 } else { | 2021 } else { |
2022 if (element.isTypeVariable()) { | 2022 if (element.isTypeVariable()) { |
2023 TypeVariableElement variableElement = element; | 2023 TypeVariableElement variableElement = element; |
2024 return variableElement.type; | 2024 return variableElement.type; |
2025 } else if (element.isTypedef()) { | 2025 } else if (element.isTypedef()) { |
2026 compiler.unimplemented('visitIdentifier for typedefs', node: node); | 2026 compiler.unimplemented('visitIdentifier for typedefs', node: node); |
2027 } else { | 2027 } else { |
2028 // TODO(ngeoffray): Use type variables. | 2028 // TODO(ngeoffray): Use type variables. |
2029 return element.computeType(compiler); | 2029 return element.computeType(compiler); |
2030 } | 2030 } |
2031 } | 2031 } |
2032 return null; | 2032 return null; |
2033 } | 2033 } |
2034 | 2034 |
2035 Type visitSend(Send node) { | 2035 DartType visitSend(Send node) { |
2036 Identifier prefix = node.receiver.asIdentifier(); | 2036 Identifier prefix = node.receiver.asIdentifier(); |
2037 if (prefix === null) { | 2037 if (prefix === null) { |
2038 error(node.receiver, MessageKind.NOT_A_PREFIX, [node.receiver]); | 2038 error(node.receiver, MessageKind.NOT_A_PREFIX, [node.receiver]); |
2039 return null; | 2039 return null; |
2040 } | 2040 } |
2041 Element element = scope.lookup(prefix.source); | 2041 Element element = scope.lookup(prefix.source); |
2042 if (element === null || element.kind !== ElementKind.PREFIX) { | 2042 if (element === null || element.kind !== ElementKind.PREFIX) { |
2043 error(node.receiver, MessageKind.NOT_A_PREFIX, [node.receiver]); | 2043 error(node.receiver, MessageKind.NOT_A_PREFIX, [node.receiver]); |
2044 return null; | 2044 return null; |
2045 } | 2045 } |
2046 PrefixElement prefixElement = element; | 2046 PrefixElement prefixElement = element; |
2047 Identifier selector = node.selector.asIdentifier(); | 2047 Identifier selector = node.selector.asIdentifier(); |
2048 var e = prefixElement.lookupLocalMember(selector.source); | 2048 var e = prefixElement.lookupLocalMember(selector.source); |
2049 if (e === null || !e.impliesType()) { | 2049 if (e === null || !e.impliesType()) { |
2050 error(node.selector, MessageKind.CANNOT_RESOLVE_TYPE, [node.selector]); | 2050 error(node.selector, MessageKind.CANNOT_RESOLVE_TYPE, [node.selector]); |
2051 return null; | 2051 return null; |
2052 } | 2052 } |
2053 return e.computeType(compiler); | 2053 return e.computeType(compiler); |
2054 } | 2054 } |
2055 | 2055 |
2056 void calculateAllSupertypes(ClassElement cls) { | 2056 void calculateAllSupertypes(ClassElement cls) { |
2057 // TODO(karlklose): substitute type variables. | 2057 // TODO(karlklose): substitute type variables. |
2058 // TODO(karlklose): check if type arguments match, if a classelement occurs | 2058 // TODO(karlklose): check if type arguments match, if a classelement occurs |
2059 // more than once in the supertypes. | 2059 // more than once in the supertypes. |
2060 if (cls.allSupertypes !== null) return; | 2060 if (cls.allSupertypes !== null) return; |
2061 final Type supertype = cls.supertype; | 2061 final DartType supertype = cls.supertype; |
2062 if (supertype != null) { | 2062 if (supertype != null) { |
2063 ClassElement superElement = supertype.element; | 2063 ClassElement superElement = supertype.element; |
2064 Link<Type> superSupertypes = superElement.allSupertypes; | 2064 Link<DartType> superSupertypes = superElement.allSupertypes; |
2065 assert(superSupertypes !== null); | 2065 assert(superSupertypes !== null); |
2066 Link<Type> supertypes = new Link<Type>(supertype, superSupertypes); | 2066 Link<DartType> supertypes = |
2067 for (Link<Type> interfaces = cls.interfaces; | 2067 new Link<DartType>(supertype, superSupertypes); |
| 2068 for (Link<DartType> interfaces = cls.interfaces; |
2068 !interfaces.isEmpty(); | 2069 !interfaces.isEmpty(); |
2069 interfaces = interfaces.tail) { | 2070 interfaces = interfaces.tail) { |
2070 ClassElement element = interfaces.head.element; | 2071 ClassElement element = interfaces.head.element; |
2071 Link<Type> interfaceSupertypes = element.allSupertypes; | 2072 Link<DartType> interfaceSupertypes = element.allSupertypes; |
2072 assert(interfaceSupertypes !== null); | 2073 assert(interfaceSupertypes !== null); |
2073 supertypes = supertypes.reversePrependAll(interfaceSupertypes); | 2074 supertypes = supertypes.reversePrependAll(interfaceSupertypes); |
2074 supertypes = supertypes.prepend(interfaces.head); | 2075 supertypes = supertypes.prepend(interfaces.head); |
2075 } | 2076 } |
2076 cls.allSupertypes = supertypes; | 2077 cls.allSupertypes = supertypes; |
2077 } else { | 2078 } else { |
2078 assert(cls === compiler.objectClass); | 2079 assert(cls === compiler.objectClass); |
2079 cls.allSupertypes = const EmptyLink<Type>(); | 2080 cls.allSupertypes = const EmptyLink<DartType>(); |
2080 } | 2081 } |
2081 } | 2082 } |
2082 | 2083 |
2083 /** | 2084 /** |
2084 * Add a synthetic nullary constructor if there are no other | 2085 * Add a synthetic nullary constructor if there are no other |
2085 * constructors. | 2086 * constructors. |
2086 */ | 2087 */ |
2087 void addDefaultConstructorIfNeeded(ClassElement element) { | 2088 void addDefaultConstructorIfNeeded(ClassElement element) { |
2088 if (element.hasConstructor) return; | 2089 if (element.hasConstructor) return; |
2089 SynthesizedConstructorElement constructor = | 2090 SynthesizedConstructorElement constructor = |
2090 new SynthesizedConstructorElement(element); | 2091 new SynthesizedConstructorElement(element); |
2091 element.addToScope(constructor, compiler); | 2092 element.addToScope(constructor, compiler); |
2092 Type returnType = compiler.types.voidType; | 2093 DartType returnType = compiler.types.voidType; |
2093 constructor.type = new FunctionType(returnType, const EmptyLink<Type>(), | 2094 constructor.type = new FunctionType(returnType, const EmptyLink<DartType>(), |
2094 constructor); | 2095 constructor); |
2095 constructor.cachedNode = | 2096 constructor.cachedNode = |
2096 new FunctionExpression(new Identifier(element.position()), | 2097 new FunctionExpression(new Identifier(element.position()), |
2097 new NodeList.empty(), | 2098 new NodeList.empty(), |
2098 new Block(new NodeList.empty()), | 2099 new Block(new NodeList.empty()), |
2099 null, null, null, null); | 2100 null, null, null, null); |
2100 } | 2101 } |
2101 | 2102 |
2102 isBlackListed(Type type) { | 2103 isBlackListed(DartType type) { |
2103 LibraryElement lib = element.getLibrary(); | 2104 LibraryElement lib = element.getLibrary(); |
2104 return | 2105 return |
2105 lib !== compiler.coreLibrary && | 2106 lib !== compiler.coreLibrary && |
2106 lib !== compiler.coreImplLibrary && | 2107 lib !== compiler.coreImplLibrary && |
2107 lib !== compiler.jsHelperLibrary && | 2108 lib !== compiler.jsHelperLibrary && |
2108 (type.element === compiler.dynamicClass || | 2109 (type.element === compiler.dynamicClass || |
2109 type.element === compiler.boolClass || | 2110 type.element === compiler.boolClass || |
2110 type.element === compiler.numClass || | 2111 type.element === compiler.numClass || |
2111 type.element === compiler.intClass || | 2112 type.element === compiler.intClass || |
2112 type.element === compiler.doubleClass || | 2113 type.element === compiler.doubleClass || |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2272 return new VariableElement(node.source, variables, | 2273 return new VariableElement(node.source, variables, |
2273 ElementKind.PARAMETER, enclosingElement, node: node); | 2274 ElementKind.PARAMETER, enclosingElement, node: node); |
2274 } | 2275 } |
2275 | 2276 |
2276 SourceString getParameterName(Send node) { | 2277 SourceString getParameterName(Send node) { |
2277 var identifier = node.selector.asIdentifier(); | 2278 var identifier = node.selector.asIdentifier(); |
2278 if (identifier !== null) { | 2279 if (identifier !== null) { |
2279 // Normal parameter: [:Type name:]. | 2280 // Normal parameter: [:Type name:]. |
2280 return identifier.source; | 2281 return identifier.source; |
2281 } else { | 2282 } else { |
2282 // Function type parameter: [:void name(Type arg):]. | 2283 // Function type parameter: [:void name(DartType arg):]. |
2283 var functionExpression = node.selector.asFunctionExpression(); | 2284 var functionExpression = node.selector.asFunctionExpression(); |
2284 if (functionExpression !== null && | 2285 if (functionExpression !== null && |
2285 functionExpression.name.asIdentifier() !== null) { | 2286 functionExpression.name.asIdentifier() !== null) { |
2286 return functionExpression.name.asIdentifier().source; | 2287 return functionExpression.name.asIdentifier().source; |
2287 } else { | 2288 } else { |
2288 cancel(node, | 2289 cancel(node, |
2289 'internal error: unimplemented receiver on parameter send'); | 2290 'internal error: unimplemented receiver on parameter send'); |
2290 } | 2291 } |
2291 } | 2292 } |
2292 } | 2293 } |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2381 MessageKind.EXTRA_FORMALS.error([]), | 2382 MessageKind.EXTRA_FORMALS.error([]), |
2382 api.Diagnostic.WARNING); | 2383 api.Diagnostic.WARNING); |
2383 } | 2384 } |
2384 } | 2385 } |
2385 } | 2386 } |
2386 LinkBuilder<Element> parametersBuilder = | 2387 LinkBuilder<Element> parametersBuilder = |
2387 visitor.analyzeNodes(formalParameters.nodes); | 2388 visitor.analyzeNodes(formalParameters.nodes); |
2388 requiredParameterCount = parametersBuilder.length; | 2389 requiredParameterCount = parametersBuilder.length; |
2389 parameters = parametersBuilder.toLink(); | 2390 parameters = parametersBuilder.toLink(); |
2390 } | 2391 } |
2391 Type returnType = compiler.resolveTypeAnnotation(element, returnNode); | 2392 DartType returnType = compiler.resolveTypeAnnotation(element, returnNode); |
2392 return new FunctionSignature(parameters, | 2393 return new FunctionSignature(parameters, |
2393 visitor.optionalParameters, | 2394 visitor.optionalParameters, |
2394 requiredParameterCount, | 2395 requiredParameterCount, |
2395 visitor.optionalParameterCount, | 2396 visitor.optionalParameterCount, |
2396 returnType); | 2397 returnType); |
2397 } | 2398 } |
2398 | 2399 |
2399 // TODO(ahe): This is temporary. | 2400 // TODO(ahe): This is temporary. |
2400 void resolveExpression(Node node) { | 2401 void resolveExpression(Node node) { |
2401 if (node == null) return; | 2402 if (node == null) return; |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2542 } | 2543 } |
2543 | 2544 |
2544 /** | 2545 /** |
2545 * Looks up [name] within the type variables declared in [element]. | 2546 * Looks up [name] within the type variables declared in [element]. |
2546 */ | 2547 */ |
2547 Element lookupTypeVariable(SourceString name) { | 2548 Element lookupTypeVariable(SourceString name) { |
2548 return null; | 2549 return null; |
2549 } | 2550 } |
2550 | 2551 |
2551 Element lookup(SourceString name) { | 2552 Element lookup(SourceString name) { |
2552 Link<Type> typeVariableLink = element.typeVariables; | 2553 Link<DartType> typeVariableLink = element.typeVariables; |
2553 while (!typeVariableLink.isEmpty()) { | 2554 while (!typeVariableLink.isEmpty()) { |
2554 TypeVariableType typeVariable = typeVariableLink.head; | 2555 TypeVariableType typeVariable = typeVariableLink.head; |
2555 if (typeVariable.name == name) { | 2556 if (typeVariable.name == name) { |
2556 return typeVariable.element; | 2557 return typeVariable.element; |
2557 } | 2558 } |
2558 typeVariableLink = typeVariableLink.tail; | 2559 typeVariableLink = typeVariableLink.tail; |
2559 } | 2560 } |
2560 | 2561 |
2561 return parent.lookup(name); | 2562 return parent.lookup(name); |
2562 } | 2563 } |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2628 TopScope(LibraryElement library) : super(null, library); | 2629 TopScope(LibraryElement library) : super(null, library); |
2629 Element lookup(SourceString name) { | 2630 Element lookup(SourceString name) { |
2630 return library.find(name); | 2631 return library.find(name); |
2631 } | 2632 } |
2632 | 2633 |
2633 Element add(Element newElement) { | 2634 Element add(Element newElement) { |
2634 throw "Cannot add an element in the top scope"; | 2635 throw "Cannot add an element in the top scope"; |
2635 } | 2636 } |
2636 String toString() => '$element'; | 2637 String toString() => '$element'; |
2637 } | 2638 } |
OLD | NEW |