| 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 |