diff --git a/inputfiles/patches/html-autocomplete.kdl b/inputfiles/patches/html-autocomplete.kdl
index 986541bcb..f6d634849 100644
--- a/inputfiles/patches/html-autocomplete.kdl
+++ b/inputfiles/patches/html-autocomplete.kdl
@@ -74,9 +74,9 @@ enum AutoFillCredentialField {
}
typedef OptionalPrefixToken overrideType=#"`${T} ` | """# {
- typeParameters T extends=string
+ typeParameter T extends=string
}
typedef OptionalPostfixToken overrideType=#"` ${T}` | """# {
- typeParameters T extends=string
+ typeParameter T extends=string
}
diff --git a/inputfiles/patches/html.kdl b/inputfiles/patches/html.kdl
index dd2e5676d..6420bce45 100644
--- a/inputfiles/patches/html.kdl
+++ b/inputfiles/patches/html.kdl
@@ -60,7 +60,7 @@ interface HTMLProgressElement {
}
}
-interface-mixin MessageEventTarget overrideThis=T typeParameters=T
+interface-mixin MessageEventTarget overrideThis=T typeParameter=T
interface-mixin WindowEventHandlers {
property onunload deprecated="The unload event is not reliable, consider visibilitychange or pagehide events."
diff --git a/inputfiles/patches/indexeddb.kdl b/inputfiles/patches/indexeddb.kdl
index 02a0fba2d..c8ce251fd 100644
--- a/inputfiles/patches/indexeddb.kdl
+++ b/inputfiles/patches/indexeddb.kdl
@@ -1,5 +1,5 @@
interface IDBRequest {
- typeParameters T default=any
+ typeParameter T default=any
property source {
type nullable=#false
}
diff --git a/inputfiles/patches/readable-stream.kdl b/inputfiles/patches/readable-stream.kdl
index e56076039..f475278c7 100644
--- a/inputfiles/patches/readable-stream.kdl
+++ b/inputfiles/patches/readable-stream.kdl
@@ -1,15 +1,15 @@
-dictionary ReadableStreamReadDoneResult typeParameters=T {
+dictionary ReadableStreamReadDoneResult typeParameter=T {
member done required=#true overrideType="true"
member value required=#true overrideType="T | undefined"
}
-dictionary ReadableStreamReadValueResult typeParameters=T {
+dictionary ReadableStreamReadValueResult typeParameter=T {
member done required=#true overrideType="false"
member value required=#true overrideType="T"
}
dictionary UnderlyingSource {
- typeParameters R default=any
+ typeParameter R default=any
member start overrideType="UnderlyingSourceStartCallback"
member pull overrideType="UnderlyingSourcePullCallback"
}
diff --git a/inputfiles/patches/streams.kdl b/inputfiles/patches/streams.kdl
index 3fd8228e7..b1cc50f1c 100644
--- a/inputfiles/patches/streams.kdl
+++ b/inputfiles/patches/streams.kdl
@@ -1,7 +1,7 @@
// https://streams.spec.whatwg.org/#dictdef-underlyingsource
dictionary UnderlyingDefaultSource {
- typeParameters R default=any
+ typeParameter R default=any
member type type=undefined
member start overrideType="(controller: ReadableStreamDefaultController) => any"
member pull overrideType="(controller: ReadableStreamDefaultController) => void | PromiseLike"
diff --git a/src/build/patches.ts b/src/build/patches.ts
index ac72d1742..f4c381204 100644
--- a/src/build/patches.ts
+++ b/src/build/patches.ts
@@ -91,25 +91,27 @@ function handleTyped(
return types[0];
}
-function handleTypeParameters(value: Value | Node) {
- if (!value) {
- return {};
- }
- if (typeof value === "string") {
- return { typeParameters: [{ name: value }] };
- }
- const node = value as Node;
+function handleSingleTypeParameterNode(node: Node) {
return {
- typeParameters: [
- {
- name: string(node.values[0]),
- ...optionalMember("default", "string", node.properties?.default),
- ...optionalMember("extends", "string", node.properties?.extends),
- },
- ],
+ name: string(node.values[0]),
+ ...optionalMember("default", "string", node.properties?.default),
+ ...optionalMember("extends", "string", node.properties?.extends),
};
}
+function handleTypeParameter(node: Node[], property?: Value) {
+ let typeParameters: any;
+ if (typeof property === "string") {
+ typeParameters = [{ name: property }];
+ } else {
+ typeParameters = node.map(handleSingleTypeParameterNode);
+ }
+ if (!typeParameters || typeParameters.length === 0) {
+ return {};
+ }
+ return { typeParameters };
+}
+
function optionalNestedMember(prop: string, object: object, output: T) {
return Object.entries(object).length ? { [prop]: output } : {};
}
@@ -207,7 +209,7 @@ function handleMixinAndInterfaces(
const property: Record> = {};
let method: Record> = {};
let constructor: DeepPartial | undefined;
- let typeParameters = {};
+ const typeParameter = [];
for (const child of node.children) {
switch (child.name) {
@@ -232,8 +234,8 @@ function handleMixinAndInterfaces(
constructor = merge(constructor, c);
break;
}
- case "typeParameters": {
- typeParameters = handleTypeParameters(child);
+ case "typeParameter": {
+ typeParameter.push(child);
break;
}
default:
@@ -242,7 +244,6 @@ function handleMixinAndInterfaces(
}
const interfaceObject = type === "interface" && {
- ...typeParameters,
...(constructor ? { constructor } : {}),
...optionalMember("exposed", "string", node.properties?.exposed),
...optionalMember("deprecated", "string", node.properties?.deprecated),
@@ -270,7 +271,7 @@ function handleMixinAndInterfaces(
"string",
node.properties?.replaceReference,
),
- ...handleTypeParameters(node.properties?.typeParameters),
+ ...handleTypeParameter(typeParameter, node.properties?.typeParameter),
...interfaceObject,
} as DeepPartial;
}
@@ -396,7 +397,7 @@ function handleMethodAndConstructor(
function handleDictionary(child: Node): DeepPartial {
const name = string(child.values[0]);
const member: Record> = {};
- let typeParameters = {};
+ const typeParameter = [];
for (const c of child.children) {
switch (c.name) {
@@ -405,8 +406,8 @@ function handleDictionary(child: Node): DeepPartial {
member[memberName] = handleMember(c);
break;
}
- case "typeParameters": {
- typeParameters = handleTypeParameters(c);
+ case "typeParameter": {
+ typeParameter.push(c);
break;
}
default:
@@ -417,8 +418,7 @@ function handleDictionary(child: Node): DeepPartial {
return {
name,
members: { member },
- ...typeParameters,
- ...handleTypeParameters(child.properties?.typeParameters),
+ ...handleTypeParameter(typeParameter, child.properties?.typeParameter),
...optionalMember(
"legacyNamespace",
"string",
@@ -450,14 +450,14 @@ function handleMember(c: Node): DeepPartial {
*/
function handleTypedef(node: Node): DeepPartial {
const typeNodes: Node[] = [];
- let typeParameters = {};
+ const typeParameter = [];
for (const child of node.children) {
switch (child.name) {
case "type":
typeNodes.push(child);
break;
- case "typeParameters": {
- typeParameters = handleTypeParameters(child);
+ case "typeParameter": {
+ typeParameter.push(child);
break;
}
default:
@@ -475,7 +475,7 @@ function handleTypedef(node: Node): DeepPartial {
node.properties?.legacyNamespace,
),
...optionalMember("overrideType", "string", node.properties?.overrideType),
- ...typeParameters,
+ ...handleTypeParameter(typeParameter, node.properties?.typeParameter),
};
}