OLD | NEW |
---|---|
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'; |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
85 _isInstantiationOf(_hasElementOf(typeProvider.futureOrType)); | 85 _isInstantiationOf(_hasElementOf(typeProvider.futureOrType)); |
86 _isFutureOfDynamic = _isFutureOf([_isDynamic]); | 86 _isFutureOfDynamic = _isFutureOf([_isDynamic]); |
87 _isFutureOfInt = _isFutureOf([_isInt]); | 87 _isFutureOfInt = _isFutureOf([_isInt]); |
88 _isFutureOfNull = _isFutureOf([_isNull]); | 88 _isFutureOfNull = _isFutureOf([_isNull]); |
89 _isFutureOrOfInt = _isFutureOrOf([_isInt]); | 89 _isFutureOrOfInt = _isFutureOrOf([_isInt]); |
90 _isStreamOf = _isInstantiationOf(_hasElementOf(typeProvider.streamType)); | 90 _isStreamOf = _isInstantiationOf(_hasElementOf(typeProvider.streamType)); |
91 } | 91 } |
92 return result; | 92 return result; |
93 } | 93 } |
94 | 94 |
95 fail_constrainedByBounds3() async { | 95 @override |
96 // Test that upwards inference with two type variables does | 96 void setUp() { |
97 // not propogate from the constrained variable to the unconstrained | 97 super.setUp(); |
98 // variable if they are ordered right to left, and that if the result | 98 AnalysisOptionsImpl options = new AnalysisOptionsImpl(); |
99 // is not a valid instantiation an error is issued | 99 options.strongMode = true; |
100 String code = r''' | 100 resetWith(options: options); |
101 T f<T extends S, S extends int>(S x) => null; | 101 } |
102 void test() { var x = f(3); } | 102 |
103 '''; | 103 test_constrainedByBounds3() async { |
Leaf
2017/03/14 22:37:40
Sort methods in file?
Jennifer Messerly
2017/03/14 23:49:09
I can do that. It will destroy the diff, but that
| |
104 Source source = addSource(code); | 104 Source source = addSource(r''' |
105 T f<T extends S, S extends int>(S x) => null; | |
106 void test() { var x = f(3); } | |
107 '''); | |
105 TestAnalysisResult analysisResult = await computeAnalysisResult(source); | 108 TestAnalysisResult analysisResult = await computeAnalysisResult(source); |
106 assertErrors( | 109 assertNoErrors(source); |
107 source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]); | |
108 verify([source]); | 110 verify([source]); |
109 CompilationUnit unit = analysisResult.unit; | 111 CompilationUnit unit = analysisResult.unit; |
110 List<Statement> statements = | 112 List<Statement> statements = |
111 AstFinder.getStatementsInTopLevelFunction(unit, "test"); | 113 AstFinder.getStatementsInTopLevelFunction(unit, "test"); |
112 VariableDeclarationStatement stmt = statements[0]; | 114 VariableDeclarationStatement stmt = statements[0]; |
113 VariableDeclaration decl = stmt.variables.variables[0]; | 115 VariableDeclaration decl = stmt.variables.variables[0]; |
114 Expression call = decl.initializer; | 116 Expression call = decl.initializer; |
115 _isDynamic(call.staticType); | 117 _isInt(call.staticType); |
116 } | 118 } |
117 | 119 |
118 fail_constrainedByBounds5() async { | 120 test_constrainedByBounds5() async { |
119 // Test that upwards inference with two type variables does not | 121 // Test that upwards inference with two type variables does not |
120 // propogate from the constrained variable to the unconstrained | 122 // propogate from the constrained variable to the unconstrained |
121 // variable if they are ordered right to left, when the variable | 123 // variable if they are ordered right to left, when the variable |
122 // appears co and contra variantly, and that an error is issued | 124 // appears co and contra variantly, and that an error is issued |
123 // for the non-matching bound. | 125 // for the non-matching bound. |
124 String code = r''' | 126 String code = r''' |
125 typedef To Func1<From, To>(From x); | 127 typedef To Func1<From, To>(From x); |
126 T f<T extends Func1<S, S>, S>(S x) => null; | 128 T f<T extends Func1<S, S>, S>(S x) => null; |
127 void test() { var x = f(3)(4); } | 129 void test() { var x = f(3)(4); } |
128 '''; | 130 '''; |
129 Source source = addSource(code); | 131 Source source = addSource(code); |
130 TestAnalysisResult analysisResult = await computeAnalysisResult(source); | 132 TestAnalysisResult analysisResult = await computeAnalysisResult(source); |
131 assertErrors( | 133 assertErrors(source, [StrongModeCode.COULD_NOT_INFER]); |
132 source, [StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS]); | |
133 verify([source]); | 134 verify([source]); |
134 CompilationUnit unit = analysisResult.unit; | 135 CompilationUnit unit = analysisResult.unit; |
135 List<Statement> statements = | 136 List<Statement> statements = |
136 AstFinder.getStatementsInTopLevelFunction(unit, "test"); | 137 AstFinder.getStatementsInTopLevelFunction(unit, "test"); |
137 VariableDeclarationStatement stmt = statements[0]; | 138 VariableDeclarationStatement stmt = statements[0]; |
138 VariableDeclaration decl = stmt.variables.variables[0]; | 139 VariableDeclaration decl = stmt.variables.variables[0]; |
139 Expression call = decl.initializer; | 140 Expression call = decl.initializer; |
140 _isInt(call.staticType); | 141 _isDynamic(call.staticType); |
141 } | 142 } |
142 | 143 |
143 fail_futureOr_downwards7() async { | 144 test_futureOr_downwards7() async { |
144 // Test that downwards inference incorporates bounds correctly | 145 // Test that downwards inference incorporates bounds correctly |
145 // when instantiating type variables. | 146 // when instantiating type variables. |
146 // TODO(leafp): I think this should pass once the inference changes | |
147 // that jmesserly is adding are landed. | |
148 MethodInvocation invoke = await _testFutureOr(r''' | 147 MethodInvocation invoke = await _testFutureOr(r''' |
149 T mk<T extends int>(T x) => null; | 148 T mk<T extends Future<int>>(T x) => null; |
150 FutureOr<int> test() => mk(new Future.value(42)); | 149 FutureOr<int> test() => mk(new Future.value(42)); |
151 '''); | 150 '''); |
152 _isFutureOfInt(invoke.staticType); | 151 _isFutureOfInt(invoke.staticType); |
153 _isFutureOfInt(invoke.argumentList.arguments[0].staticType); | 152 _isFutureOfInt(invoke.argumentList.arguments[0].staticType); |
154 } | 153 } |
155 | 154 |
156 fail_futureOr_downwards8() async { | 155 test_futureOr_downwards8() async { |
157 // Test that downwards inference incorporates bounds correctly | 156 // Test that downwards inference incorporates bounds correctly |
158 // when instantiating type variables. | 157 // when instantiating type variables. |
159 // TODO(leafp): I think this should pass once the inference changes | 158 // TODO(leafp): I think this should pass once the inference changes |
160 // that jmesserly is adding are landed. | 159 // that jmesserly is adding are landed. |
161 MethodInvocation invoke = await _testFutureOr(r''' | 160 MethodInvocation invoke = await _testFutureOr(r''' |
162 T mk<T extends Future<Object>>(T x) => null; | 161 T mk<T extends Future<Object>>(T x) => null; |
163 FutureOr<int> test() => mk(new Future.value(42)); | 162 FutureOr<int> test() => mk(new Future.value(42)); |
164 '''); | 163 '''); |
165 _isFutureOfInt(invoke.staticType); | 164 _isFutureOfInt(invoke.staticType); |
166 _isFutureOfInt(invoke.argumentList.arguments[0].staticType); | 165 _isFutureOfInt(invoke.argumentList.arguments[0].staticType); |
167 } | 166 } |
168 | 167 |
169 fail_pinning_multipleConstraints1() async { | 168 test_pinning_multipleConstraints1() async { |
170 // Test that downwards inference with two different downwards covariant | 169 // Test that downwards inference with two different downwards covariant |
171 // constraints on the same parameter correctly fails to infer when | 170 // constraints on the same parameter correctly fails to infer when |
172 // the types do not share a common subtype | 171 // the types do not share a common subtype |
173 String code = r''' | 172 String code = r''' |
174 class A<S, T> { | 173 class A<S, T> { |
175 S s; | 174 S s; |
176 T t; | 175 T t; |
177 } | 176 } |
178 class B<S> extends A<S, S> { B(S s); } | 177 class B<S> extends A<S, S> { B(S s); } |
179 A<int, String> test() => new B(3); | 178 A<int, String> test() => new B(3); |
180 '''; | 179 '''; |
181 Source source = addSource(code); | 180 Source source = addSource(code); |
182 TestAnalysisResult analysisResult = await computeAnalysisResult(source); | 181 TestAnalysisResult analysisResult = await computeAnalysisResult(source); |
183 assertErrors(source, [StrongModeCode.COULD_NOT_INFER]); | 182 assertErrors(source, |
183 [StrongModeCode.COULD_NOT_INFER, StrongModeCode.INVALID_CAST_LITERAL]); | |
184 verify([source]); | 184 verify([source]); |
185 CompilationUnit unit = analysisResult.unit; | 185 CompilationUnit unit = analysisResult.unit; |
186 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test"); | 186 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test"); |
187 ExpressionFunctionBody body = test.functionExpression.body; | 187 ExpressionFunctionBody body = test.functionExpression.body; |
188 DartType type = body.expression.staticType; | 188 DartType type = body.expression.staticType; |
189 | 189 |
190 Element elementB = AstFinder.getClass(unit, "B").element; | 190 Element elementB = AstFinder.getClass(unit, "B").element; |
191 | 191 |
192 _isInstantiationOf(_hasElement(elementB))([_isDynamic])(type); | 192 _isInstantiationOf(_hasElement(elementB))([_isNull])(type); |
193 } | 193 } |
194 | 194 |
195 fail_pinning_multipleConstraints2() async { | 195 test_pinning_multipleConstraints2() async { |
196 // Test that downwards inference with two identical downwards covariant | 196 // Test that downwards inference with two identical downwards covariant |
197 // constraints on the same parameter correctly infers and pins the type | 197 // constraints on the same parameter correctly infers and pins the type |
198 String code = r''' | 198 String code = r''' |
199 class A<S, T> { | 199 class A<S, T> { |
200 S s; | 200 S s; |
201 T t; | 201 T t; |
202 } | 202 } |
203 class B<S> extends A<S, S> { B(S s); } | 203 class B<S> extends A<S, S> { B(S s); } |
204 A<num, num> test() => new B(3); | 204 A<num, num> test() => new B(3); |
205 '''; | 205 '''; |
206 Source source = addSource(code); | 206 Source source = addSource(code); |
207 TestAnalysisResult analysisResult = await computeAnalysisResult(source); | 207 TestAnalysisResult analysisResult = await computeAnalysisResult(source); |
208 assertNoErrors(source); | 208 assertNoErrors(source); |
209 verify([source]); | 209 verify([source]); |
210 CompilationUnit unit = analysisResult.unit; | 210 CompilationUnit unit = analysisResult.unit; |
211 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test"); | 211 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test"); |
212 ExpressionFunctionBody body = test.functionExpression.body; | 212 ExpressionFunctionBody body = test.functionExpression.body; |
213 DartType type = body.expression.staticType; | 213 DartType type = body.expression.staticType; |
214 | 214 |
215 Element elementB = AstFinder.getClass(unit, "B").element; | 215 Element elementB = AstFinder.getClass(unit, "B").element; |
216 | 216 |
217 _isInstantiationOf(_hasElement(elementB))([_isNum])(type); | 217 _isInstantiationOf(_hasElement(elementB))([_isNum])(type); |
218 } | 218 } |
219 | 219 |
220 fail_pinning_multipleConstraints3() async { | 220 test_pinning_multipleConstraints3() async { |
221 // Test that downwards inference with two different downwards covariant | 221 // Test that downwards inference with two different downwards covariant |
222 // constraints on the same parameter correctly fails to infer when | 222 // constraints on the same parameter correctly fails to infer when |
223 // the types do not share a common subtype, but do share a common supertype | 223 // the types do not share a common subtype, but do share a common supertype |
224 String code = r''' | 224 String code = r''' |
225 class A<S, T> { | 225 class A<S, T> { |
226 S s; | 226 S s; |
227 T t; | 227 T t; |
228 } | 228 } |
229 class B<S> extends A<S, S> { B(S s); } | 229 class B<S> extends A<S, S> { B(S s); } |
230 A<int, double> test() => new B(3); | 230 A<int, double> test() => new B(3); |
231 '''; | 231 '''; |
232 Source source = addSource(code); | 232 Source source = addSource(code); |
233 TestAnalysisResult analysisResult = await computeAnalysisResult(source); | 233 TestAnalysisResult analysisResult = await computeAnalysisResult(source); |
234 assertErrors(source, [ | 234 assertErrors(source, [ |
235 StrongModeCode.COULD_NOT_INFER, | 235 StrongModeCode.COULD_NOT_INFER, |
236 StaticTypeWarningCode.RETURN_OF_INVALID_TYPE | 236 StrongModeCode.INVALID_CAST_LITERAL, |
237 ]); | 237 ]); |
238 verify([source]); | 238 verify([source]); |
239 CompilationUnit unit = analysisResult.unit; | 239 CompilationUnit unit = analysisResult.unit; |
240 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test"); | 240 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test"); |
241 ExpressionFunctionBody body = test.functionExpression.body; | 241 ExpressionFunctionBody body = test.functionExpression.body; |
242 DartType type = body.expression.staticType; | 242 DartType type = body.expression.staticType; |
243 | 243 |
244 Element elementB = AstFinder.getClass(unit, "B").element; | 244 Element elementB = AstFinder.getClass(unit, "B").element; |
245 | 245 |
246 _isInstantiationOf(_hasElement(elementB))([_isDynamic])(type); | 246 _isInstantiationOf(_hasElement(elementB))([_isNull])(type); |
247 } | 247 } |
248 | 248 |
249 fail_returnType_variance2() async { | 249 test_returnType_variance2() async { |
250 // Check that downwards inference correctly pins a type parameter | 250 // Check that downwards inference correctly pins a type parameter |
251 // when the parameter is constrained in a covariant position | 251 // when the parameter is constrained in a covariant position |
252 String code = r''' | 252 String code = r''' |
253 typedef To Func1<From, To>(From x); | 253 typedef To Func1<From, To>(From x); |
254 Func1<String, T> f<T>(T x) => null; | 254 Func1<String, T> f<T>(T x) => null; |
255 Func1<String, num> test() => f(42); | 255 Func1<String, num> test() => f(42); |
256 '''; | 256 '''; |
257 Source source = addSource(code); | 257 Source source = addSource(code); |
258 TestAnalysisResult analysisResult = await computeAnalysisResult(source); | 258 TestAnalysisResult analysisResult = await computeAnalysisResult(source); |
259 assertNoErrors(source); | 259 assertNoErrors(source); |
260 verify([source]); | 260 verify([source]); |
261 CompilationUnit unit = analysisResult.unit; | 261 CompilationUnit unit = analysisResult.unit; |
262 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test"); | 262 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test"); |
263 ExpressionFunctionBody body = test.functionExpression.body; | 263 ExpressionFunctionBody body = test.functionExpression.body; |
264 MethodInvocation invoke = body.expression; | 264 MethodInvocation invoke = body.expression; |
265 _isFunction2Of(_isNum, _isFunction2Of(_isString, _isNum))( | 265 _isFunction2Of(_isNum, _isFunction2Of(_isString, _isNum))( |
266 invoke.staticInvokeType); | 266 invoke.staticInvokeType); |
267 } | 267 } |
268 | 268 |
269 fail_returnType_variance6() async { | 269 test_returnType_variance6() async { |
270 // Check that pinning works correctly with a partial type | 270 // Check that pinning works correctly with a partial type |
271 // when the return type uses the variable in a covariant position | 271 // when the return type uses the variable in a covariant position |
272 String code = r''' | 272 String code = r''' |
273 typedef To Func1<From, To>(From x); | 273 typedef To Func1<From, To>(From x); |
274 Func1<String, T> f<T>(T x) => null; | 274 Func1<String, T> f<T>(T x) => null; |
275 T g<T, S>(Func1<S, T> f) => null; | 275 T g<T, S>(Func1<S, T> f) => null; |
276 num test() => g(f(3)); | 276 num test() => g(f(3)); |
277 '''; | 277 '''; |
278 Source source = addSource(code); | 278 Source source = addSource(code); |
279 TestAnalysisResult analysisResult = await computeAnalysisResult(source); | 279 TestAnalysisResult analysisResult = await computeAnalysisResult(source); |
280 assertNoErrors(source); | 280 assertNoErrors(source); |
281 verify([source]); | 281 verify([source]); |
282 CompilationUnit unit = analysisResult.unit; | 282 CompilationUnit unit = analysisResult.unit; |
283 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test"); | 283 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test"); |
284 ExpressionFunctionBody body = test.functionExpression.body; | 284 ExpressionFunctionBody body = test.functionExpression.body; |
285 MethodInvocation call = body.expression; | 285 MethodInvocation call = body.expression; |
286 _isNum(call.staticType); | 286 _isNum(call.staticType); |
287 _isFunction2Of(_isFunction2Of(_isString, _isNum), _isNum)( | 287 _isFunction2Of(_isFunction2Of(_isString, _isNum), _isNum)( |
288 call.staticInvokeType); | 288 call.staticInvokeType); |
289 } | 289 } |
290 | 290 |
291 @override | |
292 void setUp() { | |
293 super.setUp(); | |
294 AnalysisOptionsImpl options = new AnalysisOptionsImpl(); | |
295 options.strongMode = true; | |
296 resetWith(options: options); | |
297 } | |
298 | |
299 test_async_method_propagation() async { | 291 test_async_method_propagation() async { |
300 String code = r''' | 292 String code = r''' |
301 import "dart:async"; | 293 import "dart:async"; |
302 class A { | 294 class A { |
303 Future f0() => new Future.value(3); | 295 Future f0() => new Future.value(3); |
304 Future f1() async => new Future.value(3); | 296 Future f1() async => new Future.value(3); |
305 Future f2() async => await new Future.value(3); | 297 Future f2() async => await new Future.value(3); |
306 | 298 |
307 Future<int> f3() => new Future.value(3); | 299 Future<int> f3() => new Future.value(3); |
308 Future<int> f4() async => new Future.value(3); | 300 Future<int> f4() async => new Future.value(3); |
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
512 AstFinder.getStatementsInTopLevelFunction(unit, "test"); | 504 AstFinder.getStatementsInTopLevelFunction(unit, "test"); |
513 VariableDeclarationStatement stmt = statements[0]; | 505 VariableDeclarationStatement stmt = statements[0]; |
514 VariableDeclaration decl = stmt.variables.variables[0]; | 506 VariableDeclaration decl = stmt.variables.variables[0]; |
515 Expression call = decl.initializer; | 507 Expression call = decl.initializer; |
516 _isInt(call.staticType); | 508 _isInt(call.staticType); |
517 } | 509 } |
518 | 510 |
519 test_constrainedByBounds2() async { | 511 test_constrainedByBounds2() async { |
520 // Test that upwards inference with two type variables does | 512 // Test that upwards inference with two type variables does |
521 // not propogate from the constrained variable to the unconstrained | 513 // not propogate from the constrained variable to the unconstrained |
522 // variable if they are ordered right to left. | 514 // variable if they are ordered right to left. |
Leaf
2017/03/14 22:37:40
Looks like your code now handles right to left? U
Jennifer Messerly
2017/03/14 23:49:09
Done.
| |
523 String code = r''' | 515 String code = r''' |
524 T f<T extends S, S>(S x) => null; | 516 T f<T extends S, S>(S x) => null; |
525 void test() { var x = f(3); } | 517 void test() { var x = f(3); } |
526 '''; | 518 '''; |
527 Source source = addSource(code); | 519 Source source = addSource(code); |
528 TestAnalysisResult analysisResult = await computeAnalysisResult(source); | 520 TestAnalysisResult analysisResult = await computeAnalysisResult(source); |
529 assertNoErrors(source); | 521 assertNoErrors(source); |
530 verify([source]); | 522 verify([source]); |
531 CompilationUnit unit = analysisResult.unit; | 523 CompilationUnit unit = analysisResult.unit; |
532 List<Statement> statements = | 524 List<Statement> statements = |
533 AstFinder.getStatementsInTopLevelFunction(unit, "test"); | 525 AstFinder.getStatementsInTopLevelFunction(unit, "test"); |
534 VariableDeclarationStatement stmt = statements[0]; | 526 VariableDeclarationStatement stmt = statements[0]; |
535 VariableDeclaration decl = stmt.variables.variables[0]; | 527 VariableDeclaration decl = stmt.variables.variables[0]; |
536 Expression call = decl.initializer; | 528 Expression call = decl.initializer; |
537 _isDynamic(call.staticType); | 529 _isInt(call.staticType); |
538 } | 530 } |
539 | 531 |
540 test_constrainedByBounds4() async { | 532 test_constrainedByBounds4() async { |
541 // Test that upwards inference with two type variables correctly | 533 // Test that upwards inference with two type variables correctly |
542 // propogates from the constrained variable to the unconstrained | 534 // propogates from the constrained variable to the unconstrained |
543 // variable if they are ordered left to right, when the variable | 535 // variable if they are ordered left to right, when the variable |
544 // appears co and contra variantly | 536 // appears co and contra variantly |
545 String code = r''' | 537 String code = r''' |
546 typedef To Func1<From, To>(From x); | 538 typedef To Func1<From, To>(From x); |
547 T f<S, T extends Func1<S, S>>(S x) => null; | 539 T f<S, T extends Func1<S, S>>(S x) => null; |
(...skipping 509 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1057 _isFutureOf([_isNum])(invoke.argumentList.arguments[0].staticType); | 1049 _isFutureOf([_isNum])(invoke.argumentList.arguments[0].staticType); |
1058 } | 1050 } |
1059 | 1051 |
1060 test_futureOr_downwards6() async { | 1052 test_futureOr_downwards6() async { |
1061 // Test that downwards inference doesn't decompose FutureOr | 1053 // Test that downwards inference doesn't decompose FutureOr |
1062 // when instantiating type variables. | 1054 // when instantiating type variables. |
1063 MethodInvocation invoke = await _testFutureOr(r''' | 1055 MethodInvocation invoke = await _testFutureOr(r''' |
1064 T mk<T>(T x) => null; | 1056 T mk<T>(T x) => null; |
1065 FutureOr<int> test() => mk(new Future.value(42)); | 1057 FutureOr<int> test() => mk(new Future.value(42)); |
1066 '''); | 1058 '''); |
1067 _isFutureOfInt(invoke.staticType); | 1059 _isFutureOrOfInt(invoke.staticType); |
1068 _isFutureOfInt(invoke.argumentList.arguments[0].staticType); | 1060 _isFutureOfInt(invoke.argumentList.arguments[0].staticType); |
1069 } | 1061 } |
1070 | 1062 |
1071 test_futureOr_downwards9() async { | 1063 test_futureOr_downwards9() async { |
1072 // Test that downwards inference decomposes correctly with | 1064 // Test that downwards inference decomposes correctly with |
1073 // other composite types | 1065 // other composite types |
1074 MethodInvocation invoke = await _testFutureOr(r''' | 1066 MethodInvocation invoke = await _testFutureOr(r''' |
1075 List<T> mk<T>(T x) => null; | 1067 List<T> mk<T>(T x) => null; |
1076 FutureOr<List<int>> test() => mk(3); | 1068 FutureOr<List<int>> test() => mk(3); |
1077 '''); | 1069 '''); |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1118 } | 1110 } |
1119 | 1111 |
1120 test_futureOr_no_return() async { | 1112 test_futureOr_no_return() async { |
1121 MethodInvocation invoke = await _testFutureOr(r''' | 1113 MethodInvocation invoke = await _testFutureOr(r''' |
1122 FutureOr<T> mk<T>(Future<T> x) => x; | 1114 FutureOr<T> mk<T>(Future<T> x) => x; |
1123 Future<int> f; | 1115 Future<int> f; |
1124 test() => f.then((int x) {}); | 1116 test() => f.then((int x) {}); |
1125 '''); | 1117 '''); |
1126 _isFunction2Of(_isInt, _isNull)( | 1118 _isFunction2Of(_isInt, _isNull)( |
1127 invoke.argumentList.arguments[0].staticType); | 1119 invoke.argumentList.arguments[0].staticType); |
1128 _isFutureOfDynamic(invoke.staticType); | 1120 _isFutureOfNull(invoke.staticType); |
1129 } | 1121 } |
1130 | 1122 |
1131 test_futureOr_no_return_value() async { | 1123 test_futureOr_no_return_value() async { |
1132 MethodInvocation invoke = await _testFutureOr(r''' | 1124 MethodInvocation invoke = await _testFutureOr(r''' |
1133 FutureOr<T> mk<T>(Future<T> x) => x; | 1125 FutureOr<T> mk<T>(Future<T> x) => x; |
1134 Future<int> f; | 1126 Future<int> f; |
1135 test() => f.then((int x) {return;}); | 1127 test() => f.then((int x) {return;}); |
1136 '''); | 1128 '''); |
1137 _isFunction2Of(_isInt, _isNull)( | 1129 _isFunction2Of(_isInt, _isNull)( |
1138 invoke.argumentList.arguments[0].staticType); | 1130 invoke.argumentList.arguments[0].staticType); |
1139 _isFutureOfDynamic(invoke.staticType); | 1131 _isFutureOfNull(invoke.staticType); |
1140 } | 1132 } |
1141 | 1133 |
1142 test_futureOr_return_null() async { | 1134 test_futureOr_return_null() async { |
1143 MethodInvocation invoke = await _testFutureOr(r''' | 1135 MethodInvocation invoke = await _testFutureOr(r''' |
1144 FutureOr<T> mk<T>(Future<T> x) => x; | 1136 FutureOr<T> mk<T>(Future<T> x) => x; |
1145 Future<int> f; | 1137 Future<int> f; |
1146 test() => f.then((int x) {}); | 1138 test() => f.then((int x) {}); |
1147 '''); | 1139 '''); |
1148 _isFunction2Of(_isInt, _isNull)( | 1140 _isFunction2Of(_isInt, _isNull)( |
1149 invoke.argumentList.arguments[0].staticType); | 1141 invoke.argumentList.arguments[0].staticType); |
1150 _isFutureOfDynamic(invoke.staticType); | 1142 _isFutureOfNull(invoke.staticType); |
1151 } | 1143 } |
1152 | 1144 |
1153 test_futureOr_upwards1() async { | 1145 test_futureOr_upwards1() async { |
1154 // Test that upwards inference correctly prefers to instantiate type | 1146 // Test that upwards inference correctly prefers to instantiate type |
1155 // variables with the "smaller" solution when both are possible. | 1147 // variables with the "smaller" solution when both are possible. |
1156 MethodInvocation invoke = await _testFutureOr(r''' | 1148 MethodInvocation invoke = await _testFutureOr(r''' |
1157 Future<T> mk<T>(FutureOr<T> x) => null; | 1149 Future<T> mk<T>(FutureOr<T> x) => null; |
1158 dynamic test() => mk(new Future<int>.value(42)); | 1150 dynamic test() => mk(new Future<int>.value(42)); |
1159 '''); | 1151 '''); |
1160 _isFutureOfInt(invoke.staticType); | 1152 _isFutureOfInt(invoke.staticType); |
1161 } | 1153 } |
1162 | 1154 |
1163 test_futureOr_upwards2() async { | 1155 test_futureOr_upwards2() async { |
1164 // Test that upwards inference fails when the solution doesn't | 1156 // Test that upwards inference fails when the solution doesn't |
1165 // match the bound. | 1157 // match the bound. |
1166 MethodInvocation invoke = await _testFutureOr( | 1158 MethodInvocation invoke = await _testFutureOr( |
1167 r''' | 1159 r''' |
1168 Future<T> mk<T extends Future<Object>>(FutureOr<T> x) => null; | 1160 Future<T> mk<T extends Future<Object>>(FutureOr<T> x) => null; |
1169 dynamic test() => mk(new Future<int>.value(42)); | 1161 dynamic test() => mk(new Future<int>.value(42)); |
1170 ''', | 1162 ''', |
1171 errors: [StrongModeCode.COULD_NOT_INFER]); | 1163 errors: [StrongModeCode.COULD_NOT_INFER]); |
1172 _isFutureOf([_isObject])(invoke.staticType); | 1164 _isFutureOfInt(invoke.staticType); |
1173 } | 1165 } |
1174 | 1166 |
1175 test_futureOrNull_no_return() async { | 1167 test_futureOrNull_no_return() async { |
1176 MethodInvocation invoke = await _testFutureOr(r''' | 1168 MethodInvocation invoke = await _testFutureOr(r''' |
1177 FutureOr<T> mk<T>(Future<T> x) => x; | 1169 FutureOr<T> mk<T>(Future<T> x) => x; |
1178 Future<int> f; | 1170 Future<int> f; |
1179 test() => f.then<Null>((int x) {}); | 1171 test() => f.then<Null>((int x) {}); |
1180 '''); | 1172 '''); |
1181 _isFunction2Of(_isInt, _isNull)( | 1173 _isFunction2Of(_isInt, _isNull)( |
1182 invoke.argumentList.arguments[0].staticType); | 1174 invoke.argumentList.arguments[0].staticType); |
(...skipping 705 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1888 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test"); | 1880 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test"); |
1889 ExpressionFunctionBody body = test.functionExpression.body; | 1881 ExpressionFunctionBody body = test.functionExpression.body; |
1890 FunctionType functionType = body.expression.staticType; | 1882 FunctionType functionType = body.expression.staticType; |
1891 DartType type = functionType.normalParameterTypes[0]; | 1883 DartType type = functionType.normalParameterTypes[0]; |
1892 | 1884 |
1893 Element elementA = AstFinder.getClass(unit, "A").element; | 1885 Element elementA = AstFinder.getClass(unit, "A").element; |
1894 | 1886 |
1895 _isInstantiationOf(_hasElement(elementA))([_isNum, _isNum])(type); | 1887 _isInstantiationOf(_hasElement(elementA))([_isNum, _isNum])(type); |
1896 } | 1888 } |
1897 | 1889 |
1890 test_inferConstructor_unknownTypeLowerBound() async { | |
1891 Source source = addSource(r''' | |
1892 class C<T> { | |
1893 C(void callback(List<T> a)); | |
1894 } | |
1895 test() { | |
1896 // downwards inference pushes List<?> and in parameter position this | |
1897 // becomes inferred as List<Null>. | |
1898 var c = new C((items) {}); | |
1899 } | |
1900 '''); | |
1901 CompilationUnit unit = (await computeAnalysisResult(source)).unit; | |
1902 assertNoErrors(source); | |
1903 verify([source]); | |
1904 DartType cType = AstFinder | |
1905 .getTopLevelFunction(unit, "test") | |
1906 .element | |
1907 .localVariables[0] | |
1908 .type; | |
1909 Element elementC = AstFinder.getClass(unit, "C").element; | |
1910 | |
1911 _isInstantiationOf(_hasElement(elementC))([_isNull])(cType); | |
1912 } | |
1913 | |
1914 test_inferConstructor_varianceForCallback2() async { | |
1915 Source source = addSource(r''' | |
1916 class C<T> { | |
1917 C(void callback(List<T> a)); | |
1918 } | |
1919 test() { | |
1920 var c = new C((List items) {}); | |
1921 } | |
1922 '''); | |
1923 CompilationUnit unit = (await computeAnalysisResult(source)).unit; | |
1924 assertNoErrors(source); | |
1925 verify([source]); | |
1926 DartType cType = AstFinder | |
1927 .getTopLevelFunction(unit, "test") | |
1928 .element | |
1929 .localVariables[0] | |
1930 .type; | |
1931 Element elementC = AstFinder.getClass(unit, "C").element; | |
1932 | |
1933 _isInstantiationOf(_hasElement(elementC))([_isDynamic])(cType); | |
1934 } | |
1935 | |
1936 | |
1898 test_redirectingConstructor_propagation() async { | 1937 test_redirectingConstructor_propagation() async { |
1899 String code = r''' | 1938 String code = r''' |
1900 class A { | 1939 class A { |
1901 A() : this.named([]); | 1940 A() : this.named([]); |
1902 A.named(List<String> x); | 1941 A.named(List<String> x); |
1903 } | 1942 } |
1904 '''; | 1943 '''; |
1905 CompilationUnit unit = await resolveSource(code); | 1944 CompilationUnit unit = await resolveSource(code); |
1906 | 1945 |
1907 ConstructorDeclaration constructor = | 1946 ConstructorDeclaration constructor = |
(...skipping 17 matching lines...) Expand all Loading... | |
1925 verify([source]); | 1964 verify([source]); |
1926 CompilationUnit unit = analysisResult.unit; | 1965 CompilationUnit unit = analysisResult.unit; |
1927 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test"); | 1966 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test"); |
1928 ExpressionFunctionBody body = test.functionExpression.body; | 1967 ExpressionFunctionBody body = test.functionExpression.body; |
1929 MethodInvocation invoke = body.expression; | 1968 MethodInvocation invoke = body.expression; |
1930 _isFunction2Of(_isNum, _isFunction2Of(_isNum, _isString))( | 1969 _isFunction2Of(_isNum, _isFunction2Of(_isNum, _isString))( |
1931 invoke.staticInvokeType); | 1970 invoke.staticInvokeType); |
1932 } | 1971 } |
1933 | 1972 |
1934 test_returnType_variance3() async { | 1973 test_returnType_variance3() async { |
1935 // Check that the variance heuristic chooses the less precise type | 1974 // Check that the variance heuristic chooses the most precise type |
1936 // when the return type uses the variable in a contravariant position | 1975 // when the return type uses the variable in a contravariant position |
1937 // and there is no downwards constraint. | 1976 // and there is no downwards constraint. |
1938 String code = r''' | 1977 String code = r''' |
1939 typedef To Func1<From, To>(From x); | 1978 typedef To Func1<From, To>(From x); |
1940 Func1<T, String> f<T>(T x, g(T x)) => null; | 1979 Func1<T, String> f<T>(T x, g(T x)) => null; |
1941 dynamic test() => f(42, (num x) => x); | 1980 dynamic test() => f(42, (num x) => x); |
1942 '''; | 1981 '''; |
1943 Source source = addSource(code); | 1982 Source source = addSource(code); |
1944 TestAnalysisResult analysisResult = await computeAnalysisResult(source); | 1983 TestAnalysisResult analysisResult = await computeAnalysisResult(source); |
1945 assertNoErrors(source); | 1984 assertNoErrors(source); |
1946 verify([source]); | 1985 verify([source]); |
1947 CompilationUnit unit = analysisResult.unit; | 1986 CompilationUnit unit = analysisResult.unit; |
1948 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test"); | 1987 FunctionDeclaration test = AstFinder.getTopLevelFunction(unit, "test"); |
1949 ExpressionFunctionBody body = test.functionExpression.body; | 1988 ExpressionFunctionBody body = test.functionExpression.body; |
1950 FunctionType functionType = body.expression.staticType; | 1989 FunctionType functionType = body.expression.staticType; |
1951 DartType type = functionType.normalParameterTypes[0]; | 1990 DartType type = functionType.normalParameterTypes[0]; |
1952 _isNum(type); | 1991 _isInt(type); |
1953 } | 1992 } |
1954 | 1993 |
1955 test_returnType_variance4() async { | 1994 test_returnType_variance4() async { |
1956 // Check that the variance heuristic chooses the more precise type | 1995 // Check that the variance heuristic chooses the more precise type |
1957 // when the return type uses the variable in a covariant position | 1996 // when the return type uses the variable in a covariant position |
1958 // and there is no downwards constraint | 1997 // and there is no downwards constraint |
1959 String code = r''' | 1998 String code = r''' |
1960 typedef To Func1<From, To>(From x); | 1999 typedef To Func1<From, To>(From x); |
1961 Func1<String, T> f<T>(T x, g(T x)) => null; | 2000 Func1<String, T> f<T>(T x, g(T x)) => null; |
1962 dynamic test() => f(42, (num x) => x); | 2001 dynamic test() => f(42, (num x) => x); |
(...skipping 331 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
2294 Expression exp = (statements[i] as ExpressionStatement).expression; | 2333 Expression exp = (statements[i] as ExpressionStatement).expression; |
2295 expect(exp.staticType, typeProvider.dynamicType); | 2334 expect(exp.staticType, typeProvider.dynamicType); |
2296 } | 2335 } |
2297 } | 2336 } |
2298 | 2337 |
2299 checkBody("C"); | 2338 checkBody("C"); |
2300 checkBody("D"); | 2339 checkBody("D"); |
2301 } | 2340 } |
2302 | 2341 |
2303 test_genericFunction_upwardsAndDownwards() async { | 2342 test_genericFunction_upwardsAndDownwards() async { |
2304 // Regression tests for https://github.com/dart-lang/sdk/issues/27151. | 2343 // Regression tests for https://github.com/dart-lang/sdk/issues/27586. |
2305 await resolveTestUnit(r'List<num> x = [1, 2];'); | 2344 await resolveTestUnit(r'List<num> x = [1, 2];'); |
2306 expectInitializerType('x', 'List<int>'); | 2345 expectInitializerType('x', 'List<num>'); |
2346 } | |
2347 | |
2348 test_genericFunction_upwardsAndDownwards_Object() async { | |
2349 // Regression tests for https://github.com/dart-lang/sdk/issues/27625. | |
2350 await resolveTestUnit(r''' | |
2351 List<Object> aaa = []; | |
2352 List<Object> bbb = [1, 2, 3]; | |
2353 List<Object> ccc = [null]; | |
2354 List<Object> ddd = [1 as dynamic]; | |
2355 List<Object> eee = [new Object()]; | |
2356 '''); | |
2357 expectInitializerType('aaa', 'List<Object>'); | |
2358 expectInitializerType('bbb', 'List<Object>'); | |
2359 expectInitializerType('ccc', 'List<Object>'); | |
2360 expectInitializerType('ddd', 'List<Object>'); | |
2361 expectInitializerType('eee', 'List<Object>'); | |
2307 } | 2362 } |
2308 | 2363 |
2309 test_genericMethod() async { | 2364 test_genericMethod() async { |
2310 await resolveTestUnit(r''' | 2365 await resolveTestUnit(r''' |
2311 class C<E> { | 2366 class C<E> { |
2312 List/*<T>*/ f/*<T>*/(E e) => null; | 2367 List/*<T>*/ f/*<T>*/(E e) => null; |
2313 } | 2368 } |
2314 main() { | 2369 main() { |
2315 C<String> cOfString; | 2370 C<String> cOfString; |
2316 } | 2371 } |
(...skipping 687 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3004 class C<T> { | 3059 class C<T> { |
3005 void m<S0 extends T, S1 extends List<S0>>(S0 p0, S1 p1) {} | 3060 void m<S0 extends T, S1 extends List<S0>>(S0 p0, S1 p1) {} |
3006 | 3061 |
3007 void main() { | 3062 void main() { |
3008 m(null, null); | 3063 m(null, null); |
3009 } | 3064 } |
3010 } | 3065 } |
3011 '''; | 3066 '''; |
3012 await resolveTestUnit(code); | 3067 await resolveTestUnit(code); |
3013 assertNoErrors(testSource); | 3068 assertNoErrors(testSource); |
3014 expectStaticInvokeType('m(null', '(T, List<T>) → void'); | 3069 expectStaticInvokeType('m(null', '(Null, Null) → void'); |
3070 } | |
3071 | |
3072 test_instantiateToBounds_method_ok_referenceOther_before2() async { | |
3073 String code = r''' | |
3074 class C<T> { | |
3075 Map<S0, S1> m<S0 extends T, S1 extends List<S0>>() => null; | |
3076 | |
3077 void main() { | |
3078 m(); | |
3079 } | |
3080 } | |
3081 '''; | |
3082 await resolveTestUnit(code); | |
3083 assertNoErrors(testSource); | |
3084 expectStaticInvokeType('m();', '() → Map<T, List<T>>'); | |
3015 } | 3085 } |
3016 | 3086 |
3017 test_instantiateToBounds_method_ok_simpleBounds() async { | 3087 test_instantiateToBounds_method_ok_simpleBounds() async { |
3018 String code = r''' | 3088 String code = r''' |
3019 class C<T> { | 3089 class C<T> { |
3020 void m<S extends T>(S p0) {} | 3090 void m<S extends T>(S p0) {} |
3021 | 3091 |
3022 void main() { | 3092 void main() { |
3023 m(null); | 3093 m(null); |
3024 } | 3094 } |
3025 } | 3095 } |
3026 '''; | 3096 '''; |
3027 await resolveTestUnit(code); | 3097 await resolveTestUnit(code); |
3028 assertNoErrors(testSource); | 3098 assertNoErrors(testSource); |
3029 expectStaticInvokeType('m(null)', '(T) → void'); | 3099 expectStaticInvokeType('m(null)', '(Null) → void'); |
3100 } | |
3101 | |
3102 test_instantiateToBounds_method_ok_simpleBounds2() async { | |
3103 String code = r''' | |
3104 class C<T> { | |
3105 S m<S extends T>() => null; | |
3106 | |
3107 void main() { | |
3108 m(); | |
3109 } | |
3110 } | |
3111 '''; | |
3112 await resolveTestUnit(code); | |
3113 assertNoErrors(testSource); | |
3114 expectStaticInvokeType('m();', '() → T'); | |
3030 } | 3115 } |
3031 | 3116 |
3032 test_notInstantiatedBound_direct_class_class() async { | 3117 test_notInstantiatedBound_direct_class_class() async { |
3033 String code = r''' | 3118 String code = r''' |
3034 class A<T extends int> {} | 3119 class A<T extends int> {} |
3035 class C<T extends A> {} | 3120 class C<T extends A> {} |
3036 '''; | 3121 '''; |
3037 await resolveTestUnit(code, noErrors: false); | 3122 await resolveTestUnit(code, noErrors: false); |
3038 assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]); | 3123 assertErrors(testSource, [StrongModeCode.NOT_INSTANTIATED_BOUND]); |
3039 } | 3124 } |
(...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
3555 var v = x; | 3640 var v = x; |
3556 v; // marker | 3641 v; // marker |
3557 } | 3642 } |
3558 int x = 3; | 3643 int x = 3; |
3559 '''; | 3644 '''; |
3560 CompilationUnit unit = await resolveSource(code); | 3645 CompilationUnit unit = await resolveSource(code); |
3561 assertPropagatedAssignedType(code, unit, typeProvider.intType, null); | 3646 assertPropagatedAssignedType(code, unit, typeProvider.intType, null); |
3562 assertTypeOfMarkedExpression(code, unit, typeProvider.intType, null); | 3647 assertTypeOfMarkedExpression(code, unit, typeProvider.intType, null); |
3563 } | 3648 } |
3564 } | 3649 } |
OLD | NEW |