| 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 825 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 836 var type = functionType.returnType; | 836 var type = functionType.returnType; |
| 837 | 837 |
| 838 InterfaceType expectedType = null; | 838 InterfaceType expectedType = null; |
| 839 if (body.isAsynchronous) { | 839 if (body.isAsynchronous) { |
| 840 if (body.isGenerator) { | 840 if (body.isGenerator) { |
| 841 // Stream<T> -> T | 841 // Stream<T> -> T |
| 842 expectedType = typeProvider.streamType; | 842 expectedType = typeProvider.streamType; |
| 843 } else { | 843 } else { |
| 844 // Future<T> -> FutureOr<T> | 844 // Future<T> -> FutureOr<T> |
| 845 var typeArg = (type.element == typeProvider.futureType.element) | 845 var typeArg = (type.element == typeProvider.futureType.element) |
| 846 ? type.typeArguments[0] | 846 ? (type as InterfaceType).typeArguments[0] |
| 847 : typeProvider.dynamicType; | 847 : typeProvider.dynamicType; |
| 848 return typeProvider.futureOrType.instantiate([typeArg]); | 848 return typeProvider.futureOrType.instantiate([typeArg]); |
| 849 } | 849 } |
| 850 } else { | 850 } else { |
| 851 if (body.isGenerator) { | 851 if (body.isGenerator) { |
| 852 // Iterable<T> -> T | 852 // Iterable<T> -> T |
| 853 expectedType = typeProvider.iterableType; | 853 expectedType = typeProvider.iterableType; |
| 854 } else { | 854 } else { |
| 855 // T -> T | 855 // T -> T |
| 856 return type; | 856 return type; |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 923 | 923 |
| 924 // fromT <: toT, no coercion needed. | 924 // fromT <: toT, no coercion needed. |
| 925 if (rules.isSubtypeOf(from, to)) return false; | 925 if (rules.isSubtypeOf(from, to)) return false; |
| 926 | 926 |
| 927 // Down cast or legal sideways cast, coercion needed. | 927 // Down cast or legal sideways cast, coercion needed. |
| 928 if (rules.isAssignableTo(from, to)) return true; | 928 if (rules.isAssignableTo(from, to)) return true; |
| 929 | 929 |
| 930 // Special case for FutureOr to handle returned values from async functions. | 930 // Special case for FutureOr to handle returned values from async functions. |
| 931 // In this case, we're more permissive than assignability. | 931 // In this case, we're more permissive than assignability. |
| 932 if (to.element == typeProvider.futureOrType.element) { | 932 if (to.element == typeProvider.futureOrType.element) { |
| 933 var to1 = to.typeArguments[0]; | 933 var to1 = (to as InterfaceType).typeArguments[0]; |
| 934 var to2 = typeProvider.futureType.instantiate([to1]); | 934 var to2 = typeProvider.futureType.instantiate([to1]); |
| 935 return _needsImplicitCast(expr, to1, from: from) == true || | 935 return _needsImplicitCast(expr, to1, from: from) == true || |
| 936 _needsImplicitCast(expr, to2, from: from) == true; | 936 _needsImplicitCast(expr, to2, from: from) == true; |
| 937 } | 937 } |
| 938 | 938 |
| 939 // Anything else is an illegal sideways cast. | 939 // Anything else is an illegal sideways cast. |
| 940 // However, these will have been reported already in error_verifier, so we | 940 // However, these will have been reported already in error_verifier, so we |
| 941 // don't need to report them again. | 941 // don't need to report them again. |
| 942 return null; | 942 return null; |
| 943 } | 943 } |
| (...skipping 620 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1564 var visited = new Set<InterfaceType>(); | 1564 var visited = new Set<InterfaceType>(); |
| 1565 do { | 1565 do { |
| 1566 visited.add(current); | 1566 visited.add(current); |
| 1567 current.mixins.reversed.forEach( | 1567 current.mixins.reversed.forEach( |
| 1568 (m) => _checkIndividualOverridesFromClass(node, m, seen, true)); | 1568 (m) => _checkIndividualOverridesFromClass(node, m, seen, true)); |
| 1569 _checkIndividualOverridesFromClass(node, current.superclass, seen, true); | 1569 _checkIndividualOverridesFromClass(node, current.superclass, seen, true); |
| 1570 current = current.superclass; | 1570 current = current.superclass; |
| 1571 } while (!current.isObject && !visited.contains(current)); | 1571 } while (!current.isObject && !visited.contains(current)); |
| 1572 } | 1572 } |
| 1573 } | 1573 } |
| OLD | NEW |