Skip to content

Commit b327319

Browse files
committed
feat(transformer): remove ExportSpecifier where refers to a declare declaration
1 parent f41abc2 commit b327319

File tree

4 files changed

+64
-98
lines changed

4 files changed

+64
-98
lines changed

crates/oxc_transformer/src/typescript/annotations.rs

Lines changed: 33 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -78,20 +78,20 @@ impl<'a> Traverse<'a> for TypeScriptAnnotations<'a, '_> {
7878
// Keep the export declaration if there are no export specifiers
7979
true
8080
} else {
81-
decl.specifiers.retain(|specifier| {
82-
!(specifier.export_kind.is_type()
83-
|| self.type_identifier_names.contains(&specifier.exported.name())
84-
|| matches!(
85-
&specifier.local, ModuleExportName::IdentifierReference(ident)
86-
if ctx.scoping().get_reference(ident.reference_id()).is_type()
87-
))
88-
});
81+
decl.specifiers
82+
.retain(|specifier| self.can_retain_export_specifier(specifier, ctx));
8983
// Keep the export declaration if there are still specifiers after removing type exports
9084
!decl.specifiers.is_empty()
9185
}
9286
}
9387
Statement::ExportAllDeclaration(decl) => !decl.export_kind.is_type(),
94-
Statement::ExportDefaultDeclaration(decl) => !decl.is_typescript_syntax(),
88+
Statement::ExportDefaultDeclaration(decl) => {
89+
!decl.is_typescript_syntax()
90+
&& !matches!(
91+
&decl.declaration,
92+
ExportDefaultDeclarationKind::Identifier(ident) if Self::is_refers_to_type(ident, ctx)
93+
)
94+
}
9595
Statement::ImportDeclaration(decl) => {
9696
if decl.import_kind.is_type() {
9797
false
@@ -614,6 +614,30 @@ impl<'a> TypeScriptAnnotations<'a, '_> {
614614

615615
self.is_jsx_imports(&id.name)
616616
}
617+
618+
fn can_retain_export_specifier(
619+
&self,
620+
specifier: &ExportSpecifier<'a>,
621+
ctx: &TraverseCtx<'a>,
622+
) -> bool {
623+
if specifier.export_kind.is_type()
624+
|| self.type_identifier_names.contains(&specifier.exported.name())
625+
{
626+
return false;
627+
}
628+
!matches!(&specifier.local, ModuleExportName::IdentifierReference(ident) if Self::is_refers_to_type(ident, ctx))
629+
}
630+
631+
fn is_refers_to_type(ident: &IdentifierReference<'a>, ctx: &TraverseCtx<'a>) -> bool {
632+
let scoping = ctx.scoping();
633+
let reference = scoping.get_reference(ident.reference_id());
634+
635+
reference.symbol_id().is_some_and(|symbol_id| {
636+
reference.is_type()
637+
|| scoping.symbol_flags(symbol_id).is_ambient()
638+
&& scoping.symbol_redeclarations(symbol_id).iter().all(|r| r.flags.is_ambient())
639+
})
640+
}
617641
}
618642

619643
struct Assignment<'a> {

tasks/coverage/snapshots/semantic_babel.snap

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1498,15 +1498,6 @@ rebuilt : ScopeId(0): []
14981498
Scope children mismatch:
14991499
after transform: ScopeId(0): [ScopeId(1)]
15001500
rebuilt : ScopeId(0): []
1501-
Reference symbol mismatch for "foo":
1502-
after transform: SymbolId(0) "foo"
1503-
rebuilt : <None>
1504-
Reference flags mismatch for "foo":
1505-
after transform: ReferenceId(0): ReferenceFlags(Read)
1506-
rebuilt : ReferenceId(0): ReferenceFlags(Read | Type)
1507-
Unresolved references mismatch:
1508-
after transform: []
1509-
rebuilt : ["foo"]
15101501
15111502
tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/scope/export-declare-function-before/input.ts
15121503
semantic error: Bindings mismatch:
@@ -1515,15 +1506,6 @@ rebuilt : ScopeId(0): []
15151506
Scope children mismatch:
15161507
after transform: ScopeId(0): [ScopeId(1)]
15171508
rebuilt : ScopeId(0): []
1518-
Reference symbol mismatch for "foo":
1519-
after transform: SymbolId(0) "foo"
1520-
rebuilt : <None>
1521-
Reference flags mismatch for "foo":
1522-
after transform: ReferenceId(0): ReferenceFlags(Read)
1523-
rebuilt : ReferenceId(0): ReferenceFlags(Read | Type)
1524-
Unresolved references mismatch:
1525-
after transform: []
1526-
rebuilt : ["foo"]
15271509
15281510
tasks/coverage/babel/packages/babel-parser/test/fixtures/typescript/scope/export-enum-after/input.ts
15291511
semantic error: Scope flags mismatch:

tasks/coverage/snapshots/semantic_typescript.snap

