From 712b3d2a116010ce1615d3173075cc4172642568 Mon Sep 17 00:00:00 2001 From: Dunqing Date: Sat, 23 Mar 2024 21:38:17 +0800 Subject: [PATCH] feat(semantic): distinguish type imports in ModuleRecord (#2785) I am not sure moving `ImportOrExportKind` to `oxc-syntax` is a good solution. --- crates/oxc_semantic/src/module_record/builder.rs | 10 ++++++---- crates/oxc_semantic/src/module_record/mod.rs | 4 ++++ crates/oxc_syntax/src/module_record.rs | 2 ++ 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/crates/oxc_semantic/src/module_record/builder.rs b/crates/oxc_semantic/src/module_record/builder.rs index 29aec61d4dc9..9ea66936a697 100644 --- a/crates/oxc_semantic/src/module_record/builder.rs +++ b/crates/oxc_semantic/src/module_record/builder.rs @@ -170,33 +170,35 @@ impl ModuleRecordBuilder { } fn visit_import_declaration(&mut self, decl: &ImportDeclaration) { - if decl.import_kind.is_type() { - return; - } let module_request = NameSpan::new(decl.source.value.to_compact_str(), decl.source.span); + if let Some(specifiers) = &decl.specifiers { for specifier in specifiers { - let (import_name, local_name) = match specifier { + let (import_name, local_name, is_type) = match specifier { ImportDeclarationSpecifier::ImportSpecifier(specifier) => ( ImportImportName::Name(NameSpan::new( specifier.imported.name().to_compact_str(), specifier.imported.span(), )), NameSpan::new(specifier.local.name.to_compact_str(), specifier.local.span), + decl.import_kind.is_type() || specifier.import_kind.is_type(), ), ImportDeclarationSpecifier::ImportNamespaceSpecifier(specifier) => ( ImportImportName::NamespaceObject, NameSpan::new(specifier.local.name.to_compact_str(), specifier.local.span), + decl.import_kind.is_type(), ), ImportDeclarationSpecifier::ImportDefaultSpecifier(specifier) => ( ImportImportName::Default(specifier.span), NameSpan::new(specifier.local.name.to_compact_str(), specifier.local.span), + decl.import_kind.is_type(), ), }; self.add_import_entry(ImportEntry { module_request: module_request.clone(), import_name, local_name, + is_type, }); } } diff --git a/crates/oxc_semantic/src/module_record/mod.rs b/crates/oxc_semantic/src/module_record/mod.rs index 006233272bc9..c9439f31fc47 100644 --- a/crates/oxc_semantic/src/module_record/mod.rs +++ b/crates/oxc_semantic/src/module_record/mod.rs @@ -35,6 +35,7 @@ mod module_record_tests { module_request: NameSpan::new("mod".into(), Span::new(14, 19)), import_name: ImportImportName::Default(Span::new(7, 8)), local_name: NameSpan::new("v".into(), Span::new(7, 8)), + is_type: false, }; assert_eq!(module_record.import_entries.len(), 1); assert_eq!(module_record.import_entries[0], import_entry); @@ -47,6 +48,7 @@ mod module_record_tests { module_request: NameSpan::new("mod".into(), Span::new(20, 25)), import_name: ImportImportName::NamespaceObject, local_name: NameSpan::new("ns".into(), Span::new(12, 14)), + is_type: false, }; assert_eq!(module_record.import_entries.len(), 1); assert_eq!(module_record.import_entries[0], import_entry); @@ -59,6 +61,7 @@ mod module_record_tests { module_request: NameSpan::new("mod".into(), Span::new(18, 23)), import_name: ImportImportName::Name(NameSpan::new("x".into(), Span::new(9, 10))), local_name: NameSpan::new("x".into(), Span::new(9, 10)), + is_type: false, }; assert_eq!(module_record.import_entries.len(), 1); assert_eq!(module_record.import_entries[0], import_entry); @@ -71,6 +74,7 @@ mod module_record_tests { module_request: NameSpan::new("mod".into(), Span::new(23, 28)), import_name: ImportImportName::Name(NameSpan::new("x".into(), Span::new(9, 10))), local_name: NameSpan::new("v".into(), Span::new(14, 15)), + is_type: false, }; assert_eq!(module_record.import_entries.len(), 1); assert_eq!(module_record.import_entries[0], import_entry); diff --git a/crates/oxc_syntax/src/module_record.rs b/crates/oxc_syntax/src/module_record.rs index fca0d7c5dace..b6ed6638d397 100644 --- a/crates/oxc_syntax/src/module_record.rs +++ b/crates/oxc_syntax/src/module_record.rs @@ -148,6 +148,8 @@ pub struct ImportEntry { /// The name that is used to locally access the imported value from within the importing module. pub local_name: NameSpan, + + pub is_type: bool, } /// `ImportName` For `ImportEntry`