fix(transformer/typescript): should strip import specifiers type with only_remove_type_imports (#8141)

close: https://github.com/oxc-project/oxc/issues/8140
close: https://github.com/rolldown/rolldown/issues/3244

---------

Co-authored-by: Dunqing <dengqing0821@gmail.com>
This commit is contained in:
underfin 2025-01-06 18:20:16 +08:00 committed by GitHub
parent f87da160df
commit 2e7207f11c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 27 additions and 6 deletions

View file

@ -95,8 +95,6 @@ impl<'a, 'ctx> Traverse<'a> for TypeScriptAnnotations<'a, 'ctx> {
Statement::ImportDeclaration(decl) => {
if decl.import_kind.is_type() {
false
} else if self.only_remove_type_imports {
true
} else if let Some(specifiers) = &mut decl.specifiers {
if specifiers.is_empty() {
// import {} from 'mod' -> import 'mod'
@ -118,9 +116,28 @@ impl<'a, 'ctx> Traverse<'a> for TypeScriptAnnotations<'a, 'ctx> {
&s.local
}
};
self.has_value_reference(&id.name, ctx)
// If `only_remove_type_imports` is true, then we can return `true` to keep it because
// it is not a type import, otherwise we need to check if the identifier is referenced
if self.only_remove_type_imports {
true
} else {
self.has_value_reference(&id.name, ctx)
}
});
!specifiers.is_empty()
if specifiers.is_empty() {
// `import { type A } from 'mod'`
if self.only_remove_type_imports {
// -> `import 'mod'`
decl.specifiers = None;
true
} else {
// Remove the import declaration if all specifiers are removed
false
}
} else {
true
}
}
} else {
true

View file

@ -2173,7 +2173,9 @@ after transform: []
rebuilt : ["require"]
* imports/only-remove-type-imports/input.ts
x Output mismatch
Bindings mismatch:
after transform: ScopeId(0): ["H", "I", "I2", "J", "K1", "K2", "L1", "L2", "L3", "a", "b", "c2", "d", "d2", "e", "e4"]
rebuilt : ScopeId(0): ["L2", "a", "b", "c2", "d", "d2", "e", "e4"]
* imports/property-signature/input.ts
Bindings mismatch:
@ -2204,7 +2206,9 @@ after transform: ScopeId(0): ["Foo1", "Foo2"]
rebuilt : ScopeId(0): []
* imports/type-only-import-specifier-4/input.ts
x Output mismatch
Bindings mismatch:
after transform: ScopeId(0): ["A"]
rebuilt : ScopeId(0): []
* lvalues/TSTypeParameterInstantiation/input.ts
Symbol reference IDs mismatch for "AbstractClass":