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), }; }