Skip to content

Commit d548c07

Browse files
osa1Commit Queue
authored and
Commit Queue
committed
[dart2wasm] Fix async* stream types when fn return type is not Stream
Fixes #53234. Change-Id: I97aec5d61bf442ecdaeb2ea2dc61d499ab167dd2 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/340862 Reviewed-by: Martin Kustermann <[email protected]> Commit-Queue: Ömer Ağacan <[email protected]>
1 parent 0334fea commit d548c07

File tree

1 file changed

+14
-9
lines changed

1 file changed

+14
-9
lines changed

pkg/dart2wasm/lib/transformers.dart

+14-9
Original file line numberDiff line numberDiff line change
@@ -601,23 +601,28 @@ class _WasmTransformer extends Transformer {
601601
callAsyncMap, Name('where'), Arguments([whereFilter]),
602602
interfaceTarget: whereProc, functionType: whereProcType);
603603

604-
// Finally call cast
605-
DartType typeArgument;
606-
if (functionNode.returnType is InterfaceType) {
607-
typeArgument =
608-
(functionNode.returnType as InterfaceType).typeArguments.single;
604+
// Finally call cast.
605+
606+
// Stream element type is defined in language spec section 9. If the return
607+
// type is `Stream<U>` then the element type is `U`. Otherwise it needs to
608+
// be a supertype of `Object` and the element type is `dynamic`.
609+
final DartType streamTypeArgument;
610+
final DartType functionReturnType = functionNode.returnType;
611+
if (functionReturnType is InterfaceType &&
612+
functionReturnType.classNode == coreTypes.streamClass) {
613+
streamTypeArgument = functionReturnType.typeArguments.single;
609614
} else {
610-
typeArgument = const DynamicType();
615+
streamTypeArgument = const DynamicType();
611616
}
612617
Procedure castProc =
613618
coreTypes.index.getProcedure('dart:async', 'Stream', 'cast');
614-
final returnStreamType = InterfaceType(
615-
coreTypes.streamClass, typeArgument.nullability, [typeArgument]);
619+
final returnStreamType = InterfaceType(coreTypes.streamClass,
620+
streamTypeArgument.nullability, [streamTypeArgument]);
616621
final castProcType = FunctionType(
617622
[], returnStreamType, Nullability.nonNullable,
618623
requiredParameterCount: 1);
619624
final castToExpectedType = InstanceInvocation(InstanceAccessKind.Instance,
620-
callWhere, Name('cast'), Arguments([], types: [typeArgument]),
625+
callWhere, Name('cast'), Arguments([], types: [streamTypeArgument]),
621626
interfaceTarget: castProc, functionType: castProcType);
622627
return FunctionNode(
623628
Block([

0 commit comments

Comments
 (0)