Lines changed: 1 addition & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -361,15 +361,6 @@ tasks/coverage/typescript/tests/cases/compiler/allowSyntheticDefaultImportsCanPa
361361
semantic error: Scope children mismatch:
362362
after transform: ScopeId(0): [ScopeId(1)]
363363
rebuilt : ScopeId(0): []
364-
Reference symbol mismatch for "Color":
365-
after transform: SymbolId(0) "Color"
366-
rebuilt : <None>
367-
Reference flags mismatch for "Color":
368-
after transform: ReferenceId(0): ReferenceFlags(Type)
369-
rebuilt : ReferenceId(0): ReferenceFlags(Read | Type)
370-
Unresolved references mismatch:
371-
after transform: []
372-
rebuilt : ["Color"]
373364

374365
tasks/coverage/typescript/tests/cases/compiler/ambientClassDeclarationWithExtends.ts
375366
semantic error: Bindings mismatch:
@@ -8163,29 +8154,11 @@ tasks/coverage/typescript/tests/cases/compiler/declarationEmitToDeclarationDirWi
81638154
semantic error: Scope children mismatch:
81648155
after transform: ScopeId(0): [ScopeId(1)]
81658156
rebuilt : ScopeId(0): []
8166-
Reference symbol mismatch for "Foo":
8167-
after transform: SymbolId(0) "Foo"
8168-
rebuilt : <None>
8169-
Reference flags mismatch for "Foo":
8170-
after transform: ReferenceId(0): ReferenceFlags(Type)
8171-
rebuilt : ReferenceId(0): ReferenceFlags(Read | Type)
8172-
Unresolved references mismatch:
8173-
after transform: []
8174-
rebuilt : ["Foo"]
81758157

81768158
tasks/coverage/typescript/tests/cases/compiler/declarationEmitToDeclarationDirWithDeclarationOption.ts
81778159
semantic error: Scope children mismatch:
81788160
after transform: ScopeId(0): [ScopeId(1)]
81798161
rebuilt : ScopeId(0): []
8180-
Reference symbol mismatch for "Foo":
8181-
after transform: SymbolId(0) "Foo"
8182-
rebuilt : <None>
8183-
Reference flags mismatch for "Foo":
8184-
after transform: ReferenceId(0): ReferenceFlags(Type)
8185-
rebuilt : ReferenceId(0): ReferenceFlags(Read | Type)
8186-
Unresolved references mismatch:
8187-
after transform: []
8188-
rebuilt : ["Foo"]
81898162

81908163
tasks/coverage/typescript/tests/cases/compiler/declarationEmitTopLevelNodeFromCrossFile.ts
81918164
semantic error: Scope children mismatch:
@@ -8291,15 +8264,6 @@ tasks/coverage/typescript/tests/cases/compiler/declarationEmitWithComposite.ts
82918264
semantic error: Scope children mismatch:
82928265
after transform: ScopeId(0): [ScopeId(1)]
82938266
rebuilt : ScopeId(0): []
8294-
Reference symbol mismatch for "Foo":
8295-
after transform: SymbolId(0) "Foo"
8296-
rebuilt : <None>
8297-
Reference flags mismatch for "Foo":
8298-
after transform: ReferenceId(0): ReferenceFlags(Type)
8299-
rebuilt : ReferenceId(0): ReferenceFlags(Read | Type)
8300-
Unresolved references mismatch:
8301-
after transform: []
8302-
rebuilt : ["Foo"]
83038267

83048268
tasks/coverage/typescript/tests/cases/compiler/declarationEmitWithDefaultAsComputedName.ts
83058269
semantic error: Bindings mismatch:
@@ -13152,15 +13116,6 @@ rebuilt : ScopeId(0): []
1315213116
Scope children mismatch:
1315313117
after transform: ScopeId(0): [ScopeId(1)]
1315413118
rebuilt : ScopeId(0): []
13155-
Reference symbol mismatch for "m":
13156-
after transform: SymbolId(0) "m"
13157-
rebuilt : <None>
13158-
Reference flags mismatch for "m":
13159-
after transform: ReferenceId(0): ReferenceFlags(Type)
13160-
rebuilt : ReferenceId(0): ReferenceFlags(Read | Type)
13161-
Unresolved references mismatch:
13162-
after transform: []
13163-
rebuilt : ["m"]
1316413119

1316513120
tasks/coverage/typescript/tests/cases/compiler/exportDefaultImportedType.ts
1316613121
semantic error: Scope children mismatch:
@@ -20643,15 +20598,6 @@ tasks/coverage/typescript/tests/cases/compiler/moduleAugmentationOfAlias.ts
2064320598
semantic error: Scope children mismatch:
2064420599
after transform: ScopeId(0): [ScopeId(1)]
2064520600
rebuilt : ScopeId(0): []
20646-
Reference symbol mismatch for "I":
20647-
after transform: SymbolId(0) "I"
20648-
rebuilt : <None>
20649-
Reference flags mismatch for "I":
20650-
after transform: ReferenceId(0): ReferenceFlags(Type)
20651-
rebuilt : ReferenceId(0): ReferenceFlags(Read | Type)
20652-
Unresolved references mismatch:
20653-
after transform: []
20654-
rebuilt : ["I"]
2065520601

