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

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

Issue 2870063002: Allowing `e` of any type in `void f(...) => e` (Closed)
Patch Set: There was no test for the block case, added that Created 3 years, 7 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
« no previous file with comments | « no previous file | tests/language/void_arrow_return_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 analyzer.src.generated.error_verifier; 5 library analyzer.src.generated.error_verifier;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 import "dart:math" as math; 8 import "dart:math" as math;
9 9
10 import 'package:analyzer/dart/ast/ast.dart'; 10 import 'package:analyzer/dart/ast/ast.dart';
(...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after
653 _inGenerator = node.isGenerator; 653 _inGenerator = node.isGenerator;
654 FunctionType functionType = _enclosingFunction?.type; 654 FunctionType functionType = _enclosingFunction?.type;
655 DartType expectedReturnType = functionType == null 655 DartType expectedReturnType = functionType == null
656 ? DynamicTypeImpl.instance 656 ? DynamicTypeImpl.instance
657 : functionType.returnType; 657 : functionType.returnType;
658 ExecutableElement function = _enclosingFunction; 658 ExecutableElement function = _enclosingFunction;
659 bool isSetterWithImplicitReturn = function.hasImplicitReturnType && 659 bool isSetterWithImplicitReturn = function.hasImplicitReturnType &&
660 function is PropertyAccessorElement && 660 function is PropertyAccessorElement &&
661 function.isSetter; 661 function.isSetter;
662 if (!isSetterWithImplicitReturn) { 662 if (!isSetterWithImplicitReturn) {
663 _checkForReturnOfInvalidType(node.expression, expectedReturnType); 663 _checkForReturnOfInvalidType(node.expression, expectedReturnType,
664 isArrowFunction: true);
664 } 665 }
665 return super.visitExpressionFunctionBody(node); 666 return super.visitExpressionFunctionBody(node);
666 } finally { 667 } finally {
667 _inAsync = wasInAsync; 668 _inAsync = wasInAsync;
668 _inGenerator = wasInGenerator; 669 _inGenerator = wasInGenerator;
669 } 670 }
670 } 671 }
671 672
672 @override 673 @override
673 Object visitFieldDeclaration(FieldDeclaration node) { 674 Object visitFieldDeclaration(FieldDeclaration node) {
(...skipping 4917 matching lines...) Expand 10 before | Expand all | Expand 10 after
5591 /** 5592 /**
5592 * Check that a type mis-match between the type of the [returnExpression] and 5593 * Check that a type mis-match between the type of the [returnExpression] and
5593 * the [expectedReturnType] by the enclosing method or function. 5594 * the [expectedReturnType] by the enclosing method or function.
5594 * 5595 *
5595 * This method is called both by [_checkForAllReturnStatementErrorCodes] 5596 * This method is called both by [_checkForAllReturnStatementErrorCodes]
5596 * and [visitExpressionFunctionBody]. 5597 * and [visitExpressionFunctionBody].
5597 * 5598 *
5598 * See [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE]. 5599 * See [StaticTypeWarningCode.RETURN_OF_INVALID_TYPE].
5599 */ 5600 */
5600 void _checkForReturnOfInvalidType( 5601 void _checkForReturnOfInvalidType(
5601 Expression returnExpression, DartType expectedReturnType) { 5602 Expression returnExpression, DartType expectedReturnType,
5603 {bool isArrowFunction = false}) {
5602 if (_enclosingFunction == null) { 5604 if (_enclosingFunction == null) {
5603 return; 5605 return;
5604 } 5606 }
5605 if (_inGenerator) { 5607 if (_inGenerator) {
5606 // "return expression;" is disallowed in generators, but this is checked 5608 // "return expression;" is disallowed in generators, but this is checked
5607 // elsewhere. Bare "return" is always allowed in generators regardless 5609 // elsewhere. Bare "return" is always allowed in generators regardless
5608 // of the return type. So no need to do any further checking. 5610 // of the return type. So no need to do any further checking.
5609 return; 5611 return;
5610 } 5612 }
5611 DartType staticReturnType = _computeReturnTypeForMethod(returnExpression); 5613 DartType staticReturnType = _computeReturnTypeForMethod(returnExpression);
5612 if (expectedReturnType.isVoid) { 5614 if (expectedReturnType.isVoid) {
5615 if (isArrowFunction) {
5616 // "void f(..) => e" admits all types for "e".
5617 return;
5618 }
5613 if (staticReturnType.isVoid || 5619 if (staticReturnType.isVoid ||
5614 staticReturnType.isDynamic || 5620 staticReturnType.isDynamic ||
5615 staticReturnType.isBottom || 5621 staticReturnType.isBottom ||
5616 staticReturnType.isDartCoreNull) { 5622 staticReturnType.isDartCoreNull) {
5617 return; 5623 return;
5618 } 5624 }
5619 _errorReporter.reportTypeErrorForNode( 5625 _errorReporter.reportTypeErrorForNode(
5620 StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [ 5626 StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
5621 staticReturnType, 5627 staticReturnType,
5622 expectedReturnType, 5628 expectedReturnType,
(...skipping 1507 matching lines...) Expand 10 before | Expand all | Expand 10 after
7130 class _InvocationCollector extends RecursiveAstVisitor { 7136 class _InvocationCollector extends RecursiveAstVisitor {
7131 final List<String> superCalls = <String>[]; 7137 final List<String> superCalls = <String>[];
7132 7138
7133 @override 7139 @override
7134 visitMethodInvocation(MethodInvocation node) { 7140 visitMethodInvocation(MethodInvocation node) {
7135 if (node.target is SuperExpression) { 7141 if (node.target is SuperExpression) {
7136 superCalls.add(node.methodName.name); 7142 superCalls.add(node.methodName.name);
7137 } 7143 }
7138 } 7144 }
7139 } 7145 }
OLDNEW
« no previous file with comments | « no previous file | tests/language/void_arrow_return_test.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698