- From: Domenic Denicola <notifications@github.com>
- Date: Thu, 04 Apr 2019 08:59:26 -0700
- To: heycam/webidl <webidl@noreply.github.com>
- Cc: Subscribed <subscribed@noreply.github.com>
- Message-ID: <heycam/webidl/pull/675/review/222847403@github.com>
domenic approved this pull request.
Overall LGTM. I think we should add an "under construction" signage, file issues for the other follow-ups @littledan mentioned, and merge. Really nice work.
We can then iterate on those issues and also attempt to use modules in the KV storage spec. I don't think we'll want to merge into KV storage quite yet because of the remaining issues in https://github.com/WICG/kv-storage/issues/46, but just writing the spec patch would give us a good idea of how these things would be used. For example it'd let us see "set a module attribute" in action.
> @@ -801,11 +807,32 @@ expected that an object that implements a particular IDL interface
provides ways to inspect and modify the object's state and to
invoke the behavior described by the interface.
+[=Interfaces=] and [=partial interfaces=] have an <dfn for="interface,partial interface">enclosing
+module</dfn>, which is a [=module=] or null.
+Unless otherwise specified, it is null.
+
+<div algorithm>
+ [=Interfaces=] and [=partial interfaces=] have a
+ <dfn for="interface,partial interface">scoped identifier</dfn>,
+ which uniquely identifies an [=interface=].
Why is this a separate concept from qualfiied name? The difference seems to be that for modules we allow two same-named interfaces in different modules, but we don't allow two same-named interfaces in [LegacyNamespace]. Is that mismatch desirable?
> +<h3 id="idl-modules">Modules</h3>
+
+A <dfn id="dfn-module" export>module</dfn> is a structure that exposes a collection of
+[=interfaces=], [=read only=] [=regular attributes=], and [=regular operations=] as a logical unit.
+A [=module=] has a <dfn for=module>specifier</dfn> that uniquely identifies it.
+
+<div algorithm>
+A module has a [=list=] of
+<dfn id="dfn-module-member" export lt="module member" for=module>module members</dfn> which are
+[=interfaces=], [=read only=] [=regular attributes=], and [=regular operations=].
+
+The [=module/module members=] of a [=module=] |module| are given by the following steps:
+
+ 1. Let |result| be « ».
+ 1. Let |specifier| be |module|'s [=module/specifier=].
+ 1. For each [=module declaration=] |declaration| whose [=module declaration/specifier=] is
How could there be more than one?
> + 1. Return |result|.
+
+Note: The order that members appear in this list has significance for property enumeration in the
+<a href="#es-modules">ECMAScript binding</a>.
+
+Issue: Exclude [=partial interfaces=]?
+</div>
+
+For all [=modules=] |module|, all [=interfaces=] and [=partial interfaces=] that are in |module|'s
+[=module/module members=] have their [=interface/enclosing module=] set to |module|.
+
+<div algorithm>
+ The <dfn for=module>url</dfn> of a [=module=] |module| is given by the following steps:
+
+ 1. Let |specifier| be |module|'s [=module/specifier=].
+ 1. Return the [=concatenation=] of « "<code>import:std:</code>", |specifier| ».
Currently I am leaning toward it just being `std:` for built-in modules, but I am not certain until I write proper spec text for the import maps resolver. I would keep it as `std:` for now though.
> +</div>
+
+Note that like [=namespaces=], modules do not create types.
+
+Rather than defining behavior when accessed, the [=attributes=] of a [=module=] act as a simple
+storage location. The relevant language binding defines the steps to "set a module attribute" to
+an IDL value of the type of the [=attribute=].
+
+Note: See the ECMAScript binding's definition of [=set a module attribute=].
+
+Each module may have <dfn for=module>evaluation steps</dfn> which are executed when the module is
+first imported.
+These steps have access to a <dfn>this module</dfn> value, which is the [=module=] being
+evaluated, and a [=Realm=].
+They may throw an [=exception=], which prevents the module from being accessed.
+The [=module/evaluation steps=] for a module |m| must invoke the "set a module attribute"
I'm not a big fan of this "quotes surrounding a term" in place of cross-links, but I understand that the alternative is defining a language-agnostic term and a ES-specific term which is also annoying. I'm not sure what to do here.
> + <b>this module</b> to |initial|.
+ </blockquote>
+
+ An ECMAScript implementation would then expose a <code class="idl">"std:temporal"</code>
+ module which includes an [=interface object=] for the interface and a function for the operation:
+
+ <pre highlight="js">
+ import * from "std:temporal" as temporal;
+ Object.keys(temporal); // Evaluates to ["Timezone", "getCurrentTimezone", "currentTimezone"]
+ typeof temporal.Timezone; // Evaluates to "function"
+ typeof temporal.getCurrentTimezone; // Evaluates to "function"
+ typeof temporal.initialTimezone; // Evaluates to "object"
+ </pre>
+</div>
+
+### Syntax ### {#idl-modules-syntax}
I note that nothing else has syntax subsections, although I do agree it's a nice thematic break here. Not sure what to do. (Although it doesn't matter much.)
> + 1. Append the [=identifier=] of |member| to |exports|.
+ 1. Let |moduleRecord| be [=!=] [=CreateSyntheticModule=](|exports|, the following steps,
+ |realm|, undefined), with the following steps:
+ 1. [=list/For each=] |member| of |module|'s [=module/module members|members=]:
+ 1. Let |id| be |member|'s [=identifier=].
+ 1. If |member| is an [=interface=]:
+ 1. Let |interfaceObject| be the result of [=create an interface object|creating
+ an interface object=] for |member| with |id| in |realm|.
+ 1. Perform [=!=] [=SetSyntheticModuleExport=](|moduleRecord|, |id|,
+ |interfaceObject|).
+ 1. Otherwise, if |member| is an [=operation=]:
+ 1. Let |method| be the result of [=creating an operation function=] given
+ |member|, |module|, and |realm|.
+ 1. Perform [=!=] [=SetSyntheticModuleExport=](|moduleRecord|, |id|, |method|).
+ 1. Otherwise:
+ 1. Assert: |member| is an [=attribute=] or a [=partial interface=].
Seeing this here makes me think that yes, we should exclude partial interfaces. (Which is an inline issue above.)
--
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/heycam/webidl/pull/675#pullrequestreview-222847403
Received on Thursday, 4 April 2019 15:59:52 UTC