Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(64)

Side by Side Diff: pkg/analyzer/lib/src/generated/error_verifier.dart

Issue 895673005: Add static type checking of "yield*" statements to analyzer. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix tests. Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | pkg/analyzer/test/generated/non_error_resolver_test.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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.error_verifier; 5 library engine.resolver.error_verifier;
6 6
7 import "dart:math" as math; 7 import "dart:math" as math;
8 import 'dart:collection'; 8 import 'dart:collection';
9 9
10 import 'ast.dart'; 10 import 'ast.dart';
(...skipping 1078 matching lines...) Expand 10 before | Expand all | Expand 10 after
1089 1089
1090 @override 1090 @override
1091 Object visitWhileStatement(WhileStatement node) { 1091 Object visitWhileStatement(WhileStatement node) {
1092 _checkForNonBoolCondition(node.condition); 1092 _checkForNonBoolCondition(node.condition);
1093 return super.visitWhileStatement(node); 1093 return super.visitWhileStatement(node);
1094 } 1094 }
1095 1095
1096 @override 1096 @override
1097 Object visitYieldStatement(YieldStatement node) { 1097 Object visitYieldStatement(YieldStatement node) {
1098 if (_inGenerator) { 1098 if (_inGenerator) {
1099 _checkForYieldOfInvalidType(node.expression); 1099 _checkForYieldOfInvalidType(node.expression, node.star != null);
1100 } else { 1100 } else {
1101 CompileTimeErrorCode errorCode; 1101 CompileTimeErrorCode errorCode;
1102 if (node.star != null) { 1102 if (node.star != null) {
1103 errorCode = CompileTimeErrorCode.YIELD_EACH_IN_NON_GENERATOR; 1103 errorCode = CompileTimeErrorCode.YIELD_EACH_IN_NON_GENERATOR;
1104 } else { 1104 } else {
1105 errorCode = CompileTimeErrorCode.YIELD_IN_NON_GENERATOR; 1105 errorCode = CompileTimeErrorCode.YIELD_IN_NON_GENERATOR;
1106 } 1106 }
1107 _errorReporter.reportErrorForNode(errorCode, node); 1107 _errorReporter.reportErrorForNode(errorCode, node);
1108 } 1108 }
1109 return super.visitYieldStatement(node); 1109 return super.visitYieldStatement(node);
(...skipping 4601 matching lines...) Expand 10 before | Expand all | Expand 10 after
5711 } 5711 }
5712 return false; 5712 return false;
5713 } 5713 }
5714 5714
5715 /** 5715 /**
5716 * Check for a type mis-match between the yielded type and the declared 5716 * Check for a type mis-match between the yielded type and the declared
5717 * return type of a generator function. 5717 * return type of a generator function.
5718 * 5718 *
5719 * This method should only be called in generator functions. 5719 * This method should only be called in generator functions.
5720 */ 5720 */
5721 bool _checkForYieldOfInvalidType(Expression yieldExpression) { 5721 bool _checkForYieldOfInvalidType(Expression yieldExpression,
5722 bool isYieldEach) {
5722 assert(_inGenerator); 5723 assert(_inGenerator);
5723 if (_enclosingFunction == null) { 5724 if (_enclosingFunction == null) {
5724 return false; 5725 return false;
5725 } 5726 }
5726 DartType declaredReturnType = _enclosingFunction.returnType; 5727 DartType declaredReturnType = _enclosingFunction.returnType;
5727 DartType staticYieldedType = getStaticType(yieldExpression); 5728 DartType staticYieldedType = getStaticType(yieldExpression);
5728 DartType impliedReturnType; 5729 DartType impliedReturnType;
5729 if (_enclosingFunction.isAsynchronous) { 5730 if (isYieldEach) {
5731 impliedReturnType = staticYieldedType;
5732 } else if (_enclosingFunction.isAsynchronous) {
5730 impliedReturnType = 5733 impliedReturnType =
5731 _typeProvider.streamType.substitute4(<DartType>[staticYieldedType]); 5734 _typeProvider.streamType.substitute4(<DartType>[staticYieldedType]);
5732 } else { 5735 } else {
5733 impliedReturnType = 5736 impliedReturnType =
5734 _typeProvider.iterableType.substitute4(<DartType>[staticYieldedType]); 5737 _typeProvider.iterableType.substitute4(<DartType>[staticYieldedType]);
5735 } 5738 }
5736 if (impliedReturnType.isAssignableTo(declaredReturnType)) { 5739 if (impliedReturnType.isAssignableTo(declaredReturnType)) {
5737 return false; 5740 return false;
5738 } 5741 }
5739 _errorReporter.reportTypeErrorForNode( 5742 _errorReporter.reportTypeErrorForNode(
(...skipping 529 matching lines...) Expand 10 before | Expand all | Expand 10 after
6269 toCheck.add(type.element); 6272 toCheck.add(type.element);
6270 // type arguments 6273 // type arguments
6271 if (type is InterfaceType) { 6274 if (type is InterfaceType) {
6272 InterfaceType interfaceType = type; 6275 InterfaceType interfaceType = type;
6273 for (DartType typeArgument in interfaceType.typeArguments) { 6276 for (DartType typeArgument in interfaceType.typeArguments) {
6274 _addTypeToCheck(typeArgument); 6277 _addTypeToCheck(typeArgument);
6275 } 6278 }
6276 } 6279 }
6277 } 6280 }
6278 } 6281 }
OLDNEW
« no previous file with comments | « no previous file | pkg/analyzer/test/generated/non_error_resolver_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698