Skip to content

Commit 2cd8ad3

Browse files
committed
feat(build/emitter): follow nullable flag for overrideType
Closes #18
1 parent 4878ace commit 2cd8ad3

File tree

3 files changed

+27
-38
lines changed

3 files changed

+27
-38
lines changed

inputfiles/addedTypes.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -541,7 +541,7 @@
541541
"default": "Element"
542542
}
543543
],
544-
"overrideType": "E | null"
544+
"overrideType": "E"
545545
}
546546
}
547547
},
@@ -1056,7 +1056,7 @@
10561056
"properties": {
10571057
"property": {
10581058
"labels": {
1059-
"overrideType": "NodeListOf<HTMLLabelElement> | null"
1059+
"overrideType": "NodeListOf<HTMLLabelElement>"
10601060
}
10611061
}
10621062
},

inputfiles/overridingTypes.json

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"param": [
1313
{
1414
"name": "keyframes",
15-
"overrideType": "Keyframe[] | PropertyIndexedKeyframes | null"
15+
"overrideType": "Keyframe[] | PropertyIndexedKeyframes"
1616
}
1717
]
1818
}
@@ -203,7 +203,7 @@
203203
"properties": {
204204
"property": {
205205
"body": {
206-
"overrideType": "ReadableStream<Uint8Array> | null"
206+
"overrideType": "ReadableStream<Uint8Array>"
207207
}
208208
}
209209
}
@@ -401,7 +401,7 @@
401401
"param": [
402402
{
403403
"name": "callback",
404-
"overrideType": "((this: MediaQueryList, ev: MediaQueryListEvent) => any) | null"
404+
"overrideType": "(this: MediaQueryList, ev: MediaQueryListEvent) => any"
405405
}
406406
]
407407
}
@@ -414,7 +414,7 @@
414414
"param": [
415415
{
416416
"name": "callback",
417-
"overrideType": "((this: MediaQueryList, ev: MediaQueryListEvent) => any) | null"
417+
"overrideType": "(this: MediaQueryList, ev: MediaQueryListEvent) => any"
418418
}
419419
]
420420
}
@@ -611,7 +611,7 @@
611611
"property": {
612612
"defaultView": {
613613
"name": "defaultView",
614-
"overrideType": "(WindowProxy & typeof globalThis) | null"
614+
"overrideType": "WindowProxy & typeof globalThis"
615615
},
616616
"documentElement": {
617617
"name": "documentElement",
@@ -744,25 +744,25 @@
744744
"properties": {
745745
"property": {
746746
"parentNode": {
747-
"overrideType": "(Node & ParentNode) | null"
747+
"overrideType": "Node & ParentNode"
748748
},
749749
"parentElement": {
750-
"overrideType": "HTMLElement | null"
750+
"overrideType": "HTMLElement"
751751
},
752752
"childNodes": {
753753
"overrideType": "NodeListOf<ChildNode & Node>"
754754
},
755755
"firstChild": {
756-
"overrideType": "(ChildNode & Node) | null"
756+
"overrideType": "ChildNode & Node"
757757
},
758758
"lastChild": {
759-
"overrideType": "(ChildNode & Node) | null"
759+
"overrideType": "ChildNode & Node"
760760
},
761761
"nextSibling": {
762-
"overrideType": "(ChildNode & Node) | null"
762+
"overrideType": "ChildNode & Node"
763763
},
764764
"previousSibling": {
765-
"overrideType": "(ChildNode & Node) | null"
765+
"overrideType": "ChildNode & Node"
766766
}
767767
}
768768
}
@@ -1550,7 +1550,7 @@
15501550
},
15511551
"valueAsDate": {
15521552
"name": "valueAsDate",
1553-
"overrideType": "Date | null"
1553+
"overrideType": "Date"
15541554
}
15551555
}
15561556
},
@@ -1637,7 +1637,7 @@
16371637
"property": {
16381638
"form": {
16391639
"name": "form",
1640-
"overrideType": "HTMLFormElement | null"
1640+
"overrideType": "HTMLFormElement"
16411641
}
16421642
}
16431643
}
@@ -2084,20 +2084,12 @@
20842084
"param": [
20852085
{
20862086
"name": "keyframes",
2087-
"overrideType": "Keyframe[] | PropertyIndexedKeyframes | null"
2087+
"overrideType": "Keyframe[] | PropertyIndexedKeyframes"
20882088
}
20892089
]
20902090
}
20912091
}
20922092
},
2093-
"properties": {
2094-
"property": {
2095-
"target": {
2096-
"name": "target",
2097-
"overrideType": "Element | null"
2098-
}
2099-
}
2100-
},
21012093
"methods": {
21022094
"method": {
21032095
"getKeyframes": {
@@ -2113,7 +2105,7 @@
21132105
"param": [
21142106
{
21152107
"name": "keyframes",
2116-
"overrideType": "Keyframe[] | PropertyIndexedKeyframes | null"
2108+
"overrideType": "Keyframe[] | PropertyIndexedKeyframes"
21172109
}
21182110
]
21192111
}

src/build/emitter.ts

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -258,7 +258,9 @@ export function emitWebIdl(webidl: Browser.WebIdl, flavor: Flavor, iterator: boo
258258

259259
/// Get typescript type using object dom type, object name, and it's associated interface name
260260
function convertDomTypeToTsType(obj: Browser.Typed): string {
261-
if (obj.overrideType) return obj.overrideType!;
261+
if (obj.overrideType) {
262+
return obj.nullable ? makeNullable(obj.overrideType) : obj.overrideType;
263+
}
262264
if (!obj.type) throw new Error("Missing type " + JSON.stringify(obj));
263265
const type = convertDomTypeToTsTypeWorker(obj);
264266
return obj.nullable ? makeNullable(type) : type;
@@ -340,11 +342,11 @@ export function emitWebIdl(webidl: Browser.WebIdl, flavor: Flavor, iterator: boo
340342
switch (originalType) {
341343
case "any": return "any";
342344
case "void": return "void";
343-
default:
344-
if (originalType.includes("| null")) return originalType;
345-
else if (originalType.includes("=>")) return "(" + originalType + ") | null";
346-
else return originalType + " | null";
347345
}
346+
if (originalType.includes("=>") || originalType.includes("&")) {
347+
return "(" + originalType + ") | null";
348+
}
349+
return originalType + " | null";
348350
}
349351

350352
function nameWithForwardedTypes(i: Browser.Interface) {
@@ -595,10 +597,7 @@ export function emitWebIdl(webidl: Browser.WebIdl, flavor: Flavor, iterator: boo
595597
}
596598
else {
597599
let pType: string;
598-
if (p.overrideType) {
599-
pType = p.overrideType!;
600-
}
601-
else if (isEventHandler(p)) {
600+
if (!p.overrideType && isEventHandler(p)) {
602601
// Sometimes event handlers with the same name may actually handle different
603602
// events in different interfaces. For example, "onerror" handles "ErrorEvent"
604603
// normally, but in "SVGSVGElement" it handles "SVGError" event instead.
@@ -611,12 +610,11 @@ export function emitWebIdl(webidl: Browser.WebIdl, flavor: Flavor, iterator: boo
611610
else {
612611
pType = convertDomTypeToTsType(p);
613612
}
614-
let optionalModifier = (!p.optional || prefix) ? "" : "?";
615-
pType = p.nullable ? makeNullable(pType) : pType;
616613
if (p.optional && prefix) {
617614
pType += " | undefined";
618615
}
619616
const readOnlyModifier = (p.readonly && prefix === "") ? "readonly " : "";
617+
const optionalModifier = (!p.optional || prefix) ? "" : "?";
620618
printer.printLine(`${prefix}${readOnlyModifier}${p.name}${optionalModifier}: ${pType};`);
621619
}
622620

@@ -682,8 +680,7 @@ export function emitWebIdl(webidl: Browser.WebIdl, flavor: Flavor, iterator: boo
682680
function emitSignature(s: Browser.Signature, prefix: string | undefined, name: string | undefined, printLine: (s: string) => void, shouldResolvePromise?: boolean) {
683681
const paramsString = s.param ? paramsToString(s.param) : "";
684682
const resolved = shouldResolvePromise ? resolvePromise(s) : s;
685-
let returnType = convertDomTypeToTsReturnType(resolved);
686-
returnType = s.nullable ? makeNullable(returnType) : returnType;
683+
const returnType = convertDomTypeToTsReturnType(resolved);
687684
emitComments(s, printLine);
688685
printLine(`${prefix || ""}${getNameWithTypeParameter(s.typeParameters, name || "")}(${paramsString}): ${returnType};`);
689686
}

0 commit comments

Comments
 (0)