@@ -401,3 +401,38 @@ impl ESTree for TSFunctionTypeParams<'_, '_> {
401401 Concat2 ( & fn_type. this_param , fn_type. params . as_ref ( ) ) . serialize ( serializer) ;
402402 }
403403}
404+
405+ /// Converter for [`TSParenthesizedType`].
406+ ///
407+ /// In raw transfer, do not produce a `TSParenthesizedType` node in AST if `preserveParens` is false.
408+ ///
409+ /// Not useful in `oxc-parser`, as can use parser option `preserve_parens`.
410+ /// Required for `oxlint` plugins where we run parser with `preserve_parens` set to `true`,
411+ /// to preserve them on Rust side, but need to remove them on JS side.
412+ ///
413+ /// ESTree implementation is unchanged from the auto-generated version.
414+ #[ ast_meta]
415+ #[ estree( raw_deser = "
416+ let node = DESER[TSType](POS_OFFSET.type_annotation);
417+ if (preserveParens) {
418+ node = {
419+ type: 'TSParenthesizedType',
420+ typeAnnotation: node,
421+ start: DESER[u32]( POS_OFFSET.span.start ),
422+ end: DESER[u32]( POS_OFFSET.span.end ),
423+ };
424+ }
425+ node
426+ " ) ]
427+ pub struct TSParenthesizedTypeConverter < ' a , ' b > ( pub & ' b TSParenthesizedType < ' a > ) ;
428+
429+ impl ESTree for TSParenthesizedTypeConverter < ' _ , ' _ > {
430+ fn serialize < S : Serializer > ( & self , serializer : S ) {
431+ let paren_type = self . 0 ;
432+ let mut state = serializer. serialize_struct ( ) ;
433+ state. serialize_field ( "type" , & JsonSafeString ( "TSParenthesizedType" ) ) ;
434+ state. serialize_field ( "typeAnnotation" , & paren_type. type_annotation ) ;
435+ state. serialize_span ( paren_type. span ) ;
436+ state. end ( ) ;
437+ }
438+ }
0 commit comments