OLD | NEW |
---|---|
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_test; | 5 library engine.resolver_test; |
6 | 6 |
7 import 'dart:collection'; | 7 import 'dart:collection'; |
8 | 8 |
9 import 'package:analyzer/src/context/context.dart' as newContext; | 9 import 'package:analyzer/src/context/context.dart' as newContext; |
10 import 'package:analyzer/src/generated/ast.dart'; | 10 import 'package:analyzer/src/generated/ast.dart'; |
(...skipping 236 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
247 .substitute4(streamElement.type.typeArguments); | 247 .substitute4(streamElement.type.typeArguments); |
248 List<DartType> parameterTypes = <DartType>[ | 248 List<DartType> parameterTypes = <DartType>[ |
249 ElementFactory | 249 ElementFactory |
250 .functionElement3('onData', VoidTypeImpl.instance.element, | 250 .functionElement3('onData', VoidTypeImpl.instance.element, |
251 <TypeDefiningElement>[streamElement.typeParameters[0]], null) | 251 <TypeDefiningElement>[streamElement.typeParameters[0]], null) |
252 .type, | 252 .type, |
253 ]; | 253 ]; |
254 // TODO(brianwilkerson) This is missing the optional parameters. | 254 // TODO(brianwilkerson) This is missing the optional parameters. |
255 MethodElementImpl listenMethod = | 255 MethodElementImpl listenMethod = |
256 ElementFactory.methodElement('listen', returnType, parameterTypes); | 256 ElementFactory.methodElement('listen', returnType, parameterTypes); |
257 (listenMethod.type as FunctionTypeImpl).typeArguments = | |
Jennifer Messerly
2015/10/29 16:36:41
The mock SDK's element model wasn't fully populate
| |
258 streamElement.type.typeArguments; | |
259 (parameterTypes[0] as FunctionTypeImpl).typeArguments = | |
260 streamElement.type.typeArguments; | |
261 (parameterTypes[0].element as FunctionElementImpl) | |
262 .enclosingElement = listenMethod; | |
257 streamElement.methods = <MethodElement>[listenMethod]; | 263 streamElement.methods = <MethodElement>[listenMethod]; |
258 | 264 |
259 asyncUnit.types = <ClassElement>[ | 265 asyncUnit.types = <ClassElement>[ |
260 completerElement, | 266 completerElement, |
261 futureElement, | 267 futureElement, |
262 streamElement | 268 streamElement |
263 ]; | 269 ]; |
264 LibraryElementImpl asyncLibrary = new LibraryElementImpl.forNode( | 270 LibraryElementImpl asyncLibrary = new LibraryElementImpl.forNode( |
265 coreContext, AstFactory.libraryIdentifier2(["dart", "async"])); | 271 coreContext, AstFactory.libraryIdentifier2(["dart", "async"])); |
266 asyncLibrary.definingCompilationUnit = asyncUnit; | 272 asyncLibrary.definingCompilationUnit = asyncUnit; |
(...skipping 12838 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
13105 expect(identifier.propagatedType, same(stringType)); | 13111 expect(identifier.propagatedType, same(stringType)); |
13106 } | 13112 } |
13107 // in the loop body | 13113 // in the loop body |
13108 { | 13114 { |
13109 SimpleIdentifier identifier = EngineTestCase.findNode( | 13115 SimpleIdentifier identifier = EngineTestCase.findNode( |
13110 unit, code, "e;", (node) => node is SimpleIdentifier); | 13116 unit, code, "e;", (node) => node is SimpleIdentifier); |
13111 expect(identifier.propagatedType, same(stringType)); | 13117 expect(identifier.propagatedType, same(stringType)); |
13112 } | 13118 } |
13113 } | 13119 } |
13114 | 13120 |
13121 void test_forEach_async_inheritedStream() { | |
13122 // From https://github.com/dart-lang/sdk/issues/24191, this ensures that | |
13123 // `await for` works for types where the generic parameter doesn't | |
13124 // correspond to the type of the Stream's data. | |
13125 String code = r''' | |
13126 import 'dart:async'; | |
13127 abstract class MyCustomStream<T> implements Stream<List<T>> {} | |
Jennifer Messerly
2015/10/29 16:36:41
thanks to Paul for this test case :)
| |
13128 f(MyCustomStream<String> stream) async { | |
13129 await for (var e in stream) { | |
13130 e; | |
13131 } | |
13132 }'''; | |
13133 Source source = addSource(code); | |
13134 LibraryElement library = resolve2(source); | |
13135 assertNoErrors(source); | |
13136 verify([source]); | |
13137 CompilationUnit unit = resolveCompilationUnit(source, library); | |
13138 InterfaceType listOfStringType = | |
13139 typeProvider.listType.substitute4([typeProvider.stringType]); | |
13140 // in the declaration | |
13141 { | |
13142 SimpleIdentifier identifier = EngineTestCase.findNode( | |
13143 unit, code, "e in", (node) => node is SimpleIdentifier); | |
13144 expect(identifier.propagatedType, equals(listOfStringType)); | |
13145 } | |
13146 // in the loop body | |
13147 { | |
13148 SimpleIdentifier identifier = EngineTestCase.findNode( | |
13149 unit, code, "e;", (node) => node is SimpleIdentifier); | |
13150 expect(identifier.propagatedType, equals(listOfStringType)); | |
13151 } | |
13152 } | |
13153 | |
13115 void test_functionExpression_asInvocationArgument() { | 13154 void test_functionExpression_asInvocationArgument() { |
13116 String code = r''' | 13155 String code = r''' |
13117 class MyMap<K, V> { | 13156 class MyMap<K, V> { |
13118 forEach(f(K key, V value)) {} | 13157 forEach(f(K key, V value)) {} |
13119 } | 13158 } |
13120 f(MyMap<int, String> m) { | 13159 f(MyMap<int, String> m) { |
13121 m.forEach((k, v) { | 13160 m.forEach((k, v) { |
13122 k; | 13161 k; |
13123 v; | 13162 v; |
13124 }); | 13163 }); |
(...skipping 1904 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
15029 | 15068 |
15030 void _resolveTestUnit(String code) { | 15069 void _resolveTestUnit(String code) { |
15031 testCode = code; | 15070 testCode = code; |
15032 testSource = addSource(testCode); | 15071 testSource = addSource(testCode); |
15033 LibraryElement library = resolve2(testSource); | 15072 LibraryElement library = resolve2(testSource); |
15034 assertNoErrors(testSource); | 15073 assertNoErrors(testSource); |
15035 verify([testSource]); | 15074 verify([testSource]); |
15036 testUnit = resolveCompilationUnit(testSource, library); | 15075 testUnit = resolveCompilationUnit(testSource, library); |
15037 } | 15076 } |
15038 } | 15077 } |
OLD | NEW |