2065620602
tasks/coverage/typescript/tests/cases/compiler/moduleAugmentationsBundledOutput1.ts
2065720603
semantic error: Scope children mismatch:
@@ -28735,15 +28681,9 @@ rebuilt : ScopeId(0): []
2873528681
Scope children mismatch:
2873628682
after transform: ScopeId(0): [ScopeId(1), ScopeId(2), ScopeId(4), ScopeId(6), ScopeId(7), ScopeId(8), ScopeId(14), ScopeId(16), ScopeId(19)]
2873728683
rebuilt : ScopeId(0): []
28738-
Reference symbol mismatch for "spected":
28739-
after transform: SymbolId(0) "spected"
28740-
rebuilt : <None>
28741-
Reference flags mismatch for "spected":
28742-
after transform: ReferenceId(73): ReferenceFlags(Read)
28743-
rebuilt : ReferenceId(0): ReferenceFlags(Read | Type)
2874428684
Unresolved references mismatch:
2874528685
after transform: ["Array", "Partial", "ReadonlyArray"]
28746-
rebuilt : ["spected"]
28686+
rebuilt : []
2874728687

2874828688
tasks/coverage/typescript/tests/cases/compiler/specializationError.ts
2874928689
semantic error: Scope children mismatch:
@@ -31954,15 +31894,6 @@ tasks/coverage/typescript/tests/cases/compiler/uniqueSymbolPropertyDeclarationEm
3195431894
semantic error: Bindings mismatch:
3195531895
after transform: ScopeId(0): ["Op"]
3195631896
rebuilt : ScopeId(0): []
31957-
Reference symbol mismatch for "Op":
31958-
after transform: SymbolId(0) "Op"
31959-
rebuilt : <None>
31960-
Reference flags mismatch for "Op":
31961-
after transform: ReferenceId(0): ReferenceFlags(Read)
31962-
rebuilt : ReferenceId(0): ReferenceFlags(Read | Type)
31963-
Unresolved references mismatch:
31964-
after transform: []
31965-
rebuilt : ["Op"]
3196631897

3196731898
tasks/coverage/typescript/tests/cases/compiler/unknownLikeUnionObjectFlagsNotPropagated.ts
3196831899
semantic error: Scope children mismatch:

tasks/transform_conformance/snapshots/babel.snap.md

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1727,7 +1727,36 @@ after transform: SymbolId(3): [Span { start: 147, end: 154 }, Span { start: 225,
17271727
rebuilt : SymbolId(2): []
17281728

17291729
* exports/declared-types/input.ts
1730-
x Output mismatch
1730+
Bindings mismatch:
1731+
after transform: ScopeId(0): ["BB", "BB2", "C", "C2", "E", "M", "N", "f", "foo", "x"]
1732+
rebuilt : ScopeId(0): ["BB", "BB2", "C2", "foo"]
1733+
Scope children mismatch:
1734+
after transform: ScopeId(0): [ScopeId(1), ScopeId(2), ScopeId(3), ScopeId(4), ScopeId(5), ScopeId(6), ScopeId(7), ScopeId(8), ScopeId(9), ScopeId(10), ScopeId(11), ScopeId(12), ScopeId(13), ScopeId(14), ScopeId(15), ScopeId(16), ScopeId(17), ScopeId(18)]
1735+
rebuilt : ScopeId(0): [ScopeId(1), ScopeId(2), ScopeId(3), ScopeId(4), ScopeId(5)]
1736+
Bindings mismatch:
1737+
after transform: ScopeId(12): ["BB", "K"]
1738+
rebuilt : ScopeId(2): ["BB"]
1739+
Scope flags mismatch:
1740+
after transform: ScopeId(12): ScopeFlags(StrictMode)
1741+
rebuilt : ScopeId(2): ScopeFlags(StrictMode | Function)
1742+
Bindings mismatch:
1743+
after transform: ScopeId(13): ["BB", "L"]
1744+
rebuilt : ScopeId(3): ["BB"]
1745+
Scope flags mismatch:
1746+
after transform: ScopeId(13): ScopeFlags(StrictMode)
1747+
rebuilt : ScopeId(3): ScopeFlags(StrictMode | Function)
1748+
Scope flags mismatch:
1749+
after transform: ScopeId(16): ScopeFlags(StrictMode)
1750+
rebuilt : ScopeId(4): ScopeFlags(StrictMode | Function)
1751+
Symbol flags mismatch for "BB":
1752+
after transform: SymbolId(11): SymbolFlags(RegularEnum)
1753+
rebuilt : SymbolId(1): SymbolFlags(FunctionScopedVariable)
1754+
Symbol redeclarations mismatch for "BB":
1755+
after transform: SymbolId(11): [Span { start: 479, end: 481 }, Span { start: 495, end: 497 }]
1756+
rebuilt : SymbolId(1): []
1757+
Symbol flags mismatch for "BB2":
1758+
after transform: SymbolId(16): SymbolFlags(RegularEnum)
1759+
rebuilt : SymbolId(4): SymbolFlags(FunctionScopedVariable)
17311760

17321761
* exports/default-function/input.ts
17331762
Scope children mismatch:

0 commit comments

Comments
 (0)