diff --git a/crates/oxc_ast/src/ast/ts.rs b/crates/oxc_ast/src/ast/ts.rs index fd18de01b6338..167963656cf6a 100644 --- a/crates/oxc_ast/src/ast/ts.rs +++ b/crates/oxc_ast/src/ast/ts.rs @@ -1131,6 +1131,7 @@ pub struct TSTypePredicate<'a> { /// declare function isString(x: any): asserts x is string; // true /// ``` pub asserts: bool, + #[estree(via = TSTypePredicateTypeAnnotation)] pub type_annotation: Option>>, } diff --git a/crates/oxc_ast/src/generated/derive_estree.rs b/crates/oxc_ast/src/generated/derive_estree.rs index eaedb391098dd..5002504b9b261 100644 --- a/crates/oxc_ast/src/generated/derive_estree.rs +++ b/crates/oxc_ast/src/generated/derive_estree.rs @@ -3020,7 +3020,10 @@ impl ESTree for TSTypePredicate<'_> { state.serialize_field("end", &self.span.end); state.serialize_field("parameterName", &self.parameter_name); state.serialize_field("asserts", &self.asserts); - state.serialize_field("typeAnnotation", &self.type_annotation); + state.serialize_field( + "typeAnnotation", + &crate::serialize::TSTypePredicateTypeAnnotation(self), + ); state.end(); } } diff --git a/crates/oxc_ast/src/serialize.rs b/crates/oxc_ast/src/serialize.rs index b67c84c98a022..0757e43d41b3e 100644 --- a/crates/oxc_ast/src/serialize.rs +++ b/crates/oxc_ast/src/serialize.rs @@ -1586,6 +1586,38 @@ fn serialize_formal_params_with_this_param<'a, S: Serializer>( seq.end(); } +/// Serializer for `type_annotation` field of `TSTypePredicate`. +/// +/// TODO: More description +#[ast_meta] +#[estree( + ts_type = "TSTypeAnnotation | null", + raw_deser = " + const typeAnnotation = DESER[Option>](POS_OFFSET.type_annotation); + // TODO: raw_deser + typeAnnotation + " +)] +pub struct TSTypePredicateTypeAnnotation<'a, 'b>(pub &'b TSTypePredicate<'a>); + +impl ESTree for TSTypePredicateTypeAnnotation<'_, '_> { + fn serialize(&self, serializer: S) { + let Some(type_predicate_type_annotation) = &self.0.type_annotation else { + Null(()).serialize(serializer); + return; + }; + + let inner_type_annotation = &type_predicate_type_annotation.type_annotation; + let inner_type_annotation_span = inner_type_annotation.span(); + let mut state = serializer.serialize_struct(); + state.serialize_field("type", &JsonSafeString("TSTypeAnnotation")); + state.serialize_field("start", &inner_type_annotation_span.start); + state.serialize_field("end", &inner_type_annotation_span.end); + state.serialize_field("typeAnnotation", &inner_type_annotation); + state.end(); + } +} + // -------------------- // Comments // -------------------- diff --git a/napi/parser/generated/deserialize/js.js b/napi/parser/generated/deserialize/js.js index 00b55d93652e0..edbfacc92f5d3 100644 --- a/napi/parser/generated/deserialize/js.js +++ b/napi/parser/generated/deserialize/js.js @@ -1775,13 +1775,15 @@ function deserializeTSInterfaceHeritage(pos) { } function deserializeTSTypePredicate(pos) { + const typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 32); + // TODO: raw_deser return { type: 'TSTypePredicate', start: deserializeU32(pos), end: deserializeU32(pos + 4), parameterName: deserializeTSTypePredicateName(pos + 8), asserts: deserializeBool(pos + 24), - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 32), + typeAnnotation, }; } diff --git a/napi/parser/generated/deserialize/ts.js b/napi/parser/generated/deserialize/ts.js index b77e41e42519b..b26ffc070046d 100644 --- a/napi/parser/generated/deserialize/ts.js +++ b/napi/parser/generated/deserialize/ts.js @@ -1927,13 +1927,15 @@ function deserializeTSInterfaceHeritage(pos) { } function deserializeTSTypePredicate(pos) { + const typeAnnotation = deserializeOptionBoxTSTypeAnnotation(pos + 32); + // TODO: raw_deser return { type: 'TSTypePredicate', start: deserializeU32(pos), end: deserializeU32(pos + 4), parameterName: deserializeTSTypePredicateName(pos + 8), asserts: deserializeBool(pos + 24), - typeAnnotation: deserializeOptionBoxTSTypeAnnotation(pos + 32), + typeAnnotation, }; } diff --git a/tasks/coverage/snapshots/estree_typescript.snap b/tasks/coverage/snapshots/estree_typescript.snap index bc51d413d9d86..a8bfb45ce03de 100644 --- a/tasks/coverage/snapshots/estree_typescript.snap +++ b/tasks/coverage/snapshots/estree_typescript.snap @@ -2,17 +2,7 @@ commit: 15392346 estree_typescript Summary: AST Parsed : 6480/6481 (99.98%) -Positive Passed: 6472/6481 (99.86%) -Mismatch: tasks/coverage/typescript/tests/cases/compiler/controlFlowInstanceofWithSymbolHasInstance.ts - -Mismatch: tasks/coverage/typescript/tests/cases/compiler/narrowingUnionToUnion.ts - -Mismatch: tasks/coverage/typescript/tests/cases/conformance/expressions/binaryOperators/instanceofOperator/instanceofOperatorWithRHSHasSymbolHasInstance.ts - -Mismatch: tasks/coverage/typescript/tests/cases/conformance/expressions/typeGuards/typeGuardNarrowsPrimitiveIntersection.ts - -Mismatch: tasks/coverage/typescript/tests/cases/conformance/expressions/typeGuards/typeGuardNarrowsToLiteralTypeUnion.ts - +Positive Passed: 6478/6481 (99.95%) Expect to Parse: tasks/coverage/typescript/tests/cases/conformance/jsx/jsxReactTestSuite.tsx JSX expressions may not use the comma operator @@ -20,5 +10,3 @@ Mismatch: tasks/coverage/typescript/tests/cases/conformance/jsx/tsxReactEmitEnti Mismatch: tasks/coverage/typescript/tests/cases/conformance/jsx/tsxReactEmitNesting.tsx -Mismatch: tasks/coverage/typescript/tests/cases/conformance/types/stringLiteral/stringLiteralTypesAsTags02.ts -