OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 engine.resolver; | 5 library engine.resolver; |
6 | 6 |
7 import 'dart:collection'; | 7 import 'dart:collection'; |
8 | 8 |
9 import '../task/strong/info.dart' show InferredType, StaticInfo; | 9 import '../task/strong/info.dart' show InferredType, StaticInfo; |
10 import 'ast.dart'; | 10 import 'ast.dart'; |
(...skipping 8995 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
9006 Object visitListLiteral(ListLiteral node) { | 9006 Object visitListLiteral(ListLiteral node) { |
9007 DartType contextType = InferenceContext.getType(node); | 9007 DartType contextType = InferenceContext.getType(node); |
9008 List<DartType> targs = null; | 9008 List<DartType> targs = null; |
9009 if (node.typeArguments != null) { | 9009 if (node.typeArguments != null) { |
9010 targs = node.typeArguments.arguments.map((t) => t.type).toList(); | 9010 targs = node.typeArguments.arguments.map((t) => t.type).toList(); |
9011 } else if (contextType is InterfaceType) { | 9011 } else if (contextType is InterfaceType) { |
9012 InterfaceType listD = | 9012 InterfaceType listD = |
9013 typeProvider.listType.substitute4([typeProvider.dynamicType]); | 9013 typeProvider.listType.substitute4([typeProvider.dynamicType]); |
9014 targs = inferenceContext.matchTypes(listD, contextType); | 9014 targs = inferenceContext.matchTypes(listD, contextType); |
9015 } | 9015 } |
9016 if (targs != null && | 9016 if (targs != null && targs.length == 1 && !targs[0].isDynamic) { |
9017 targs.length == 1 && | |
9018 !targs[0].isDynamic) { | |
9019 DartType eType = targs[0]; | 9017 DartType eType = targs[0]; |
9020 InterfaceType listT = typeProvider.listType.substitute4([eType]); | 9018 InterfaceType listT = typeProvider.listType.substitute4([eType]); |
9021 for (Expression child in node.elements) { | 9019 for (Expression child in node.elements) { |
9022 InferenceContext.setType(child, eType); | 9020 InferenceContext.setType(child, eType); |
9023 } | 9021 } |
9024 InferenceContext.setType(node, listT); | 9022 InferenceContext.setType(node, listT); |
9025 } else { | 9023 } else { |
9026 InferenceContext.clearType(node); | 9024 InferenceContext.clearType(node); |
9027 } | 9025 } |
9028 super.visitListLiteral(node); | 9026 super.visitListLiteral(node); |
9029 return null; | 9027 return null; |
9030 } | 9028 } |
9031 | 9029 |
9032 @override | 9030 @override |
9033 Object visitMapLiteral(MapLiteral node) { | 9031 Object visitMapLiteral(MapLiteral node) { |
9034 DartType contextType = InferenceContext.getType(node); | 9032 DartType contextType = InferenceContext.getType(node); |
9035 List<DartType> targs = null; | 9033 List<DartType> targs = null; |
9036 if (node.typeArguments != null) { | 9034 if (node.typeArguments != null) { |
9037 targs = node.typeArguments.arguments.map((t) => t.type).toList(); | 9035 targs = node.typeArguments.arguments.map((t) => t.type).toList(); |
9038 } else if (contextType is InterfaceType) { | 9036 } else if (contextType is InterfaceType) { |
9039 InterfaceType mapD = typeProvider.mapType | 9037 InterfaceType mapD = typeProvider.mapType |
9040 .substitute4([typeProvider.dynamicType, typeProvider.dynamicType]); | 9038 .substitute4([typeProvider.dynamicType, typeProvider.dynamicType]); |
9041 targs = inferenceContext.matchTypes(mapD, contextType); | 9039 targs = inferenceContext.matchTypes(mapD, contextType); |
9042 } | 9040 } |
9043 if (targs != null && | 9041 if (targs != null && targs.length == 2 && targs.any((t) => !t.isDynamic)) { |
9044 targs.length == 2 && | |
9045 targs.any((t) => !t.isDynamic)) { | |
9046 DartType kType = targs[0]; | 9042 DartType kType = targs[0]; |
9047 DartType vType = targs[1]; | 9043 DartType vType = targs[1]; |
9048 InterfaceType mapT = typeProvider.mapType.substitute4([kType, vType]); | 9044 InterfaceType mapT = typeProvider.mapType.substitute4([kType, vType]); |
9049 for (MapLiteralEntry entry in node.entries) { | 9045 for (MapLiteralEntry entry in node.entries) { |
9050 InferenceContext.setType(entry.key, kType); | 9046 InferenceContext.setType(entry.key, kType); |
9051 InferenceContext.setType(entry.value, vType); | 9047 InferenceContext.setType(entry.value, vType); |
9052 } | 9048 } |
9053 InferenceContext.setType(node, mapT); | 9049 InferenceContext.setType(node, mapT); |
9054 } else { | 9050 } else { |
9055 InferenceContext.clearType(node); | 9051 InferenceContext.clearType(node); |
(...skipping 19 matching lines...) Expand all Loading... |
9075 Object visitMethodInvocation(MethodInvocation node) { | 9071 Object visitMethodInvocation(MethodInvocation node) { |
9076 // | 9072 // |
9077 // We visit the target and argument list, but do not visit the method name | 9073 // We visit the target and argument list, but do not visit the method name |
9078 // because it needs to be visited in the context of the invocation. | 9074 // because it needs to be visited in the context of the invocation. |
9079 // | 9075 // |
9080 safelyVisit(node.target); | 9076 safelyVisit(node.target); |
9081 safelyVisit(node.typeArguments); | 9077 safelyVisit(node.typeArguments); |
9082 node.accept(elementResolver); | 9078 node.accept(elementResolver); |
9083 _inferFunctionExpressionsParametersTypes(node.argumentList); | 9079 _inferFunctionExpressionsParametersTypes(node.argumentList); |
9084 Element methodElement = node.methodName.staticElement; | 9080 Element methodElement = node.methodName.staticElement; |
9085 if (methodElement is ExecutableElement) { | 9081 DartType contextType = null; |
9086 InferenceContext.setType(node.argumentList, methodElement.type); | 9082 if (methodElement is PropertyAccessorElement && methodElement.isGetter) { |
| 9083 contextType = methodElement.returnType; |
| 9084 } else if (methodElement is VariableElement) { |
| 9085 contextType = methodElement.type; |
| 9086 } else if (methodElement is ExecutableElement) { |
| 9087 contextType = methodElement.type; |
| 9088 } |
| 9089 if (contextType is FunctionType) { |
| 9090 InferenceContext.setType(node.argumentList, contextType); |
9087 } | 9091 } |
9088 safelyVisit(node.argumentList); | 9092 safelyVisit(node.argumentList); |
9089 node.accept(typeAnalyzer); | 9093 node.accept(typeAnalyzer); |
9090 return null; | 9094 return null; |
9091 } | 9095 } |
9092 | 9096 |
9093 @override | 9097 @override |
9094 Object visitNamedExpression(NamedExpression node) { | 9098 Object visitNamedExpression(NamedExpression node) { |
9095 InferenceContext.setType(node.expression, InferenceContext.getType(node)); | 9099 InferenceContext.setType(node.expression, InferenceContext.getType(node)); |
9096 return super.visitNamedExpression(node); | 9100 return super.visitNamedExpression(node); |
(...skipping 4215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13312 nonFields.add(node); | 13316 nonFields.add(node); |
13313 return null; | 13317 return null; |
13314 } | 13318 } |
13315 | 13319 |
13316 @override | 13320 @override |
13317 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this); | 13321 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this); |
13318 | 13322 |
13319 @override | 13323 @override |
13320 Object visitWithClause(WithClause node) => null; | 13324 Object visitWithClause(WithClause node) => null; |
13321 } | 13325 } |
OLD | NEW |