| 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 part of resolution; | 5 part of resolution; |
| 6 | 6 |
| 7 abstract class TreeElements { | 7 abstract class TreeElements { |
| 8 Element operator[](Node node); | 8 Element operator[](Node node); |
| 9 Selector getSelector(Send send); | 9 Selector getSelector(Send send); |
| 10 DartType getType(Node node); | 10 DartType getType(Node node); |
| (...skipping 1912 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1923 if (node.isRedirectingFactoryBody) { | 1923 if (node.isRedirectingFactoryBody) { |
| 1924 handleRedirectingFactoryBody(node); | 1924 handleRedirectingFactoryBody(node); |
| 1925 } else { | 1925 } else { |
| 1926 visit(node.expression); | 1926 visit(node.expression); |
| 1927 } | 1927 } |
| 1928 } | 1928 } |
| 1929 | 1929 |
| 1930 void handleRedirectingFactoryBody(Return node) { | 1930 void handleRedirectingFactoryBody(Return node) { |
| 1931 Element redirectionTarget = resolveRedirectingFactory(node); | 1931 Element redirectionTarget = resolveRedirectingFactory(node); |
| 1932 var type = mapping.getType(node.expression); | 1932 var type = mapping.getType(node.expression); |
| 1933 if (type is InterfaceType && !type.arguments.isEmpty) { | 1933 if (type is InterfaceType && !type.typeArguments.isEmpty) { |
| 1934 unimplemented(node.expression, 'type arguments on redirecting factory'); | 1934 unimplemented(node.expression, 'type arguments on redirecting factory'); |
| 1935 } | 1935 } |
| 1936 useElement(node.expression, redirectionTarget); | 1936 useElement(node.expression, redirectionTarget); |
| 1937 assert(invariant(node, enclosingElement.isFactoryConstructor())); | 1937 assert(invariant(node, enclosingElement.isFactoryConstructor())); |
| 1938 FunctionElement constructor = enclosingElement; | 1938 FunctionElement constructor = enclosingElement; |
| 1939 if (constructor.modifiers.isConst() && | 1939 if (constructor.modifiers.isConst() && |
| 1940 !redirectionTarget.modifiers.isConst()) { | 1940 !redirectionTarget.modifiers.isConst()) { |
| 1941 error(node, MessageKind.CONSTRUCTOR_IS_NOT_CONST); | 1941 error(node, MessageKind.CONSTRUCTOR_IS_NOT_CONST); |
| 1942 } | 1942 } |
| 1943 // TODO(ahe): Check that this doesn't lead to a cycle. For now, | 1943 // TODO(ahe): Check that this doesn't lead to a cycle. For now, |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2043 if (argument.element.isTypeVariable()) { | 2043 if (argument.element.isTypeVariable()) { |
| 2044 // Register a dependency between the class where the type | 2044 // Register a dependency between the class where the type |
| 2045 // variable is, and the annotation. If the annotation requires | 2045 // variable is, and the annotation. If the annotation requires |
| 2046 // runtime type information, then the class of the type variable | 2046 // runtime type information, then the class of the type variable |
| 2047 // does too. | 2047 // does too. |
| 2048 compiler.world.registerRtiDependency( | 2048 compiler.world.registerRtiDependency( |
| 2049 annotation.element, | 2049 annotation.element, |
| 2050 argument.element.enclosingElement); | 2050 argument.element.enclosingElement); |
| 2051 } else if (argument is InterfaceType) { | 2051 } else if (argument is InterfaceType) { |
| 2052 InterfaceType type = argument; | 2052 InterfaceType type = argument; |
| 2053 type.arguments.forEach((DartType argument) { | 2053 type.typeArguments.forEach((DartType argument) { |
| 2054 analyzeTypeArgument(type, argument); | 2054 analyzeTypeArgument(type, argument); |
| 2055 }); | 2055 }); |
| 2056 } | 2056 } |
| 2057 } | 2057 } |
| 2058 | 2058 |
| 2059 DartType resolveTypeAnnotation(TypeAnnotation node) { | 2059 DartType resolveTypeAnnotation(TypeAnnotation node) { |
| 2060 // TODO(johnniwinther): Remove this together with the named arguments | 2060 // TODO(johnniwinther): Remove this together with the named arguments |
| 2061 // on [TypeResolver.resolveTypeAnnotation]. | 2061 // on [TypeResolver.resolveTypeAnnotation]. |
| 2062 void checkAndUseType(TypeAnnotation annotation, DartType type) { | 2062 void checkAndUseType(TypeAnnotation annotation, DartType type) { |
| 2063 useType(annotation, type); | 2063 useType(annotation, type); |
| 2064 if (type != null && | 2064 if (type != null && |
| 2065 identical(type.kind, TypeKind.TYPE_VARIABLE) && | 2065 identical(type.kind, TypeKind.TYPE_VARIABLE) && |
| 2066 enclosingElement.isInStaticMember()) { | 2066 enclosingElement.isInStaticMember()) { |
| 2067 warning(annotation, MessageKind.TYPE_VARIABLE_WITHIN_STATIC_MEMBER, | 2067 warning(annotation, MessageKind.TYPE_VARIABLE_WITHIN_STATIC_MEMBER, |
| 2068 [type]); | 2068 [type]); |
| 2069 } | 2069 } |
| 2070 } | 2070 } |
| 2071 | 2071 |
| 2072 Function report = typeRequired ? error : warning; | 2072 Function report = typeRequired ? error : warning; |
| 2073 DartType type = typeResolver.resolveTypeAnnotation( | 2073 DartType type = typeResolver.resolveTypeAnnotation( |
| 2074 node, scope, onFailure: report, whenResolved: checkAndUseType); | 2074 node, scope, onFailure: report, whenResolved: checkAndUseType); |
| 2075 if (type == null) return null; | 2075 if (type == null) return null; |
| 2076 if (inCheckContext) { | 2076 if (inCheckContext) { |
| 2077 compiler.enqueuer.resolution.registerIsCheck(type); | 2077 compiler.enqueuer.resolution.registerIsCheck(type); |
| 2078 } | 2078 } |
| 2079 if (typeRequired || inCheckContext) { | 2079 if (typeRequired || inCheckContext) { |
| 2080 if (type is InterfaceType) { | 2080 if (type is InterfaceType) { |
| 2081 InterfaceType itf = type; | 2081 InterfaceType itf = type; |
| 2082 itf.arguments.forEach((DartType argument) { | 2082 itf.typeArguments.forEach((DartType argument) { |
| 2083 analyzeTypeArgument(type, argument); | 2083 analyzeTypeArgument(type, argument); |
| 2084 }); | 2084 }); |
| 2085 } | 2085 } |
| 2086 // TODO(ngeoffray): Also handle cases like: | 2086 // TODO(ngeoffray): Also handle cases like: |
| 2087 // 1) a is T | 2087 // 1) a is T |
| 2088 // 2) T a (in checked mode). | 2088 // 2) T a (in checked mode). |
| 2089 } | 2089 } |
| 2090 return type; | 2090 return type; |
| 2091 } | 2091 } |
| 2092 | 2092 |
| (...skipping 1026 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3119 return e; | 3119 return e; |
| 3120 } | 3120 } |
| 3121 | 3121 |
| 3122 /// Assumed to be called by [resolveRedirectingFactory]. | 3122 /// Assumed to be called by [resolveRedirectingFactory]. |
| 3123 Element visitReturn(Return node) { | 3123 Element visitReturn(Return node) { |
| 3124 Node expression = node.expression; | 3124 Node expression = node.expression; |
| 3125 return finishConstructorReference(visit(expression), | 3125 return finishConstructorReference(visit(expression), |
| 3126 expression, expression); | 3126 expression, expression); |
| 3127 } | 3127 } |
| 3128 } | 3128 } |
| OLD | NEW |