fix(isolated-declarations): bindings referenced in TSModuleDeclaration are removed incorrectly (#5680)

close: #5667
This commit is contained in:
Dunqing 2024-09-10 16:22:07 +00:00
parent afc4548ef4
commit 6e8409a020
4 changed files with 34 additions and 16 deletions

View file

@ -146,7 +146,10 @@ impl<'a> IsolatedDeclarations<'a> {
variable_transformed_indexes.push_back(FxHashSet::default());
}
Declaration::TSModuleDeclaration(decl) => {
if decl.kind.is_global() {
// declare global { ... } or declare module "foo" { ... }
// We need to emit it anyway
if decl.kind.is_global() || decl.id.is_string_literal() {
// We need to visit the module declaration to collect all references
self.scope.visit_ts_module_declaration(decl);
transformed_indexes.insert(new_stmts.len());
}
@ -293,11 +296,6 @@ impl<'a> IsolatedDeclarations<'a> {
new_ast_stmts.push(Statement::ImportDeclaration(decl));
}
}
Statement::TSModuleDeclaration(decl) => {
if decl.kind.is_global() || decl.id.is_string_literal() {
new_ast_stmts.push(Statement::TSModuleDeclaration(decl));
}
}
_ => {}
}
}

View file

@ -33,6 +33,7 @@ impl<'a> Scope<'a> {
}
/// Linear tree of declaration scopes.
#[derive(Debug)]
pub struct ScopeTree<'a> {
levels: Vec<'a, Scope<'a>>,
}

View file

@ -1,21 +1,31 @@
import 'foo';
declare module 'foo' {
interface Foo {}
const foo = 42;
import "foo";
declare module "foo" {
interface Foo {}
const foo = 42;
}
declare global {
interface Bar {}
const bar = 42 ;
interface Bar {}
const bar = 42;
}
import { type X } from "./x";
type Y = 1;
declare module "foo" {
interface Foo {
x: X;
y: Y;
}
}
// should not be emitted
module baz {
interface Baz {}
const baz = 42;
interface Baz {}
const baz = 42;
}
declare module x {
interface Qux {}
const qux = 42;
interface Qux {}
const qux = 42;
}

View file

@ -13,3 +13,12 @@ declare global {
interface Bar {}
const bar = 42;
}
import { type X } from "./x";
type Y = 1;
declare module "foo" {
interface Foo {
x: X;
y: Y;
}
}
export {};