mirror of
https://github.com/danbulant/oxc
synced 2026-05-19 12:19:15 +00:00
fix(semantic): non-exported namespace member symbols flagged as exported (#4493)
> Part of #4445 Fixes a bug where non-exported functions and variables inside of exported TS namespaces were being flagged with `SymbolFlags::Export` ```ts export namespace Foo { // incorrectly flagged as exported function foo() { } } ```
This commit is contained in:
parent
f3aedf6501
commit
2e01a45b2b
2 changed files with 33 additions and 0 deletions
|
|
@ -1759,6 +1759,7 @@ impl<'a> SemanticBuilder<'a> {
|
|||
.get_bindings(self.current_scope_id)
|
||||
.get(module_declaration.id.name().as_str());
|
||||
self.namespace_stack.push(*symbol_id.unwrap());
|
||||
self.current_symbol_flags -= SymbolFlags::Export;
|
||||
}
|
||||
AstKind::TSTypeAliasDeclaration(type_alias_declaration) => {
|
||||
type_alias_declaration.bind(self);
|
||||
|
|
|
|||
|
|
@ -186,6 +186,38 @@ fn test_exports_in_namespace() {
|
|||
test.has_some_symbol("bar").is_exported().test();
|
||||
let semantic = test.build();
|
||||
assert!(!semantic.module_record().exported_bindings.contains_key("bar"));
|
||||
|
||||
// namespace exported, member is not
|
||||
let sources =
|
||||
["export namespace N { function foo() {} } ", "export namespace N { const foo = 1 } "];
|
||||
for src in sources {
|
||||
let test = SemanticTester::ts(src);
|
||||
test.has_some_symbol("N").contains_flags(SymbolFlags::NameSpaceModule).is_exported().test();
|
||||
test.has_some_symbol("foo").is_not_exported().test();
|
||||
}
|
||||
|
||||
// namespace and member are both exported
|
||||
let sources = [
|
||||
"export namespace N { export function foo() {} } ",
|
||||
"export namespace N { export const foo = 1 } ",
|
||||
];
|
||||
for src in sources {
|
||||
let test = SemanticTester::ts(src);
|
||||
test.has_some_symbol("N").contains_flags(SymbolFlags::NameSpaceModule).is_exported().test();
|
||||
test.has_some_symbol("foo").is_exported().test();
|
||||
}
|
||||
|
||||
// namespace is not exported, but member is
|
||||
let sources =
|
||||
["namespace N { export function foo() {} } ", "namespace N { export const foo = 1 } "];
|
||||
for src in sources {
|
||||
let test = SemanticTester::ts(src);
|
||||
test.has_some_symbol("N")
|
||||
.contains_flags(SymbolFlags::NameSpaceModule)
|
||||
.is_not_exported()
|
||||
.test();
|
||||
test.has_some_symbol("foo").is_exported().test();
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
|
|||
Loading…
Reference in a new issue