From f158bf6f883691ae924219764d5193870c2e3312 Mon Sep 17 00:00:00 2001 From: Kagami Sascha Rosylight Date: Fri, 13 Sep 2019 16:14:21 +0900 Subject: [PATCH 1/2] Add explicit toString() --- baselines/dom.generated.d.ts | 6 +- baselines/webworker.generated.d.ts | 3 +- package-lock.json | 209 ++++++++++++++++++++++++++++- package.json | 1 + src/emitter.ts | 15 ++- src/widlprocess.ts | 1 + 6 files changed, 229 insertions(+), 6 deletions(-) diff --git a/baselines/dom.generated.d.ts b/baselines/dom.generated.d.ts index e4abe0612..4e4fb28c0 100644 --- a/baselines/dom.generated.d.ts +++ b/baselines/dom.generated.d.ts @@ -4146,6 +4146,7 @@ interface DOMTokenList { * Can be set, to change the associated attribute. */ value: string; + toString(): string; /** * Adds all arguments passed, except those already present. * @@ -7024,6 +7025,7 @@ interface HTMLHyperlinkElementUtils { host: string; hostname: string; href: string; + toString(): string; readonly origin: string; password: string; pathname: string; @@ -9877,6 +9879,7 @@ interface Location { * Can be set, to navigate to the given URL. */ href: string; + toString(): string; /** * Returns the Location object's URL's origin. */ @@ -10335,10 +10338,10 @@ declare var MediaKeys: { interface MediaList { readonly length: number; mediaText: string; + toString(): string; appendMedium(medium: string): void; deleteMedium(medium: string): void; item(index: number): string | null; - toString(): number; [index: number]: string; } @@ -15999,6 +16002,7 @@ interface URL { host: string; hostname: string; href: string; + toString(): string; readonly origin: string; password: string; pathname: string; diff --git a/baselines/webworker.generated.d.ts b/baselines/webworker.generated.d.ts index 36602863e..3d6e03fd7 100644 --- a/baselines/webworker.generated.d.ts +++ b/baselines/webworker.generated.d.ts @@ -3202,6 +3202,7 @@ interface URL { host: string; hostname: string; href: string; + toString(): string; readonly origin: string; password: string; pathname: string; @@ -5380,12 +5381,12 @@ interface WorkerLocation { readonly host: string; readonly hostname: string; readonly href: string; + toString(): string; readonly origin: string; readonly pathname: string; readonly port: string; readonly protocol: string; readonly search: string; - toString(): string; } declare var WorkerLocation: { diff --git a/package-lock.json b/package-lock.json index 0421da825..180339661 100644 --- a/package-lock.json +++ b/package-lock.json @@ -122,6 +122,11 @@ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -130,6 +135,15 @@ "tweetnacl": "^0.14.3" } }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, "browser-process-hrtime": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", @@ -140,6 +154,11 @@ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -148,11 +167,42 @@ "delayed-stream": "~1.0.0" } }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, + "cpx2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cpx2/-/cpx2-2.0.0.tgz", + "integrity": "sha512-hSkh9xHmUnHMxVS99SpACbAw6jOCaji0KyepBQ4/ULZQ+RB+3uP2PB/zylOCjSxZv9/cvoeG1XuQbZPyNuYftA==", + "requires": { + "co": "^4.6.0", + "debounce": "^1.2.0", + "debug": "^4.1.1", + "duplexer": "^0.1.1", + "fs-extra": "^8.1.0", + "glob": "^7.1.4", + "glob2base": "0.0.12", + "minimatch": "^3.0.4", + "resolve": "^1.12.0", + "safe-buffer": "^5.2.0", + "shell-quote": "^1.7.1", + "subarg": "^1.0.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + } + } + }, "cssom": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", @@ -196,6 +246,19 @@ } } }, + "debounce": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.0.tgz", + "integrity": "sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg==" + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, "deep-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", @@ -219,6 +282,11 @@ "webidl-conversions": "^4.0.2" } }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=" + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -280,6 +348,11 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=" }, + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=" + }, "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", @@ -295,6 +368,21 @@ "mime-types": "^2.1.12" } }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", @@ -303,6 +391,32 @@ "assert-plus": "^1.0.0" } }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "requires": { + "find-index": "^0.1.1" + } + }, + "graceful-fs": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", + "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==" + }, "har-schema": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", @@ -343,6 +457,20 @@ "safer-buffer": ">= 2.1.2 < 3" } }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -406,6 +534,14 @@ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "requires": { + "graceful-fs": "^4.1.6" + } + }, "jsprim": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", @@ -454,6 +590,24 @@ "mime-db": "1.40.0" } }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, "node-fetch": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", @@ -469,6 +623,14 @@ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, "optionator": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", @@ -487,6 +649,16 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==" }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -591,6 +763,14 @@ "tough-cookie": "^2.3.3" } }, + "resolve": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", + "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", + "requires": { + "path-parse": "^1.0.6" + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -606,6 +786,11 @@ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, + "shell-quote": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==" + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -638,6 +823,14 @@ "resolved": "https://registry.npmjs.org/styleless-innertext/-/styleless-innertext-1.1.2.tgz", "integrity": "sha512-DtkmkUlnXmY/toO0hE8w0Tp5JD9oaI26ci8yRfU7FBqn4R/rKRCb6MakmCoT1hVhqgONOWSH02vEdrM5MD4gqQ==" }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "requires": { + "minimist": "^1.1.0" + } + }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", @@ -682,9 +875,14 @@ } }, "typescript": { - "version": "3.7.0-dev.20190912", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.0-dev.20190912.tgz", - "integrity": "sha512-5rAOCT1CLjQ2nYeKwa6SOnpSW8N+EEFE6WbNOLrzsSyZwYysE1oHCw4SYil3ZsBVtiEmCYnPWck525dOpgUHDg==" + "version": "3.7.0-dev.20190913", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.7.0-dev.20190913.tgz", + "integrity": "sha512-EtdQ29mYrPAlu33sDltK3XxVrjfeIJYMrHTwYWlBqOstnW13DPYODm40aflJ+KzM+OTSz3kxz3BF7BRhmFWVDw==" + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, "uri-js": { "version": "4.2.2", @@ -755,6 +953,11 @@ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=" }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, "ws": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", diff --git a/package.json b/package.json index 53d618c65..91644cd0d 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@types/node": "^9.6.52", "@types/node-fetch": "^1.6.9", "@types/webidl2": "^23.8.0", + "cpx2": "^2.0.0", "jsdom": "^11.12.0", "node-fetch": "^2.6.0", "print-diff": "^0.1.1", diff --git a/src/emitter.ts b/src/emitter.ts index 1e7ec61af..feae57a97 100644 --- a/src/emitter.ts +++ b/src/emitter.ts @@ -622,6 +622,10 @@ export function emitWebIdl(webidl: Browser.WebIdl, flavor: Flavor) { const readOnlyModifier = p["read-only"] === 1 && prefix === "" ? "readonly " : ""; printer.printLine(`${prefix}${readOnlyModifier}${p.name}${requiredModifier}: ${pType};`); } + + if (p.stringifier) { + printer.printLine("toString(): string;") + } } function emitComments(entity: { comment?: string; deprecated?: 1 }, print: (s: string) => void) { @@ -662,7 +666,16 @@ export function emitWebIdl(webidl: Browser.WebIdl, flavor: Flavor) { case "querySelector": return emitQuerySelectorOverloads(m); case "querySelectorAll": return emitQuerySelectorAllOverloads(m); } - emitSignatures(m, prefix, m.name, printLine); + + // ignore toString() provided from browser.webidl.preprocessed.json + // to prevent duplication + if (m.name !== "toString") { + emitSignatures(m, prefix, m.name, printLine); + + if (m.stringifier) { + printLine("toString(): string;") + } + } } function emitSignature(s: Browser.Signature, prefix: string | undefined, name: string | undefined, printLine: (s: string) => void) { diff --git a/src/widlprocess.ts b/src/widlprocess.ts index 9c65a5614..3a9e5b59a 100644 --- a/src/widlprocess.ts +++ b/src/widlprocess.ts @@ -249,6 +249,7 @@ function convertAttribute(attribute: webidl2.AttributeMemberType, inheritedExpos name: attribute.name, ...convertIdlType(attribute.idlType), static: attribute.special === "static" ? 1 : undefined, + stringifier: attribute.special === "stringifier" ? 1 : undefined, "read-only": attribute.readonly ? 1 : undefined, "event-handler": isEventHandler ? attribute.name.slice(2) : undefined, exposed: getExtAttrConcatenated(attribute.extAttrs, "Exposed") || inheritedExposure From 8a0321f083eb309ea2ed7c84ca1a415a1261f6fd Mon Sep 17 00:00:00 2001 From: Kagami Sascha Rosylight Date: Fri, 13 Sep 2019 16:40:48 +0900 Subject: [PATCH 2/2] support `stringifier;` --- baselines/dom.generated.d.ts | 8 ++++++++ baselines/webworker.generated.d.ts | 2 ++ src/emitter.ts | 6 ++++++ src/widlprocess.ts | 13 +++++++++---- 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/baselines/dom.generated.d.ts b/baselines/dom.generated.d.ts index 4e4fb28c0..6ec386b11 100644 --- a/baselines/dom.generated.d.ts +++ b/baselines/dom.generated.d.ts @@ -3981,6 +3981,7 @@ interface DOMMatrixReadOnly { toJSON(): any; transformPoint(point?: DOMPointInit): DOMPoint; translate(tx?: number, ty?: number, tz?: number): DOMMatrix; + toString(): string; } declare var DOMMatrixReadOnly: { @@ -3989,6 +3990,7 @@ declare var DOMMatrixReadOnly: { fromFloat32Array(array32: Float32Array): DOMMatrixReadOnly; fromFloat64Array(array64: Float64Array): DOMMatrixReadOnly; fromMatrix(other?: DOMMatrixInit): DOMMatrixReadOnly; + toString(): string; }; /** Provides the ability to parse XML or HTML source code from a string into a DOM Document. */ @@ -12608,6 +12610,7 @@ interface Range extends AbstractRange { setStartAfter(node: Node): void; setStartBefore(node: Node): void; surroundContents(newParent: Node): void; + toString(): string; readonly END_TO_END: number; readonly END_TO_START: number; readonly START_TO_END: number; @@ -12621,6 +12624,7 @@ declare var Range: { readonly END_TO_START: number; readonly START_TO_END: number; readonly START_TO_START: number; + toString(): string; }; interface ReadableByteStreamController { @@ -14997,11 +15001,13 @@ interface Selection { selectAllChildren(node: Node): void; setBaseAndExtent(anchorNode: Node, anchorOffset: number, focusNode: Node, focusOffset: number): void; setPosition(node: Node | null, offset?: number): void; + toString(): string; } declare var Selection: { prototype: Selection; new(): Selection; + toString(): string; }; interface ServiceUIFrameContext { @@ -16050,12 +16056,14 @@ interface URLSearchParams { */ set(name: string, value: string): void; sort(): void; + toString(): string; forEach(callbackfn: (value: string, key: string, parent: URLSearchParams) => void, thisArg?: any): void; } declare var URLSearchParams: { prototype: URLSearchParams; new(init?: string[][] | Record | string | URLSearchParams): URLSearchParams; + toString(): string; }; /** This WebVR API interface represents any VR device supported by this API. It includes generic information such as device IDs and descriptions, as well as methods for starting to present a VR scene, retrieving eye parameters and display capabilities, and other important functionality. */ diff --git a/baselines/webworker.generated.d.ts b/baselines/webworker.generated.d.ts index 3d6e03fd7..86c3fb16c 100644 --- a/baselines/webworker.generated.d.ts +++ b/baselines/webworker.generated.d.ts @@ -3247,12 +3247,14 @@ interface URLSearchParams { */ set(name: string, value: string): void; sort(): void; + toString(): string; forEach(callbackfn: (value: string, key: string, parent: URLSearchParams) => void, thisArg?: any): void; } declare var URLSearchParams: { prototype: URLSearchParams; new(init?: string[][] | Record | string | URLSearchParams): URLSearchParams; + toString(): string; }; interface WEBGL_color_buffer_float { diff --git a/src/emitter.ts b/src/emitter.ts index feae57a97..96fb1926c 100644 --- a/src/emitter.ts +++ b/src/emitter.ts @@ -707,6 +707,12 @@ export function emitWebIdl(webidl: Browser.WebIdl, flavor: Flavor) { .sort(compareName) .forEach(m => emitMethod(prefix, m, conflictedMembers)); } + if (i["anonymous-methods"]) { + const stringifier = i["anonymous-methods"].method.find(m => m.stringifier); + if (stringifier) { + printer.printLine("toString(): string;"); + } + } // The window interface inherited some methods from "Object", // which need to explicitly exposed diff --git a/src/widlprocess.ts b/src/widlprocess.ts index 3a9e5b59a..7372dcf9f 100644 --- a/src/widlprocess.ts +++ b/src/widlprocess.ts @@ -145,7 +145,7 @@ function convertInterfaceCommon(i: webidl2.InterfaceType | webidl2.InterfaceMixi properties!.property[member.name] = prop; } } - else if (member.type === "operation" && member.idlType) { + else if (member.type === "operation") { const operation = convertOperation(member, result.exposed); const { method } = result.methods; if (!member.name) { @@ -205,18 +205,23 @@ function getNamedConstructor(extAttrs: webidl2.ExtendedAttribute[], parent: stri } function convertOperation(operation: webidl2.OperationMemberType, inheritedExposure: string | undefined): Browser.AnonymousMethod | Browser.Method { - if (!operation.idlType) { + const isStringifier = operation.special === "stringifier"; + const type = + operation.idlType ? convertIdlType(operation.idlType) : + isStringifier ? { type: "DOMString" } : + undefined; + if (!type) { throw new Error("Unexpected anonymous operation"); } return { name: operation.name || undefined, signature: [{ - ...convertIdlType(operation.idlType), + ...type, param: operation.arguments.map(convertArgument) }], getter: operation.special === "getter" ? 1 : undefined, static: operation.special === "static" ? 1 : undefined, - stringifier: operation.special === "stringifier" ? 1 : undefined, + stringifier: isStringifier ? 1 : undefined, exposed: getExtAttrConcatenated(operation.extAttrs, "Exposed") || inheritedExposure }; }