From 3f92bdbbdc528dcf69bcb012c1ba316303f0a5b4 Mon Sep 17 00:00:00 2001 From: Kagami Sascha Rosylight Date: Sat, 14 Aug 2021 22:12:23 +0200 Subject: [PATCH 1/2] Track typedefs and generics when resolving promises --- baselines/dom.generated.d.ts | 2 +- src/build/emitter.ts | 18 +++++++++++++++--- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/baselines/dom.generated.d.ts b/baselines/dom.generated.d.ts index 023a0e39a..38d1d6236 100644 --- a/baselines/dom.generated.d.ts +++ b/baselines/dom.generated.d.ts @@ -3456,7 +3456,7 @@ interface ClipboardItem { declare var ClipboardItem: { prototype: ClipboardItem; - new(items: Record, options?: ClipboardItemOptions): ClipboardItem; + new(items: Record>, options?: ClipboardItemOptions): ClipboardItem; }; /** A CloseEvent is sent to clients using WebSockets when the connection is closed. This is delivered to the listener indicated by the WebSocket object's onclose attribute. */ diff --git a/src/build/emitter.ts b/src/build/emitter.ts index 84552730c..8859397b8 100644 --- a/src/build/emitter.ts +++ b/src/build/emitter.ts @@ -153,6 +153,7 @@ export function emitWebIdl( ); const allInterfacesMap = toNameMap(allInterfaces); + const allTypedefsMap = toNameMap(webidl.typedefs?.typedef ?? []); const allLegacyWindowAliases = allInterfaces.flatMap( (i) => i.legacyWindowAlias ); @@ -648,11 +649,22 @@ export function emitWebIdl( } function resolvePromise(t: T): T { - if (t.type !== "Promise") { + const typedef = + typeof t.type === "string" ? allTypedefsMap[t.type] : undefined; + const typeOwner = typedef ?? t; + if (typeOwner.type !== "Promise") { + if (t.subtype) { + return { + ...t, + subtype: Array.isArray(t.subtype) + ? t.subtype.map(resolvePromise) + : resolvePromise(t.subtype), + }; + } return t; } - const type = [t.subtype!].flat(); - type.push({ ...t, type: "PromiseLike" }); + const type = [typeOwner.subtype!].flat(); + type.push({ ...typeOwner, type: "PromiseLike" }); return { ...t, subtype: undefined, type }; } From 3de07ee389dd7bf5779d3f19c75745cec9b45a5e Mon Sep 17 00:00:00 2001 From: Kagami Sascha Rosylight Date: Sat, 14 Aug 2021 22:51:29 +0200 Subject: [PATCH 2/2] dedupe typedefs map --- src/build/emitter.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/build/emitter.ts b/src/build/emitter.ts index 8859397b8..a75116aea 100644 --- a/src/build/emitter.ts +++ b/src/build/emitter.ts @@ -153,7 +153,6 @@ export function emitWebIdl( ); const allInterfacesMap = toNameMap(allInterfaces); - const allTypedefsMap = toNameMap(webidl.typedefs?.typedef ?? []); const allLegacyWindowAliases = allInterfaces.flatMap( (i) => i.legacyWindowAlias ); @@ -161,7 +160,7 @@ export function emitWebIdl( const allEnumsMap = webidl.enums ? webidl.enums.enum : {}; const allCallbackFunctionsMap = webidl.callbackFunctions?.callbackFunction ?? {}; - const allTypeDefsMap = new Set(webidl.typedefs?.typedef.map((td) => td.name)); + const allTypedefsMap = toNameMap(webidl.typedefs?.typedef ?? []); /// Tag name to element name map const tagNameToEleName = getTagNameToElementNameMap(); @@ -416,7 +415,7 @@ export function emitWebIdl( ) return objDomType; // Name of a type alias. Just return itself - if (allTypeDefsMap.has(objDomType)) return objDomType; + if (allTypedefsMap[objDomType]) return objDomType; throw new Error("Unknown DOM type: " + objDomType); }