| 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 = |
| 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>> {} |
| 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 |