From 2e78b918d1f5dcd0fb4928840506c8e084c488ad Mon Sep 17 00:00:00 2001 From: Dunqing Date: Thu, 18 Jan 2024 21:28:48 +0800 Subject: [PATCH] refactor(transformer/typescript): move the ExportNamedDeclaration logic to its function (#2074) --- crates/oxc_transformer/src/typescript/mod.rs | 96 +++++++++++--------- 1 file changed, 54 insertions(+), 42 deletions(-) diff --git a/crates/oxc_transformer/src/typescript/mod.rs b/crates/oxc_transformer/src/typescript/mod.rs index b527f0ab5..3f662918d 100644 --- a/crates/oxc_transformer/src/typescript/mod.rs +++ b/crates/oxc_transformer/src/typescript/mod.rs @@ -49,53 +49,21 @@ impl<'a> TypeScript<'a> { } } - /// Remove `export` from merged declaration. - /// We only preserve the first one. - /// for example: - /// ```TypeScript - /// export enum Foo {} - /// export enum Foo {} - /// ``` - /// ```JavaScript - /// export enum Foo {} - /// enum Foo {} - /// ``` pub fn transform_statement(&mut self, stmt: &mut Statement<'a>) { - let Statement::ModuleDeclaration(module_decl) = stmt else { - return; - }; - - let ModuleDeclaration::ExportNamedDeclaration(export_decl) = &mut **module_decl else { - return; - }; - - let ExportNamedDeclaration { - declaration: Some(declaration), - source: None, - export_kind: ImportOrExportKind::Value, - .. - } = &mut **export_decl - else { - return; - }; - - let id = match &declaration { - Declaration::TSEnumDeclaration(decl) => decl.id.name.clone(), - Declaration::TSModuleDeclaration(decl) => { - let TSModuleDeclarationName::Identifier(id) = &decl.id else { - return; - }; - - id.name.clone() + let new_stmt = match stmt { + Statement::ModuleDeclaration(module_decl) => { + if let ModuleDeclaration::ExportNamedDeclaration(decl) = &mut **module_decl { + self.transform_export_named_declaration(decl) + } else { + None + } } - _ => return, + _ => None, }; - if self.export_name_set.insert(id) { - return; + if let Some(new_stmt) = new_stmt { + *stmt = new_stmt; } - - *stmt = Statement::Declaration(self.ast.move_declaration(declaration)); } /// * Remove the top level import / export statements that are types @@ -550,4 +518,48 @@ impl<'a> TypeScript<'a> { Some(Declaration::VariableDeclaration(variable_declaration)) } + + /// Remove `export` from merged declaration. + /// We only preserve the first one. + /// for example: + /// ```TypeScript + /// export enum Foo {} + /// export enum Foo {} + /// ``` + /// ```JavaScript + /// export enum Foo {} + /// enum Foo {} + /// ``` + fn transform_export_named_declaration( + &mut self, + decl: &mut Box<'_, ExportNamedDeclaration<'a>>, + ) -> Option> { + let ExportNamedDeclaration { + declaration: Some(declaration), + source: None, + export_kind: ImportOrExportKind::Value, + .. + } = &mut **decl + else { + return None; + }; + + let id = match &declaration { + Declaration::TSEnumDeclaration(decl) => decl.id.name.clone(), + Declaration::TSModuleDeclaration(decl) => { + let TSModuleDeclarationName::Identifier(id) = &decl.id else { + return None; + }; + + id.name.clone() + } + _ => return None, + }; + + if self.export_name_set.insert(id) { + return None; + } + + Some(Statement::Declaration(self.ast.move_declaration(declaration))) + } }