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

Side by Side Diff: pkg/analyzer/test/generated/strong_mode_test.dart

Issue 2655273008: fix #28526 and fix #28527 FutureOr<T> in await and subtype (Closed)
Patch Set: fix Created 3 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
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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.test.generated.strong_mode_test; 5 library analyzer.test.generated.strong_mode_test;
6 6
7 import 'dart:async'; 7 import 'dart:async';
8 8
9 import 'package:analyzer/dart/ast/ast.dart'; 9 import 'package:analyzer/dart/ast/ast.dart';
10 import 'package:analyzer/dart/ast/standard_resolution_map.dart'; 10 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
11 import 'package:analyzer/dart/element/element.dart'; 11 import 'package:analyzer/dart/element/element.dart';
12 import 'package:analyzer/dart/element/type.dart'; 12 import 'package:analyzer/dart/element/type.dart';
13 import 'package:analyzer/src/dart/element/element.dart'; 13 import 'package:analyzer/src/dart/element/element.dart';
14 import 'package:analyzer/src/error/codes.dart'; 14 import 'package:analyzer/src/error/codes.dart';
15 import 'package:analyzer/src/generated/engine.dart'; 15 import 'package:analyzer/src/generated/engine.dart';
16 import 'package:analyzer/src/generated/source_io.dart'; 16 import 'package:analyzer/src/generated/source_io.dart';
17 import 'package:front_end/src/base/errors.dart';
17 import 'package:test/test.dart'; 18 import 'package:test/test.dart';
18 import 'package:test_reflective_loader/test_reflective_loader.dart'; 19 import 'package:test_reflective_loader/test_reflective_loader.dart';
19 20
20 import '../utils.dart'; 21 import '../utils.dart';
21 import 'resolver_test_case.dart'; 22 import 'resolver_test_case.dart';
22 23
23 main() { 24 main() {
24 defineReflectiveSuite(() { 25 defineReflectiveSuite(() {
25 defineReflectiveTests(StrongModeLocalInferenceTest); 26 defineReflectiveTests(StrongModeLocalInferenceTest);
26 defineReflectiveTests(StrongModeStaticTypeAnalyzer2Test); 27 defineReflectiveTests(StrongModeStaticTypeAnalyzer2Test);
27 defineReflectiveTests(StrongModeTypePropagationTest); 28 defineReflectiveTests(StrongModeTypePropagationTest);
28 }); 29 });
29 } 30 }
30 31
31 /** 32 /**
32 * Strong mode static analyzer local type inference tests 33 * Strong mode static analyzer local type inference tests
33 */ 34 */
34 @reflectiveTest 35 @reflectiveTest
35 class StrongModeLocalInferenceTest extends ResolverTestCase { 36 class StrongModeLocalInferenceTest extends ResolverTestCase {
36 TypeAssertions _assertions; 37 TypeAssertions _assertions;
37 38
38 Asserter<DartType> _isDynamic; 39 Asserter<DartType> _isDynamic;
39 Asserter<InterfaceType> _isFutureOfDynamic; 40 Asserter<InterfaceType> _isFutureOfDynamic;
40 Asserter<InterfaceType> _isFutureOfInt; 41 Asserter<InterfaceType> _isFutureOfInt;
42 Asserter<InterfaceType> _isFutureOrOfInt;
41 Asserter<DartType> _isInt; 43 Asserter<DartType> _isInt;
42 Asserter<DartType> _isNum; 44 Asserter<DartType> _isNum;
43 Asserter<DartType> _isObject; 45 Asserter<DartType> _isObject;
44 Asserter<DartType> _isString; 46 Asserter<DartType> _isString;
45 47
46 AsserterBuilder2<Asserter<DartType>, Asserter<DartType>, DartType> 48 AsserterBuilder2<Asserter<DartType>, Asserter<DartType>, DartType>
47 _isFunction2Of; 49 _isFunction2Of;
48 AsserterBuilder<List<Asserter<DartType>>, InterfaceType> _isFutureOf; 50 AsserterBuilder<List<Asserter<DartType>>, InterfaceType> _isFutureOf;
51 AsserterBuilder<List<Asserter<DartType>>, InterfaceType> _isFutureOrOf;
49 AsserterBuilderBuilder<Asserter<DartType>, List<Asserter<DartType>>, DartType> 52 AsserterBuilderBuilder<Asserter<DartType>, List<Asserter<DartType>>, DartType>
50 _isInstantiationOf; 53 _isInstantiationOf;
51 AsserterBuilder<Asserter<DartType>, InterfaceType> _isListOf; 54 AsserterBuilder<Asserter<DartType>, InterfaceType> _isListOf;
52 AsserterBuilder2<Asserter<DartType>, Asserter<DartType>, InterfaceType> 55 AsserterBuilder2<Asserter<DartType>, Asserter<DartType>, InterfaceType>
53 _isMapOf; 56 _isMapOf;
54 AsserterBuilder<List<Asserter<DartType>>, InterfaceType> _isStreamOf; 57 AsserterBuilder<List<Asserter<DartType>>, InterfaceType> _isStreamOf;
55 AsserterBuilder<DartType, DartType> _isType; 58 AsserterBuilder<DartType, DartType> _isType;
56 59
57 AsserterBuilder<Element, DartType> _hasElement; 60 AsserterBuilder<Element, DartType> _hasElement;
58 AsserterBuilder<DartType, DartType> _hasElementOf; 61 AsserterBuilder<DartType, DartType> _hasElementOf;
59 62
60 @override 63 @override
61 Future<TestAnalysisResult> computeAnalysisResult(Source source) async { 64 Future<TestAnalysisResult> computeAnalysisResult(Source source) async {
62 TestAnalysisResult result = await super.computeAnalysisResult(source); 65 TestAnalysisResult result = await super.computeAnalysisResult(source);
63 if (_assertions == null) { 66 if (_assertions == null) {
64 _assertions = new TypeAssertions(typeProvider); 67 _assertions = new TypeAssertions(typeProvider);
65 _isType = _assertions.isType; 68 _isType = _assertions.isType;
66 _hasElement = _assertions.hasElement; 69 _hasElement = _assertions.hasElement;
67 _isInstantiationOf = _assertions.isInstantiationOf; 70 _isInstantiationOf = _assertions.isInstantiationOf;
68 _isInt = _assertions.isInt; 71 _isInt = _assertions.isInt;
69 _isNum = _assertions.isNum; 72 _isNum = _assertions.isNum;
70 _isObject = _assertions.isObject; 73 _isObject = _assertions.isObject;
71 _isString = _assertions.isString; 74 _isString = _assertions.isString;
72 _isDynamic = _assertions.isDynamic; 75 _isDynamic = _assertions.isDynamic;
73 _isListOf = _assertions.isListOf; 76 _isListOf = _assertions.isListOf;
74 _isMapOf = _assertions.isMapOf; 77 _isMapOf = _assertions.isMapOf;
75 _isFunction2Of = _assertions.isFunction2Of; 78 _isFunction2Of = _assertions.isFunction2Of;
76 _hasElementOf = _assertions.hasElementOf; 79 _hasElementOf = _assertions.hasElementOf;
77 _isFutureOf = _isInstantiationOf(_hasElementOf(typeProvider.futureType)); 80 _isFutureOf = _isInstantiationOf(_hasElementOf(typeProvider.futureType));
81 _isFutureOrOf =
82 _isInstantiationOf(_hasElementOf(typeProvider.futureOrType));
78 _isFutureOfDynamic = _isFutureOf([_isDynamic]); 83 _isFutureOfDynamic = _isFutureOf([_isDynamic]);
79 _isFutureOfInt = _isFutureOf([_isInt]); 84 _isFutureOfInt = _isFutureOf([_isInt]);
85 _isFutureOrOfInt = _isFutureOrOf([_isInt]);
80 _isStreamOf = _isInstantiationOf(_hasElementOf(typeProvider.streamType)); 86 _isStreamOf = _isInstantiationOf(_hasElementOf(typeProvider.streamType));
81 } 87 }
82 return result; 88 return result;
83 } 89 }
84 90
85 fail_constrainedByBounds3() async { 91 fail_constrainedByBounds3() async {
86 // Test that upwards inference with two type variables does 92 // Test that upwards inference with two type variables does
87 // not propogate from the constrained variable to the unconstrained 93 // not propogate from the constrained variable to the unconstrained
88 // variable if they are ordered right to left, and that if the result 94 // variable if they are ordered right to left, and that if the result
89 // is not a valid instantiation an error is issued 95 // is not a valid instantiation an error is issued
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
128 VariableDeclaration decl = stmt.variables.variables[0]; 134 VariableDeclaration decl = stmt.variables.variables[0];
129 Expression call = decl.initializer; 135 Expression call = decl.initializer;
130 _isInt(call.staticType); 136 _isInt(call.staticType);
131 } 137 }
132 138
133 fail_futureOr_downwards7() async { 139 fail_futureOr_downwards7() async {
134 // Test that downwards inference incorporates bounds correctly 140 // Test that downwards inference incorporates bounds correctly
135 // when instantiating type variables. 141 // when instantiating type variables.
136 // TODO(leafp): I think this should pass once the inference changes 142 // TODO(leafp): I think this should pass once the inference changes
137 // that jmesserly is adding are landed. 143 // that jmesserly is adding are landed.
138 String code = r''' 144 MethodInvocation invoke = await _testFutureOr(r'''
139 import "dart:async";
140 T mk<T extends int>(T x) => null; 145 T mk<T extends int>(T x) => null;
141 FutureOr<int> test() => mk(new Future.value(42)); 146 FutureOr<int> test() => mk(new Future.value(42));
142 '''; 147 ''');
143 Source source = addSource(code);
144 TestAnalysisResult analysisResult = await computeAnalysisResult(source);
145 assertNoErrors(source);
146 verify([source]);
147 CompilationUnit unit = analysisResult.unit;
148 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
149 ExpressionFunctionBody body = test.functionExpression.body;
150 MethodInvocation invoke = body.expression;
151 _isFutureOfInt(invoke.staticType); 148 _isFutureOfInt(invoke.staticType);
152 _isFutureOfInt(invoke.argumentList.arguments[0].staticType); 149 _isFutureOfInt(invoke.argumentList.arguments[0].staticType);
153 } 150 }
154 151
155 fail_futureOr_downwards8() async { 152 fail_futureOr_downwards8() async {
156 // Test that downwards inference incorporates bounds correctly 153 // Test that downwards inference incorporates bounds correctly
157 // when instantiating type variables. 154 // when instantiating type variables.
158 // TODO(leafp): I think this should pass once the inference changes 155 // TODO(leafp): I think this should pass once the inference changes
159 // that jmesserly is adding are landed. 156 // that jmesserly is adding are landed.
160 String code = r''' 157 MethodInvocation invoke = await _testFutureOr(r'''
161 import "dart:async";
162 T mk<T extends Future<Object>>(T x) => null; 158 T mk<T extends Future<Object>>(T x) => null;
163 FutureOr<int> test() => mk(new Future.value(42)); 159 FutureOr<int> test() => mk(new Future.value(42));
164 '''; 160 ''');
165 Source source = addSource(code);
166 TestAnalysisResult analysisResult = await computeAnalysisResult(source);
167 assertNoErrors(source);
168 verify([source]);
169 CompilationUnit unit = analysisResult.unit;
170 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
171 ExpressionFunctionBody body = test.functionExpression.body;
172 MethodInvocation invoke = body.expression;
173 _isFutureOfInt(invoke.staticType); 161 _isFutureOfInt(invoke.staticType);
174 _isFutureOfInt(invoke.argumentList.arguments[0].staticType); 162 _isFutureOfInt(invoke.argumentList.arguments[0].staticType);
175 } 163 }
176 164
177 fail_pinning_multipleConstraints1() async { 165 fail_pinning_multipleConstraints1() async {
178 // Test that downwards inference with two different downwards covariant 166 // Test that downwards inference with two different downwards covariant
179 // constraints on the same parameter correctly fails to infer when 167 // constraints on the same parameter correctly fails to infer when
180 // the types do not share a common subtype 168 // the types do not share a common subtype
181 String code = r''' 169 String code = r'''
182 class A<S, T> { 170 class A<S, T> {
(...skipping 780 matching lines...) Expand 10 before | Expand all | Expand 10 after
963 expect(functionReturnValue(0).staticType, typeProvider.intType); 951 expect(functionReturnValue(0).staticType, typeProvider.intType);
964 expect(functionReturnValue(1).staticType, typeProvider.intType); 952 expect(functionReturnValue(1).staticType, typeProvider.intType);
965 expect(functionReturnValue(2).staticType, typeProvider.intType); 953 expect(functionReturnValue(2).staticType, typeProvider.intType);
966 expect(functionReturnValue(3).staticType, typeProvider.dynamicType); 954 expect(functionReturnValue(3).staticType, typeProvider.dynamicType);
967 expect(functionReturnValue(4).staticType, typeProvider.stringType); 955 expect(functionReturnValue(4).staticType, typeProvider.stringType);
968 } 956 }
969 957
970 test_futureOr_downwards1() async { 958 test_futureOr_downwards1() async {
971 // Test that downwards inference interacts correctly with FutureOr 959 // Test that downwards inference interacts correctly with FutureOr
972 // parameters. 960 // parameters.
973 String code = r''' 961 MethodInvocation invoke = await _testFutureOr(r'''
974 import "dart:async";
975 Future<T> mk<T>(FutureOr<T> x) => null; 962 Future<T> mk<T>(FutureOr<T> x) => null;
976 Future<int> test() => mk(new Future<int>.value(42)); 963 Future<int> test() => mk(new Future<int>.value(42));
977 '''; 964 ''');
978 Source source = addSource(code);
979 TestAnalysisResult analysisResult = await computeAnalysisResult(source);
980 assertNoErrors(source);
981 verify([source]);
982 CompilationUnit unit = analysisResult.unit;
983 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
984 ExpressionFunctionBody body = test.functionExpression.body;
985 MethodInvocation invoke = body.expression;
986 _isFutureOfInt(invoke.staticType); 965 _isFutureOfInt(invoke.staticType);
987 } 966 }
988 967
989 test_futureOr_downwards2() async { 968 test_futureOr_downwards2() async {
990 // Test that downwards inference interacts correctly with FutureOr 969 // Test that downwards inference interacts correctly with FutureOr
991 // parameters when the downwards context is FutureOr 970 // parameters when the downwards context is FutureOr
992 String code = r''' 971 MethodInvocation invoke = await _testFutureOr(r'''
993 import "dart:async";
994 Future<T> mk<T>(FutureOr<T> x) => null; 972 Future<T> mk<T>(FutureOr<T> x) => null;
995 FutureOr<int> test() => mk(new Future<int>.value(42)); 973 FutureOr<int> test() => mk(new Future<int>.value(42));
996 '''; 974 ''');
997 Source source = addSource(code);
998 TestAnalysisResult analysisResult = await computeAnalysisResult(source);
999 assertNoErrors(source);
1000 verify([source]);
1001 CompilationUnit unit = analysisResult.unit;
1002 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
1003 ExpressionFunctionBody body = test.functionExpression.body;
1004 MethodInvocation invoke = body.expression;
1005 _isFutureOfInt(invoke.staticType); 975 _isFutureOfInt(invoke.staticType);
1006 } 976 }
1007 977
1008 test_futureOr_downwards3() async { 978 test_futureOr_downwards3() async {
1009 // Test that downwards inference correctly propogates into 979 // Test that downwards inference correctly propogates into
1010 // arguments. 980 // arguments.
1011 String code = r''' 981 MethodInvocation invoke = await _testFutureOr(r'''
1012 import "dart:async";
1013 Future<T> mk<T>(FutureOr<T> x) => null; 982 Future<T> mk<T>(FutureOr<T> x) => null;
1014 Future<int> test() => mk(new Future.value(42)); 983 Future<int> test() => mk(new Future.value(42));
1015 '''; 984 ''');
1016 Source source = addSource(code);
1017 TestAnalysisResult analysisResult = await computeAnalysisResult(source);
1018 assertNoErrors(source);
1019 verify([source]);
1020 CompilationUnit unit = analysisResult.unit;
1021 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
1022 ExpressionFunctionBody body = test.functionExpression.body;
1023 MethodInvocation invoke = body.expression;
1024 _isFutureOfInt(invoke.staticType); 985 _isFutureOfInt(invoke.staticType);
1025 _isFutureOfInt(invoke.argumentList.arguments[0].staticType); 986 _isFutureOfInt(invoke.argumentList.arguments[0].staticType);
1026 } 987 }
1027 988
1028 test_futureOr_downwards4() async { 989 test_futureOr_downwards4() async {
1029 // Test that downwards inference interacts correctly with FutureOr 990 // Test that downwards inference interacts correctly with FutureOr
1030 // parameters when the downwards context is FutureOr 991 // parameters when the downwards context is FutureOr
1031 String code = r''' 992 MethodInvocation invoke = await _testFutureOr(r'''
1032 import "dart:async";
1033 Future<T> mk<T>(FutureOr<T> x) => null; 993 Future<T> mk<T>(FutureOr<T> x) => null;
1034 FutureOr<int> test() => mk(new Future.value(42)); 994 FutureOr<int> test() => mk(new Future.value(42));
1035 '''; 995 ''');
1036 Source source = addSource(code);
1037 TestAnalysisResult analysisResult = await computeAnalysisResult(source);
1038 assertNoErrors(source);
1039 verify([source]);
1040 CompilationUnit unit = analysisResult.unit;
1041 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
1042 ExpressionFunctionBody body = test.functionExpression.body;
1043 MethodInvocation invoke = body.expression;
1044 _isFutureOfInt(invoke.staticType); 996 _isFutureOfInt(invoke.staticType);
1045 _isFutureOfInt(invoke.argumentList.arguments[0].staticType); 997 _isFutureOfInt(invoke.argumentList.arguments[0].staticType);
1046 } 998 }
1047 999
1048 test_futureOr_downwards5() async { 1000 test_futureOr_downwards5() async {
1049 // Test that downwards inference correctly pins the type when it 1001 // Test that downwards inference correctly pins the type when it
1050 // comes from a FutureOr 1002 // comes from a FutureOr
1051 String code = r''' 1003 MethodInvocation invoke = await _testFutureOr(r'''
1052 import "dart:async";
1053 Future<T> mk<T>(FutureOr<T> x) => null; 1004 Future<T> mk<T>(FutureOr<T> x) => null;
1054 FutureOr<num> test() => mk(new Future.value(42)); 1005 FutureOr<num> test() => mk(new Future.value(42));
1055 '''; 1006 ''');
1056 Source source = addSource(code);
1057 TestAnalysisResult analysisResult = await computeAnalysisResult(source);
1058 assertNoErrors(source);
1059 verify([source]);
1060 CompilationUnit unit = analysisResult.unit;
1061 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
1062 ExpressionFunctionBody body = test.functionExpression.body;
1063 MethodInvocation invoke = body.expression;
1064 _isFutureOf([_isNum])(invoke.staticType); 1007 _isFutureOf([_isNum])(invoke.staticType);
1065 _isFutureOf([_isNum])(invoke.argumentList.arguments[0].staticType); 1008 _isFutureOf([_isNum])(invoke.argumentList.arguments[0].staticType);
1066 } 1009 }
1067 1010
1068 test_futureOr_downwards6() async { 1011 test_futureOr_downwards6() async {
1069 // Test that downwards inference doesn't decompose FutureOr 1012 // Test that downwards inference doesn't decompose FutureOr
1070 // when instantiating type variables. 1013 // when instantiating type variables.
1071 String code = r''' 1014 MethodInvocation invoke = await _testFutureOr(r'''
1072 import "dart:async";
1073 T mk<T>(T x) => null; 1015 T mk<T>(T x) => null;
1074 FutureOr<int> test() => mk(new Future.value(42)); 1016 FutureOr<int> test() => mk(new Future.value(42));
1075 '''; 1017 ''');
1076 Source source = addSource(code);
1077 TestAnalysisResult analysisResult = await computeAnalysisResult(source);
1078 assertNoErrors(source);
1079 verify([source]);
1080 CompilationUnit unit = analysisResult.unit;
1081 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
1082 ExpressionFunctionBody body = test.functionExpression.body;
1083 MethodInvocation invoke = body.expression;
1084 _isFutureOfInt(invoke.staticType); 1018 _isFutureOfInt(invoke.staticType);
1085 _isFutureOfInt(invoke.argumentList.arguments[0].staticType); 1019 _isFutureOfInt(invoke.argumentList.arguments[0].staticType);
1086 } 1020 }
1087 1021
1088 test_futureOr_downwards9() async { 1022 test_futureOr_downwards9() async {
1089 // Test that downwards inference decomposes correctly with 1023 // Test that downwards inference decomposes correctly with
1090 // other composite types 1024 // other composite types
1091 String code = r''' 1025 MethodInvocation invoke = await _testFutureOr(r'''
1092 import "dart:async";
1093 List<T> mk<T>(T x) => null; 1026 List<T> mk<T>(T x) => null;
1094 FutureOr<List<int>> test() => mk(3); 1027 FutureOr<List<int>> test() => mk(3);
1095 '''; 1028 ''');
1096 Source source = addSource(code);
1097 TestAnalysisResult analysisResult = await computeAnalysisResult(source);
1098 assertNoErrors(source);
1099 verify([source]);
1100 CompilationUnit unit = analysisResult.unit;
1101 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
1102 ExpressionFunctionBody body = test.functionExpression.body;
1103 MethodInvocation invoke = body.expression;
1104 _isListOf(_isInt)(invoke.staticType); 1029 _isListOf(_isInt)(invoke.staticType);
1105 _isInt(invoke.argumentList.arguments[0].staticType); 1030 _isInt(invoke.argumentList.arguments[0].staticType);
1106 } 1031 }
1107 1032
1108 test_futureOr_methods1() async { 1033 test_futureOr_methods1() async {
1109 // Test that FutureOr has the Object methods 1034 // Test that FutureOr has the Object methods
1110 String code = r''' 1035 MethodInvocation invoke = await _testFutureOr(r'''
1111 import "dart:async";
1112 dynamic test(FutureOr<int> x) => x.toString(); 1036 dynamic test(FutureOr<int> x) => x.toString();
1113 '''; 1037 ''');
1114 Source source = addSource(code);
1115 TestAnalysisResult analysisResult = await computeAnalysisResult(source);
1116 assertNoErrors(source);
1117 verify([source]);
1118 CompilationUnit unit = analysisResult.unit;
1119 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
1120 ExpressionFunctionBody body = test.functionExpression.body;
1121 MethodInvocation invoke = body.expression;
1122 _isString(invoke.staticType); 1038 _isString(invoke.staticType);
1123 } 1039 }
1124 1040
1125 test_futureOr_methods2() async { 1041 test_futureOr_methods2() async {
1126 // Test that FutureOr does not have the constituent type methods 1042 // Test that FutureOr does not have the constituent type methods
1127 String code = r''' 1043 MethodInvocation invoke = await _testFutureOr(
1128 import "dart:async"; 1044 r'''
1129 dynamic test(FutureOr<int> x) => x.abs(); 1045 dynamic test(FutureOr<int> x) => x.abs();
1130 '''; 1046 ''',
1131 Source source = addSource(code); 1047 errors: [StaticTypeWarningCode.UNDEFINED_METHOD]);
1132 TestAnalysisResult analysisResult = await computeAnalysisResult(source);
1133 assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
1134 verify([source]);
1135 CompilationUnit unit = analysisResult.unit;
1136 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
1137 ExpressionFunctionBody body = test.functionExpression.body;
1138 MethodInvocation invoke = body.expression;
1139 _isDynamic(invoke.staticType); 1048 _isDynamic(invoke.staticType);
1140 } 1049 }
1141 1050
1142 test_futureOr_methods3() async { 1051 test_futureOr_methods3() async {
1143 // Test that FutureOr does not have the Future type methods 1052 // Test that FutureOr does not have the Future type methods
1144 String code = r''' 1053 MethodInvocation invoke = await _testFutureOr(
1145 import "dart:async"; 1054 r'''
1146 dynamic test(FutureOr<int> x) => x.then((x) => x); 1055 dynamic test(FutureOr<int> x) => x.then((x) => x);
1147 '''; 1056 ''',
1148 Source source = addSource(code); 1057 errors: [StaticTypeWarningCode.UNDEFINED_METHOD]);
1149 TestAnalysisResult analysisResult = await computeAnalysisResult(source);
1150 assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
1151 verify([source]);
1152 CompilationUnit unit = analysisResult.unit;
1153 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
1154 ExpressionFunctionBody body = test.functionExpression.body;
1155 MethodInvocation invoke = body.expression;
1156 _isDynamic(invoke.staticType); 1058 _isDynamic(invoke.staticType);
1157 } 1059 }
1158 1060
1159 test_futureOr_methods4() async { 1061 test_futureOr_methods4() async {
1160 // Test that FutureOr<dynamic> does not have all methods 1062 // Test that FutureOr<dynamic> does not have all methods
1161 String code = r''' 1063 MethodInvocation invoke = await _testFutureOr(
1162 import "dart:async"; 1064 r'''
1163 dynamic test(FutureOr<dynamic> x) => x.abs(); 1065 dynamic test(FutureOr<dynamic> x) => x.abs();
1164 '''; 1066 ''',
1165 Source source = addSource(code); 1067 errors: [StaticTypeWarningCode.UNDEFINED_METHOD]);
1166 TestAnalysisResult analysisResult = await computeAnalysisResult(source);
1167 assertErrors(source, [StaticTypeWarningCode.UNDEFINED_METHOD]);
1168 verify([source]);
1169 CompilationUnit unit = analysisResult.unit;
1170 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
1171 ExpressionFunctionBody body = test.functionExpression.body;
1172 MethodInvocation invoke = body.expression;
1173 _isDynamic(invoke.staticType); 1068 _isDynamic(invoke.staticType);
1174 } 1069 }
1175 1070
1176 test_futureOr_upwards1() async { 1071 test_futureOr_upwards1() async {
1177 // Test that upwards inference correctly prefers to instantiate type 1072 // Test that upwards inference correctly prefers to instantiate type
1178 // variables with the "smaller" solution when both are possible. 1073 // variables with the "smaller" solution when both are possible.
1179 String code = r''' 1074 MethodInvocation invoke = await _testFutureOr(r'''
1180 import "dart:async";
1181 Future<T> mk<T>(FutureOr<T> x) => null; 1075 Future<T> mk<T>(FutureOr<T> x) => null;
1182 dynamic test() => mk(new Future<int>.value(42)); 1076 dynamic test() => mk(new Future<int>.value(42));
1183 '''; 1077 ''');
1184 Source source = addSource(code);
1185 TestAnalysisResult analysisResult = await computeAnalysisResult(source);
1186 assertNoErrors(source);
1187 verify([source]);
1188 CompilationUnit unit = analysisResult.unit;
1189 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
1190 ExpressionFunctionBody body = test.functionExpression.body;
1191 MethodInvocation invoke = body.expression;
1192 _isFutureOfInt(invoke.staticType); 1078 _isFutureOfInt(invoke.staticType);
1193 } 1079 }
1194 1080
1195 test_futureOr_upwards2() async { 1081 test_futureOr_upwards2() async {
1196 // Test that upwards inference fails when the solution doesn't 1082 // Test that upwards inference fails when the solution doesn't
1197 // match the bound. 1083 // match the bound.
1198 String code = r''' 1084 MethodInvocation invoke = await _testFutureOr(
1199 import "dart:async"; 1085 r'''
1200 Future<T> mk<T extends Future<Object>>(FutureOr<T> x) => null; 1086 Future<T> mk<T extends Future<Object>>(FutureOr<T> x) => null;
1201 dynamic test() => mk(new Future<int>.value(42)); 1087 dynamic test() => mk(new Future<int>.value(42));
1202 '''; 1088 ''',
1203 Source source = addSource(code); 1089 errors: [StrongModeCode.COULD_NOT_INFER]);
1204 TestAnalysisResult analysisResult = await computeAnalysisResult(source);
1205 assertErrors(source, [StrongModeCode.COULD_NOT_INFER]);
1206 verify([source]);
1207 CompilationUnit unit = analysisResult.unit;
1208 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test");
1209 ExpressionFunctionBody body = test.functionExpression.body;
1210 MethodInvocation invoke = body.expression;
1211 _isFutureOf([_isObject])(invoke.staticType); 1090 _isFutureOf([_isObject])(invoke.staticType);
1212 } 1091 }
1213 1092
1093 test_futureOr_assignFromValue() async {
1094 // Test a T can be assigned to FutureOr<T>.
1095 MethodInvocation invoke = await _testFutureOr(r'''
1096 FutureOr<T> mk<T>(T x) => x;
1097 test() => mk(42);
1098 ''');
1099 _isFutureOrOfInt(invoke.staticType);
1100 }
1101
1102 test_futureOr_assignFromFuture() async {
1103 // Test a Future<T> can be assigned to FutureOr<T>.
1104 MethodInvocation invoke = await _testFutureOr(r'''
1105 FutureOr<T> mk<T>(Future<T> x) => x;
1106 test() => mk(new Future<int>.value(42));
1107 ''');
1108 _isFutureOrOfInt(invoke.staticType);
1109 }
1110
1111 test_futureOr_await() async {
1112 // Test a FutureOr<T> can be awaited.
1113 MethodInvocation invoke = await _testFutureOr(r'''
1114 Future<T> mk<T>(FutureOr<T> x) async => await x;
1115 test() => mk(42);
1116 ''');
1117 _isFutureOfInt(invoke.staticType);
1118 }
1119
1120 test_futureOr_asyncExpressionBody() async {
1121 // A FutureOr<T> can be used as the expression body for an async function
1122 MethodInvocation invoke = await _testFutureOr(r'''
1123 Future<T> mk<T>(FutureOr<T> x) async => x;
1124 test() => mk(42);
1125 ''');
1126 _isFutureOfInt(invoke.staticType);
1127 }
1128
1129 test_futureOr_asyncReturn() async {
1130 // A FutureOr<T> can be used as the return value for an async function
1131 MethodInvocation invoke = await _testFutureOr(r'''
1132 Future<T> mk<T>(FutureOr<T> x) async { return x; }
1133 test() => mk(42);
1134 ''');
1135 _isFutureOfInt(invoke.staticType);
1136 }
1137
1214 test_inference_hints() async { 1138 test_inference_hints() async {
1215 Source source = addSource(r''' 1139 Source source = addSource(r'''
1216 void main () { 1140 void main () {
1217 var x = 3; 1141 var x = 3;
1218 List<int> l0 = []; 1142 List<int> l0 = [];
1219 } 1143 }
1220 '''); 1144 ''');
1221 await computeAnalysisResult(source); 1145 await computeAnalysisResult(source);
1222 assertNoErrors(source); 1146 assertNoErrors(source);
1223 verify([source]); 1147 verify([source]);
(...skipping 842 matching lines...) Expand 10 before | Expand all | Expand 10 after
2066 Expression exp = stmt.expression; 1990 Expression exp = stmt.expression;
2067 typeTest(exp.staticType); 1991 typeTest(exp.staticType);
2068 } 1992 }
2069 1993
2070 check("f0", _isListOf(_isDynamic)); 1994 check("f0", _isListOf(_isDynamic));
2071 check("f1", _isListOf(_isDynamic)); 1995 check("f1", _isListOf(_isDynamic));
2072 1996
2073 check("f2", _isListOf(_isInt)); 1997 check("f2", _isListOf(_isInt));
2074 check("f3", _isListOf((DartType type) => _isListOf(_isInt)(type))); 1998 check("f3", _isListOf((DartType type) => _isListOf(_isInt)(type)));
2075 } 1999 }
2000
2001 /// Helper method for testing `FutureOr<T>`.
2002 ///
2003 /// Validates that [code] produces [errors]. It should define a function
2004 /// "test", whose body is an expression that invokes a method. Returns that
2005 /// invocation.
2006 Future<MethodInvocation> _testFutureOr(String code,
2007 {List<ErrorCode> errors}) async {
2008 Source source = addSource("""
2009 import "dart:async";
2010 $code""");
2011 TestAnalysisResult analysisResult = await computeAnalysisResult(source);
2012
2013 if (errors == null) {
2014 assertNoErrors(source);
2015 } else {
2016 assertErrors(source, errors);
2017 }
2018 verify([source]);
2019 FunctionDeclaration test =
2020 AstFinder.getTopLevelFunction(analysisResult.unit, "test");
2021 ExpressionFunctionBody body = test.functionExpression.body;
2022 return body.expression;
2023 }
2076 } 2024 }
2077 2025
2078 /** 2026 /**
2079 * Strong mode static analyzer end to end tests 2027 * Strong mode static analyzer end to end tests
2080 */ 2028 */
2081 @reflectiveTest 2029 @reflectiveTest
2082 class StrongModeStaticTypeAnalyzer2Test extends StaticTypeAnalyzer2TestShared { 2030 class StrongModeStaticTypeAnalyzer2Test extends StaticTypeAnalyzer2TestShared {
2083 void expectStaticInvokeType(String search, String type) { 2031 void expectStaticInvokeType(String search, String type) {
2084 var invocation = findIdentifier(search).parent as MethodInvocation; 2032 var invocation = findIdentifier(search).parent as MethodInvocation;
2085 expect(invocation.staticInvokeType.toString(), type); 2033 expect(invocation.staticInvokeType.toString(), type);
(...skipping 1328 matching lines...) Expand 10 before | Expand all | Expand 10 after
3414 var v = x; 3362 var v = x;
3415 v; // marker 3363 v; // marker
3416 } 3364 }
3417 int x = 3; 3365 int x = 3;
3418 '''; 3366 ''';
3419 CompilationUnit unit = await resolveSource(code); 3367 CompilationUnit unit = await resolveSource(code);
3420 assertPropagatedAssignedType(code, unit, typeProvider.intType, null); 3368 assertPropagatedAssignedType(code, unit, typeProvider.intType, null);
3421 assertTypeOfMarkedExpression(code, unit, typeProvider.intType, null); 3369 assertTypeOfMarkedExpression(code, unit, typeProvider.intType, null);
3422 } 3370 }
3423 } 3371 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698