| OLD | NEW |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2015, 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 // TODO(jmesserly): this was ported from package:dev_compiler, and needs to be | 5 // TODO(jmesserly): this was ported from package:dev_compiler, and needs to be |
| 6 // refactored to fit into analyzer. | 6 // refactored to fit into analyzer. |
| 7 library analyzer.src.task.strong.checker; | 7 library analyzer.src.task.strong.checker; |
| 8 | 8 |
| 9 import 'package:analyzer/analyzer.dart'; | 9 import 'package:analyzer/analyzer.dart'; |
| 10 import 'package:analyzer/dart/ast/ast.dart'; | 10 import 'package:analyzer/dart/ast/ast.dart'; |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 330 // Check that the expression is an Iterable. | 330 // Check that the expression is an Iterable. |
| 331 var expr = node.iterable; | 331 var expr = node.iterable; |
| 332 var iterableType = node.awaitKeyword != null | 332 var iterableType = node.awaitKeyword != null |
| 333 ? typeProvider.streamType | 333 ? typeProvider.streamType |
| 334 : typeProvider.iterableType; | 334 : typeProvider.iterableType; |
| 335 var loopVariable = node.identifier != null | 335 var loopVariable = node.identifier != null |
| 336 ? node.identifier | 336 ? node.identifier |
| 337 : node.loopVariable?.identifier; | 337 : node.loopVariable?.identifier; |
| 338 if (loopVariable != null) { | 338 if (loopVariable != null) { |
| 339 var iteratorType = loopVariable.staticType; | 339 var iteratorType = loopVariable.staticType; |
| 340 var checkedType = iterableType.substitute4([iteratorType]); | 340 var checkedType = iterableType.instantiate([iteratorType]); |
| 341 checkAssignment(expr, checkedType); | 341 checkAssignment(expr, checkedType); |
| 342 } | 342 } |
| 343 node.visitChildren(this); | 343 node.visitChildren(this); |
| 344 } | 344 } |
| 345 | 345 |
| 346 @override | 346 @override |
| 347 void visitForStatement(ForStatement node) { | 347 void visitForStatement(ForStatement node) { |
| 348 if (node.condition != null) { | 348 if (node.condition != null) { |
| 349 checkBoolean(node.condition); | 349 checkBoolean(node.condition); |
| 350 } | 350 } |
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 641 // not match the return or yield type. We should have already gotten an | 641 // not match the return or yield type. We should have already gotten an |
| 642 // analyzer error in this case. | 642 // analyzer error in this case. |
| 643 return; | 643 return; |
| 644 } | 644 } |
| 645 InterfaceType futureType = typeProvider.futureType; | 645 InterfaceType futureType = typeProvider.futureType; |
| 646 DartType actualType = expression?.staticType; | 646 DartType actualType = expression?.staticType; |
| 647 if (body.isAsynchronous && | 647 if (body.isAsynchronous && |
| 648 !body.isGenerator && | 648 !body.isGenerator && |
| 649 actualType is InterfaceType && | 649 actualType is InterfaceType && |
| 650 actualType.element == futureType.element) { | 650 actualType.element == futureType.element) { |
| 651 type = futureType.substitute4([type]); | 651 type = futureType.instantiate([type]); |
| 652 } | 652 } |
| 653 // TODO(vsm): Enforce void or dynamic (to void?) when expression is null. | 653 // TODO(vsm): Enforce void or dynamic (to void?) when expression is null. |
| 654 if (expression != null) checkAssignment(expression, type); | 654 if (expression != null) checkAssignment(expression, type); |
| 655 } | 655 } |
| 656 | 656 |
| 657 void _checkRuntimeTypeCheck(AstNode node, TypeName typeName) { | 657 void _checkRuntimeTypeCheck(AstNode node, TypeName typeName) { |
| 658 var type = getType(typeName); | 658 var type = getType(typeName); |
| 659 if (!rules.isGroundType(type)) { | 659 if (!rules.isGroundType(type)) { |
| 660 _recordMessage(new NonGroundTypeCheckInfo(node, type)); | 660 _recordMessage(new NonGroundTypeCheckInfo(node, type)); |
| 661 } | 661 } |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 746 // Iterable<T> -> T | 746 // Iterable<T> -> T |
| 747 expectedType = typeProvider.iterableType; | 747 expectedType = typeProvider.iterableType; |
| 748 } else { | 748 } else { |
| 749 // T -> T | 749 // T -> T |
| 750 return type; | 750 return type; |
| 751 } | 751 } |
| 752 } | 752 } |
| 753 if (yieldStar) { | 753 if (yieldStar) { |
| 754 if (type.isDynamic) { | 754 if (type.isDynamic) { |
| 755 // Ensure it's at least a Stream / Iterable. | 755 // Ensure it's at least a Stream / Iterable. |
| 756 return expectedType.substitute4([typeProvider.dynamicType]); | 756 return expectedType.instantiate([typeProvider.dynamicType]); |
| 757 } else { | 757 } else { |
| 758 // Analyzer will provide a separate error if expected type | 758 // Analyzer will provide a separate error if expected type |
| 759 // is not compatible with type. | 759 // is not compatible with type. |
| 760 return type; | 760 return type; |
| 761 } | 761 } |
| 762 } | 762 } |
| 763 if (type.isDynamic) { | 763 if (type.isDynamic) { |
| 764 return type; | 764 return type; |
| 765 } else if (type is InterfaceType && type.element == expectedType.element) { | 765 } else if (type is InterfaceType && type.element == expectedType.element) { |
| 766 return type.typeArguments[0]; | 766 return type.typeArguments[0]; |
| (...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1276 } while (!current.isObject && !visited.contains(current)); | 1276 } while (!current.isObject && !visited.contains(current)); |
| 1277 } | 1277 } |
| 1278 | 1278 |
| 1279 void _recordMessage(StaticInfo info) { | 1279 void _recordMessage(StaticInfo info) { |
| 1280 if (info == null) return; | 1280 if (info == null) return; |
| 1281 var error = info.toAnalysisError(); | 1281 var error = info.toAnalysisError(); |
| 1282 if (error.errorCode.errorSeverity == ErrorSeverity.ERROR) _failure = true; | 1282 if (error.errorCode.errorSeverity == ErrorSeverity.ERROR) _failure = true; |
| 1283 _reporter.onError(error); | 1283 _reporter.onError(error); |
| 1284 } | 1284 } |
| 1285 } | 1285 } |
| OLD | NEW |