diff --git a/crates/oxc_codegen/src/gen.rs b/crates/oxc_codegen/src/gen.rs index 9feacb6e0a2d6a..a0e05066e28e95 100644 --- a/crates/oxc_codegen/src/gen.rs +++ b/crates/oxc_codegen/src/gen.rs @@ -2405,8 +2405,7 @@ impl<'a, const MINIFY: bool> Gen for MethodDefinition<'a> { } if let Some(body) = &self.value.body { body.gen(p, ctx); - } - if p.options.enable_typescript { + } else if p.options.enable_typescript { p.print_semicolon_after_statement(); } } diff --git a/tasks/coverage/src/transformer.rs b/tasks/coverage/src/transformer.rs index 23ca45a800dc23..5e18791c0a0556 100644 --- a/tasks/coverage/src/transformer.rs +++ b/tasks/coverage/src/transformer.rs @@ -43,7 +43,7 @@ fn get_result( let options = options.unwrap_or_else(get_default_transformer_options); let parse_result1 = Parser::new(&allocator, source_text, source_type).parse(); let mut program = parse_result1.program; - let _ = Transformer::new( + let transform_result1 = Transformer::new( &allocator, source_path, source_type, @@ -53,7 +53,7 @@ fn get_result( ) .build(&mut program); - let source_text1 = Codegen::::new( + let ts_source_text1 = Codegen::::new( &filename, source_text, CodegenOptions::default().with_typescript(true), @@ -62,10 +62,19 @@ fn get_result( .build(&program) .source_text; - let parse_result2 = Parser::new(&allocator, &source_text1, source_type).parse(); + let source_text1 = + Codegen::::new(&filename, source_text, CodegenOptions::default(), None) + .build(&program) + .source_text; + + if transform_result1.is_ok() && ts_source_text1 != source_text1 { + return TestResult::Mismatch(ts_source_text1.clone(), source_text1.clone()); + } + + let parse_result2 = Parser::new(&allocator, &ts_source_text1, source_type).parse(); let mut program = parse_result2.program; - let _ = Transformer::new( + let transform_result2 = Transformer::new( &allocator, source_path, source_type, @@ -75,19 +84,22 @@ fn get_result( ) .build(&mut program); - let source_text2 = Codegen::::new( - &filename, - &source_text1, - CodegenOptions::default().with_typescript(true), - None, - ) - .build(&program) - .source_text; - - let result = source_text1 == source_text2; + let source_text2 = + Codegen::::new(&filename, &source_text1, CodegenOptions::default(), None) + .build(&program) + .source_text; - if result { + if source_text1 == source_text2 { TestResult::Passed + } else if transform_result1.is_err_and(|err| { + // If error messages are the same, we consider it as a pass. + transform_result2 + .map_err(|err| err.iter().map(ToString::to_string).collect::>().join("\n")) + .is_err_and(|err_message| { + err.iter().map(ToString::to_string).collect::>().join("\n") == err_message + }) + }) { + return TestResult::Passed; } else { TestResult::Mismatch(source_text1.clone(), source_text2) } diff --git a/tasks/coverage/transformer_babel.snap b/tasks/coverage/transformer_babel.snap index edaccc353d7f72..7149c9fb16fab6 100644 --- a/tasks/coverage/transformer_babel.snap +++ b/tasks/coverage/transformer_babel.snap @@ -2,4 +2,6 @@ commit: 4bd1b2c2 transformer_babel Summary: AST Parsed : 2099/2099 (100.00%) -Positive Passed: 2099/2099 (100.00%) +Positive Passed: 2097/2099 (99.90%) +Mismatch: "typescript/class/parameter-properties/input.ts" +Mismatch: "typescript/export/as-namespace/input.ts" diff --git a/tasks/coverage/transformer_typescript.snap b/tasks/coverage/transformer_typescript.snap index 9f5bf8551c3bfe..4476fdf4844bb7 100644 --- a/tasks/coverage/transformer_typescript.snap +++ b/tasks/coverage/transformer_typescript.snap @@ -2,5 +2,37 @@ commit: 64d2eeea transformer_typescript Summary: AST Parsed : 5243/5243 (100.00%) -Positive Passed: 5242/5243 (99.98%) +Positive Passed: 5210/5243 (99.37%) +Mismatch: "compiler/amdModuleName1.ts" +Mismatch: "compiler/avoidCycleWithVoidExpressionReturnedFromArrow.ts" +Mismatch: "compiler/clinterfaces.ts" +Mismatch: "compiler/collectionPatternNoError.ts" +Mismatch: "compiler/comparabilityTypeParametersRelatedByUnion.ts" +Mismatch: "compiler/constEnumMergingWithValues1.ts" +Mismatch: "compiler/constEnumMergingWithValues2.ts" +Mismatch: "compiler/constEnumMergingWithValues3.ts" +Mismatch: "compiler/constEnumMergingWithValues4.ts" +Mismatch: "compiler/constEnumMergingWithValues5.ts" Mismatch: "compiler/elidedEmbeddedStatementsReplacedWithSemicolon.ts" +Mismatch: "compiler/es5-umd4.ts" +Mismatch: "compiler/exportAssignValueAndType.ts" +Mismatch: "compiler/exportAssignmentWithPrivacyError.ts" +Mismatch: "compiler/exportAssignmentWithoutIdentifier1.ts" +Mismatch: "compiler/exportEqualNamespaces.ts" +Mismatch: "compiler/exportEqualsAmd.ts" +Mismatch: "compiler/exportEqualsClassNoRedeclarationError.ts" +Mismatch: "compiler/exportEqualsCommonJs.ts" +Mismatch: "compiler/exportEqualsUmd.ts" +Mismatch: "compiler/module_augmentUninstantiatedModule2.ts" +Mismatch: "compiler/noCircularDefinitionOnExportOfPrivateInMergedNamespace.ts" +Mismatch: "compiler/noErrorUsingImportExportModuleAugmentationInDeclarationFile1.ts" +Mismatch: "compiler/recursiveFieldSetting.ts" +Mismatch: "compiler/sourceMapValidationExportAssignment.ts" +Mismatch: "compiler/sourceMapValidationExportAssignmentCommonjs.ts" +Mismatch: "compiler/varianceProblingAndZeroOrderIndexSignatureRelationsAlign.ts" +Mismatch: "compiler/varianceProblingAndZeroOrderIndexSignatureRelationsAlign2.ts" +Mismatch: "conformance/classes/members/privateNames/privateNameFieldParenthesisLeftAssignment.ts" +Mismatch: "conformance/classes/propertyMemberDeclarations/initializationOrdering1.ts" +Mismatch: "conformance/classes/propertyMemberDeclarations/instanceMemberInitialization.ts" +Mismatch: "conformance/decorators/class/constructor/parameter/decoratorOnClassConstructorParameter5.ts" +Mismatch: "conformance/statements/VariableStatements/usingDeclarations/usingDeclarationsTopLevelOfModule.2.ts"