Skip to content

Commit 8a95297

Browse files
Deeply propagate imported names
1 parent b77f06d commit 8a95297

1 file changed

Lines changed: 64 additions & 11 deletions

File tree

spec.emu

Lines changed: 64 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -869,9 +869,9 @@ contributors: Nicolò Ribaudo
869869
1. For each ModuleRequest Record _request_ of <del>_module_.[[RequestedModules]]</del><ins>_requestsToLoad_</ins>, do
870870
1. If AllImportAttributesSupported(_request_.[[Attributes]]) is *false*, then
871871
1. Let _error_ be ThrowCompletion(a newly created *SyntaxError* object).
872-
1. Perform ContinueModuleLoading(_state_, _error_, <ins>_request_.[[ImportedNames]]</ins>).
872+
1. Perform ContinueModuleLoading(_state_, _error_, <ins>ExcludeUnrequestedReexportedImportedNames(_request_.[[ImportedNames]], _importedNames_)</ins>).
873873
1. Else if _module_.[[LoadedModules]] contains a LoadedModuleRequest Record _record_ such that ModuleRequestsEqual(_record_, _request_) is *true*, then
874-
1. Perform InnerModuleLoading(_state_, _record_.[[Module]], <ins>_request_.[[ImportedNames]]</ins>).
874+
1. Perform InnerModuleLoading(_state_, _record_.[[Module]], <ins>ExcludeUnrequestedReexportedImportedNames(_request_.[[ImportedNames]], _importedNames_)</ins>).
875875
1. Else,
876876
1. Perform HostLoadImportedModule(_module_, _request_, _state_.[[HostDefined]], _state_).
877877
1. NOTE: HostLoadImportedModule will call FinishLoadingImportedModule, which re-enters the graph loading process through ContinueModuleLoading.
@@ -929,7 +929,7 @@ contributors: Nicolò Ribaudo
929929
<emu-alg>
930930
1. Assert: _module_.[[Status]] is one of ~unlinked~, ~linked~, ~evaluating-async~, or ~evaluated~.
931931
1. Let _stack_ be a new empty List.
932-
1. Let _result_ be Completion(InnerModuleLinking(_module_, _stack_, 0)).
932+
1. Let _result_ be Completion(InnerModuleLinking(_module_, _stack_, 0, <ins>_importedNames_</ins>)).
933933
1. If _result_ is an abrupt completion, then
934934
1. For each Cyclic Module Record _m_ of _stack_, do
935935
1. Assert: _m_.[[Status]] is ~linking~.
@@ -942,7 +942,7 @@ contributors: Nicolò Ribaudo
942942
1. <ins>For each ModuleRequest Record _request_ of _indirectRequests_, do</ins>
943943
1. <ins>Let _requiredModule_ be GetImportedModule(_module_, _request_).</ins>
944944
1. <ins>Assert: _requiredModule_.[[Status]] is one of ~unlinked~, ~linked~, ~evaluating-async~, or ~evaluated~.</ins>
945-
1. <ins>If _requiredModule_.[[Status]] is ~unlinked~, perform ? _requiredModule_.Link(_request_.[[ImportedNames]]).</ins>
945+
1. <ins>If _requiredModule_.[[Status]] is ~unlinked~, perform ? _requiredModule_.Link(ExcludeUnrequestedReexportedImportedNames(_request_.[[ImportedNames]], _importedNames_)).</ins>
946946
1. Return ~unused~.
947947
</emu-alg>
948948

