1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 11:28:12 +00:00

LibJS: Only check for duplicate exports if they have a name

Together with removing an incorrect VERIFY this allows multiple star
imports in a single module.
This commit is contained in:
davidot 2022-09-01 22:55:02 +02:00 committed by Linus Groh
parent 3b56043612
commit 462c6df24b
4 changed files with 9 additions and 3 deletions

View file

@ -4498,7 +4498,7 @@ bool ExportStatement::has_export(FlyString const& export_name) const
{ {
return any_of(m_entries.begin(), m_entries.end(), [&](auto& entry) { return any_of(m_entries.begin(), m_entries.end(), [&](auto& entry) {
// Make sure that empty exported names does not overlap with anything // Make sure that empty exported names does not overlap with anything
if (entry.kind == ExportEntry::Kind::EmptyNamedExport) if (entry.kind != ExportEntry::Kind::NamedExport)
return false; return false;
return entry.export_name == export_name; return entry.export_name == export_name;
}); });

View file

@ -202,8 +202,6 @@ Result<NonnullRefPtr<SourceTextModule>, Vector<Parser::Error>> SourceTextModule:
// 2. If ie.[[ImportName]] is namespace-object, then // 2. If ie.[[ImportName]] is namespace-object, then
if (import_entry.is_namespace) { if (import_entry.is_namespace) {
// a. NOTE: This is a re-export of an imported module namespace object. // a. NOTE: This is a re-export of an imported module namespace object.
VERIFY(export_entry.is_module_request() && export_entry.kind != ExportStatement::ExportEntry::Kind::NamedExport);
// b. Append ee to localExportEntries. // b. Append ee to localExportEntries.
local_export_entries.empend(export_entry); local_export_entries.empend(export_entry);
} }

View file

@ -186,6 +186,10 @@ describe("in- and exports", () => {
test("namespace has expected ordering", () => { test("namespace has expected ordering", () => {
expectModulePassed("./namespace-order.mjs"); expectModulePassed("./namespace-order.mjs");
}); });
test("can have multiple star imports even from the same file", () => {
expectModulePassed("./multiple-star-imports.mjs");
});
}); });
describe("loops", () => { describe("loops", () => {

View file

@ -0,0 +1,4 @@
import * as ns1 from "./default-and-star-export.mjs";
import * as ns2 from "./default-and-star-export.mjs";
export const passed = ns1 === ns2;