@@ -40,6 +40,9 @@ abstract class _Specializer {
4040 /// Whether this config is associated with a constructor or factory.
4141 bool get isConstructor;
4242
43+ /// Whether this is a setter where there's no return value.
44+ bool get isSetter;
45+
4346 /// The parameters that determine arity of the interop procedure that is
4447 /// created from this config.
4548 List <VariableDeclaration > get parameters;
@@ -61,15 +64,17 @@ abstract class _Specializer {
6164 final callArguments =
6265 firstParameterIsObject ? parameterNames.sublist (1 ) : parameterNames;
6366 final callArgumentsString = callArguments.join (',' );
64- final functionParameters = firstParameterIsObject
67+ String functionParameters = firstParameterIsObject
6568 ? '$object ${callArguments .isEmpty ? '' : ',$callArgumentsString ' }'
6669 : callArgumentsString;
6770 final body = bodyString (object, callArguments);
71+
6872 if (parametersNeedParens (parameterNames)) {
69- return '($functionParameters ) => $body ' ;
70- } else {
71- return '$functionParameters => $body ' ;
73+ functionParameters = '($functionParameters )' ;
7274 }
75+ return isSetter
76+ ? '$functionParameters => { $body }'
77+ : '$functionParameters => $body ' ;
7378 }
7479
7580 /// Returns an [Expression] representing the specialization of a given
@@ -161,6 +166,9 @@ class _ConstructorSpecializer extends _ProcedureSpecializer {
161166 @override
162167 bool get isConstructor => true ;
163168
169+ @override
170+ bool get isSetter => false ;
171+
164172 @override
165173 String bodyString (String object, List <String > callArguments) =>
166174 "new $jsString (${callArguments .join (',' )})" ;
@@ -172,6 +180,9 @@ class _GetterSpecializer extends _ProcedureSpecializer {
172180 @override
173181 bool get isConstructor => false ;
174182
183+ @override
184+ bool get isSetter => false ;
185+
175186 @override
176187 String bodyString (String object, List <String > callArguments) =>
177188 '$object .$jsString ' ;
@@ -183,6 +194,9 @@ class _SetterSpecializer extends _ProcedureSpecializer {
183194 @override
184195 bool get isConstructor => false ;
185196
197+ @override
198+ bool get isSetter => true ;
199+
186200 @override
187201 String bodyString (String object, List <String > callArguments) =>
188202 '$object .$jsString = ${callArguments [0 ]}' ;
@@ -194,6 +208,9 @@ class _MethodSpecializer extends _ProcedureSpecializer {
194208 @override
195209 bool get isConstructor => false ;
196210
211+ @override
212+ bool get isSetter => false ;
213+
197214 @override
198215 String bodyString (String object, List <String > callArguments) =>
199216 "$object .$jsString (${callArguments .join (',' )})" ;
@@ -205,15 +222,20 @@ class _OperatorSpecializer extends _ProcedureSpecializer {
205222 @override
206223 bool get isConstructor => false ;
207224
225+ @override
226+ bool get isSetter => switch (jsString) {
227+ '[]' => false ,
228+ '[]=' => true ,
229+ _ => throw UnimplementedError (
230+ 'External operator $jsString is unsupported for static interop. '
231+ 'Please file a request in the SDK if you want it to be supported.' )
232+ };
233+
208234 @override
209235 String bodyString (String object, List <String > callArguments) {
210- return switch (jsString) {
211- '[]' => '$object [${callArguments [0 ]}]' ,
212- '[]=' => '$object [${callArguments [0 ]}] = ${callArguments [1 ]}' ,
213- _ => throw UnimplementedError (
214- 'External operator $jsString is unsupported for static interop. '
215- 'Please file a request in the SDK if you want it to be supported.' )
216- };
236+ return isSetter
237+ ? '$object [${callArguments [0 ]}] = ${callArguments [1 ]}'
238+ : '$object [${callArguments [0 ]}]' ;
217239 }
218240}
219241
@@ -270,6 +292,9 @@ class _ConstructorInvocationSpecializer
270292 @override
271293 bool get isConstructor => true ;
272294
295+ @override
296+ bool get isSetter => false ;
297+
273298 @override
274299 String bodyString (String object, List <String > callArguments) =>
275300 "new $jsString (${callArguments .join (',' )})" ;
@@ -282,6 +307,9 @@ class _MethodInvocationSpecializer extends _PositionalInvocationSpecializer {
282307 @override
283308 bool get isConstructor => false ;
284309
310+ @override
311+ bool get isSetter => false ;
312+
285313 @override
286314 String bodyString (String object, List <String > callArguments) =>
287315 "$object .$jsString (${callArguments .join (',' )})" ;
@@ -297,6 +325,9 @@ class _ObjectLiteralSpecializer extends _InvocationSpecializer {
297325 @override
298326 bool get isConstructor => true ;
299327
328+ @override
329+ bool get isSetter => false ;
330+
300331 @override
301332 List <VariableDeclaration > get parameters {
302333 // Compute the named parameters that were used in the given `invocation`.
0 commit comments