@@ -952,6 +952,7 @@ contributors: Nicolò Ribaudo
952952
_module_: a Module Record,
953953
_stack_: a List of Cyclic Module Records,
954954
_index_: a non-negative integer,
955+
<ins>_parentImportedNames_: ~all~ or a List of Strings,</ins>
955956
): either a normal completion containing a non-negative integer or a throw completion
956957
</h1>
957958
<dl class="header">
@@ -974,7 +975,7 @@ contributors: Nicolò Ribaudo
974975
1. <del>For each ModuleRequest Record _request_ of _module_.[[RequestedModules]], do</del>
975976
1. <del>Let _requiredModule_ be GetImportedModule(_module_, _request_).</del>
976977
1. <ins>Let _linkingList_ be « ».</ins>
977-
1. <ins>Perform BuildLinkingList(_linkingList_, _module_, _module_.[[RequestedModules]], « »).</ins>
978+
1. <ins>Perform BuildLinkingList(_linkingList_, _module_, _module_.[[RequestedModules]], « », _parentImportedNames_).</ins>
978979
1. <ins>For each Module Record _requiredModule_ of _linkingList_, do</ins>
979980
1. Set _index_ to ? InnerModuleLinking(_requiredModule_, _stack_, _index_).
980981
1. If _requiredModule_ is a Cyclic Module Record, then
@@ -1001,10 +1002,11 @@ contributors: Nicolò Ribaudo
10011002
<h1>
10021003
<ins>
10031004
BuildLinkingList (
1004-
_linkingList_: a List of Module Records,
1005+
_linkingList_: a List of Records with fields [[Module]] (a Module Record) and [[ImportedNames]] (~all~ or a List of Strings),
10051006
_referrer_: a Cyclic Module Record,
10061007
_moduleRequests_: a List of ModuleRequest Records,
10071008
_previouslyImportedNames_: a List of Records with fields [[Module]] (a Cyclic Module Record) and [[ImportedNames]] (~all~ or a List of Strings),
1009+
_parentImportedNames_: ~all~ or a List of Strings,
10081010
): ~unused~
10091011
</ins>
10101012
</h1>
@@ -1013,18 +1015,20 @@ contributors: Nicolò Ribaudo
10131015
<emu-alg>
10141016
1. For each ModuleRequest Record _request_ of _moduleRequests_, do
10151017
1. Let _requiredModule_ be GetImportedModule(_referrer_, _request_).
1016-
1. If _linkingList_ does not contain _requiredModule_, then
1017-
1. Append _requiredModule_ to _linkingList_.
1018+
1. If _linkingList_ does not contain a Record whose [[Module]] field is _requiredModule_, then
1019+
1. Append the Record { [[Module]]: _requiredModule_, [[ImportedNames]]: ExcludeUnrequestedReexportedImportedNames(_request_.[[ImportedNames]], _parentImportedNames_) } to _linkingList_.
10181020
1. If _requiredModule_ is a Cyclic Module Record, then
10191021
1. Assert: _previouslyImportedNames_ does not contain a Record whose [[Module]] field is _requiredModule_.
10201022
1. Append the Record { [[Module]]: _requiredModule_, [[ImportedNames]]: « » } to _previouslyImportedNames_.
1023+
1. Else,
1024+
1. <span style="background:yellow">TODO: update imported names in linking list, or add a separate entry for the same module to preserve the right order</span>
10211025
1. If _requiredModule_ is a Cyclic Module Record, then
10221026
1. Assert: _previouslyImportedNames_ contains a Record whose [[Module]] field is _requiredModule_.
10231027
1. Let _previous_ be the Record in _previouslyImportedNames_ whose [[Module]] field is _requiredModule_.
1024-
1. Let _remainingImportedNames_ be ExcludeImportedNames(_request_.[[ImportedNames]], _previous_.[[ImportedNames]]).
1028+
1. Let _remainingImportedNames_ be ExcludeImportedNames(IntersectImportedNames(_request_.[[ImportedNames]], _parentImportedNames_), _previous_.[[ImportedNames]]).
10251029
1. Set _previous_.[[ImportedNames]] to MergeImportedNames(_request_.[[ImportedNames]], _previous_.[[ImportedNames]]).
10261030
1. Let _indirectRequests_ be GetOptionalIndirectExportsModuleRequests(_requiredModule_, _remainingImportedNames_).
1027-
1. Perform BuildLinkingList(_linkingList_, _requiredModule_, _indirectRequests_, _previouslyImportedNames_).
1031+
1. Perform BuildLinkingList(_linkingList_, _requiredModule_, _indirectRequests_, _previouslyImportedNames_, ExcludeUnrequestedReexportedImportedNames(_request_.[[ImportedNames]], _parentImportedNames_)).
10281032
1. Return ~unused~.
10291033
</emu-alg>
10301034
</emu-clause>
@@ -1454,7 +1458,7 @@ contributors: Nicolò Ribaudo
14541458
1. Else,
14551459
1. Append the LoadedModuleRequest Record { [[Specifier]]: _moduleRequest_.[[Specifier]], [[Attributes]]: _moduleRequest_.[[Attributes]], [[Module]]: _result_.[[Value]] } to _referrer_.[[LoadedModules]].
14561460
1. If _payload_ is a GraphLoadingState Record, then
1457-
1. Perform ContinueModuleLoading(_payload_, _result_, <ins>_moduleRequest_.[[ImportedNames]]</ins>).
1461+
1. Perform ContinueModuleLoading(_payload_, _result_, <ins>ExcludeUnrequestedReexportedImportedNames(_moduleRequest_.[[ImportedNames]], <span style="background-color: yellow">TODO: parent imported names</span>)</ins>).
14581462
1. Else,
14591463
1. Perform ContinueDynamicImport(_payload_, _result_, _moduleRequest_.[[Phase]]).
14601464
1. Return ~unused~.
@@ -1657,6 +1661,28 @@ contributors: Nicolò Ribaudo
16571661
</emu-alg>
16581662
</emu-clause>
16591663

