@@ -3,6 +3,7 @@ import read_expression from '../read/expression.js';
3
3
import * as e from '../../../errors.js' ;
4
4
import { create_fragment } from '../utils/create.js' ;
5
5
import { walk } from 'zimmerframe' ;
6
+ import { parse_expression_at } from '../acorn.js' ;
6
7
7
8
const regex_whitespace_with_closing_curly_brace = / ^ \s * } / ;
8
9
@@ -268,39 +269,28 @@ function open(parser) {
268
269
e . expected_identifier ( parser . index ) ;
269
270
}
270
271
271
- parser . eat ( '(' , true ) ;
272
-
273
- parser . allow_whitespace ( ) ;
274
-
275
- /** @type {import('estree').Pattern[] } */
276
- const parameters = [ ] ;
272
+ let slice_end = parser . index ;
277
273
278
- while ( ! parser . match ( ')' ) ) {
279
- let pattern = read_pattern ( parser , true ) ;
280
-
281
- parser . allow_whitespace ( ) ;
282
- if ( parser . eat ( '=' ) ) {
283
- parser . allow_whitespace ( ) ;
284
- const right = read_expression ( parser ) ;
285
- pattern = {
286
- type : 'AssignmentPattern' ,
287
- left : pattern ,
288
- right : right ,
289
- start : pattern . start ,
290
- end : right . end
291
- } ;
292
- }
274
+ parser . eat ( '(' , true ) ;
293
275
294
- parameters . push ( pattern ) ;
276
+ let parentheses = 1 ;
277
+ let params = '' ;
295
278
296
- if ( ! parser . eat ( ',' ) ) break ;
297
- parser . allow_whitespace ( ) ;
279
+ while ( ! parser . match ( ')' ) || parentheses !== 1 ) {
280
+ if ( parser . match ( '(' ) ) parentheses ++ ;
281
+ if ( parser . match ( ')' ) ) parentheses -- ;
282
+ params += parser . read ( / ^ ./ ) ;
298
283
}
299
284
300
- parser . eat ( ')' , true ) ;
285
+ let function_expression = /** @type {import('estree').ArrowFunctionExpression } */ (
286
+ parse_expression_at (
287
+ parser . template . slice ( 0 , slice_end ) . replace ( / \S / g, ' ' ) + `(${ params } ) => {}` ,
288
+ parser . ts ,
289
+ 0
290
+ )
291
+ ) ;
301
292
302
- parser . allow_whitespace ( ) ;
303
- parser . eat ( '}' , true ) ;
293
+ parser . index += 2 ;
304
294
305
295
/** @type {ReturnType<typeof parser.append<import('#compiler').SnippetBlock>> } */
306
296
const block = parser . append ( {
@@ -313,10 +303,9 @@ function open(parser) {
313
303
end : name_end ,
314
304
name
315
305
} ,
316
- parameters,
306
+ parameters : function_expression . params ,
317
307
body : create_fragment ( )
318
308
} ) ;
319
-
320
309
parser . stack . push ( block ) ;
321
310
parser . fragments . push ( block . body ) ;
322
311
0 commit comments