diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart index bf940295d7f..c85374e7a59 100644 --- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart +++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart @@ -12365,6 +12365,14 @@ const MessageCode messageVoidWithTypeArguments = const MessageCode( problemMessage: r"""Type 'void' can't have type arguments.""", correctionMessage: r"""Try removing the type arguments."""); +// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE. +const Code codeWasmSyncStar = messageWasmSyncStar; + +// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE. +const MessageCode messageWasmSyncStar = const MessageCode("WasmSyncStar", + severity: Severity.warning, + problemMessage: r"""Compilation to Wasm does not support 'sync*'."""); + // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE. const Code codeWeakWithStrongDillLibrary = messageWeakWithStrongDillLibrary; diff --git a/pkg/dart2wasm/lib/target.dart b/pkg/dart2wasm/lib/target.dart index 30568f4394b..8adaf30122f 100644 --- a/pkg/dart2wasm/lib/target.dart +++ b/pkg/dart2wasm/lib/target.dart @@ -174,7 +174,8 @@ class WasmTarget extends Target { logger?.call("Transformed ffi annotations"); } - wasmTrans.transformLibraries(libraries, coreTypes, hierarchy); + wasmTrans.transformLibraries( + libraries, coreTypes, hierarchy, diagnosticReporter); } @override diff --git a/pkg/dart2wasm/lib/transformers.dart b/pkg/dart2wasm/lib/transformers.dart index b73df7f2d12..6f11b1c17fd 100644 --- a/pkg/dart2wasm/lib/transformers.dart +++ b/pkg/dart2wasm/lib/transformers.dart @@ -5,23 +5,28 @@ import 'package:kernel/ast.dart'; import 'package:kernel/class_hierarchy.dart'; import 'package:kernel/core_types.dart'; +import 'package:kernel/target/targets.dart'; import 'package:kernel/type_environment.dart'; import 'package:kernel/type_algebra.dart'; +import 'package:_fe_analyzer_shared/src/messages/codes.dart' + show messageWasmSyncStar; -void transformLibraries( - List libraries, CoreTypes coreTypes, ClassHierarchy hierarchy) { - final transformer = _WasmTransformer(coreTypes, hierarchy); +void transformLibraries(List libraries, CoreTypes coreTypes, + ClassHierarchy hierarchy, DiagnosticReporter diagnosticReporter) { + final transformer = + _WasmTransformer(coreTypes, hierarchy, diagnosticReporter); libraries.forEach(transformer.visitLibrary); } void transformProcedure( Procedure procedure, CoreTypes coreTypes, ClassHierarchy hierarchy) { - final transformer = _WasmTransformer(coreTypes, hierarchy); + final transformer = _WasmTransformer(coreTypes, hierarchy, null); procedure.accept(transformer); } class _WasmTransformer extends Transformer { final TypeEnvironment env; + final DiagnosticReporter? diagnosticReporter; Member? _currentMember; StaticTypeContext? _cachedTypeContext; @@ -43,7 +48,8 @@ class _WasmTransformer extends Transformer { CoreTypes get coreTypes => env.coreTypes; - _WasmTransformer(CoreTypes coreTypes, ClassHierarchy hierarchy) + _WasmTransformer( + CoreTypes coreTypes, ClassHierarchy hierarchy, this.diagnosticReporter) : env = TypeEnvironment(coreTypes, hierarchy), _nonNullableTypeType = coreTypes.index .getClass('dart:core', '_Type') @@ -640,6 +646,10 @@ class _WasmTransformer extends Transformer { _enclosingIsAsyncStar = false; return super.visitFunctionNode(functionNode); } else { + if (functionNode.dartAsyncMarker == AsyncMarker.SyncStar) { + diagnosticReporter?.report(messageWasmSyncStar, functionNode.fileOffset, + 1, functionNode.location?.file); + } bool previousEnclosing = _enclosingIsAsyncStar; TreeNode result = super.visitFunctionNode(functionNode); _enclosingIsAsyncStar = previousEnclosing; diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status index 31e0de10685..eefa6d15ccd 100644 --- a/pkg/front_end/messages.status +++ b/pkg/front_end/messages.status @@ -984,6 +984,8 @@ VariableCouldBeNullDueToWrite/example: Fail VariablePatternTypeMismatchInSwitchHeads/analyzerCode: Fail VariablePatternTypeMismatchInSwitchHeads/part_wrapped_script: Crash VariablePatternTypeMismatchInSwitchHeads/script: Crash +WasmSyncStar/analyzerCode: Fail +WasmSyncStar/example: Fail WeakWithStrongDillLibrary/analyzerCode: Fail WeakWithStrongDillLibrary/example: Fail WebLiteralCannotBeRepresentedExactly/analyzerCode: Fail diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml index dfd4297bf2f..a5d90046136 100644 --- a/pkg/front_end/messages.yaml +++ b/pkg/front_end/messages.yaml @@ -1675,6 +1675,10 @@ YieldNotGenerator: problemMessage: "'yield' can only be used in 'sync*' or 'async*' methods." analyzerCode: YIELD_IN_NON_GENERATOR +WasmSyncStar: + problemMessage: "Compilation to Wasm does not support 'sync*'." + severity: WARNING + OnlyTry: index: 20 problemMessage: "A try block must be followed by an 'on', 'catch', or 'finally' clause." diff --git a/pkg/front_end/testcases/dart2wasm/yield.dart.strong.transformed.expect b/pkg/front_end/testcases/dart2wasm/yield.dart.strong.transformed.expect index 07a0c80bcdf..67d0b8c738e 100644 --- a/pkg/front_end/testcases/dart2wasm/yield.dart.strong.transformed.expect +++ b/pkg/front_end/testcases/dart2wasm/yield.dart.strong.transformed.expect @@ -1,3 +1,8 @@ +// +// Problems outside component: +// +// pkg/front_end/testcases/dart2wasm/yield.dart: Warning: Compilation to Wasm does not support 'sync*'. +// library /*isNonNullableByDefault*/; import self as self; import "dart:core" as core;