1664+
<emu-clause id="sec-IntersectImportedNames" type="abstract operation">
1665+
<h1>
1666+
<ins>
1667+
IntersectImportedNames (
1668+
_a_: ~all~ or a List of Strings,
1669+
_b_: ~all~ or a List of Strings,
1670+
): ~all~ or a List of Strings
1671+
</ins>
1672+
</h1>
1673+
<dl class="header"></dl>
1674+
1675+
<emu-alg>
1676+
1. If _a_ is ~all~, return _b_.
1677+
1. If _b_ is ~all~, return _a_.
1678+
1. Assert: _a_ and _b_ are Lists of Strings.
1679+
1. Let _result_ be a new empty List.
1680+
1. For each String _name_ of _a_, do
1681+
1. If _b_ contains _name_, append _name_ to _result
1682+
1. Return _result_.
1683+
</emu-alg>
1684+
</emu-clause>
1685+
16601686
<emu-clause id="sec-ExcludeImportedNames" type="abstract operation">
16611687
<h1>
16621688
<ins>
@@ -1678,6 +1704,33 @@ contributors: Nicolò Ribaudo
16781704
1. Return a new List containing all the elements of _a_ that are not also elements of _b_.
16791705
</emu-alg>
16801706
</emu-clause>
1707+
1708+
<emu-clause id="sec-ExcludeUnrequestedReexportedImportedNames" type="abstract operation">
1709+
<h1>
1710+
<ins>
1711+
ExcludeUnrequestedReexportedImportedNames (
1712+
_importedNames_: ~all~ or a List of Strings,
1713+
_parentImportedNames_: ~all~ or a List of Strings,
1714+
): ~all~ or a List of Strings
1715+
</ins>
1716+
</h1>
1717+
<dl class="header">
1718+
<dt>description</dt>
1719+
<dd></dd>
1720+
</dl>
1721+
1722+
<emu-alg>
1723+
1. If _importedNames_ is ~all~, then
1724+
1. <span style="background-color: yellow;">TODO: Handle the `export * from` case.</span>
1725+
1. Return ~all~.
1726+
1. Let _result_ be a new empty List.
1727+
1. For each String _name_ of _importedNames_, do
1728+
1. If _name_ is imported through an |ImportDeclaration|, append _name_ to _result_.
1729+
1. Assert: _name_ is imported through an |ExportDeclaration| with an |ExportFromClause|.
1730+
1. If _parentImportedNames_ is ~all~ or _parentImportedNames_ contains _name_, append _name_ to _result_.
1731+
1. Return _result_.
1732+
</emu-alg>
1733+
</emu-clause>
16811734
</emu-clause>
16821735
</emu-clause>
16831736

0 commit comments

Comments
 (0)