From 714b4f25c0f7daaf6372e5abbdc83f96aac80a2a Mon Sep 17 00:00:00 2001 From: Shagen Ogandzhanian Date: Fri, 14 Dec 2018 13:13:27 +0100 Subject: [PATCH] Introduce better typing for on[event-name] attributes from idl see https://upsource.jetbrains.com/kotlin/review/KOTLIN-CR-2548 --- .../stdlib/js/src/org.w3c/org.w3c.dom.kt | 180 +++++++++--------- .../stdlib/js/src/org.w3c/org.w3c.files.kt | 4 +- .../js/src/org.w3c/org.w3c.notifications.kt | 2 +- .../stdlib/js/src/org.w3c/org.w3c.workers.kt | 10 +- .../stdlib/js/src/org.w3c/org.w3c.xhr.kt | 4 +- .../tools/idl2k/src/main/kotlin/config.kt | 69 ++++++- libraries/tools/idl2k/src/main/kotlin/gen.kt | 61 ++++-- .../idl2k/src/main/kotlin/typeMappings.kt | 125 +++++++----- 8 files changed, 285 insertions(+), 170 deletions(-) diff --git a/libraries/stdlib/js/src/org.w3c/org.w3c.dom.kt b/libraries/stdlib/js/src/org.w3c/org.w3c.dom.kt index 170810e96a4..bbc06b1c36e 100644 --- a/libraries/stdlib/js/src/org.w3c/org.w3c.dom.kt +++ b/libraries/stdlib/js/src/org.w3c/org.w3c.dom.kt @@ -75,62 +75,62 @@ public external open class Document : Node, GlobalEventHandlers, DocumentAndElem open val documentElement: Element? open val scrollingElement: Element? open val styleSheets: StyleSheetList - override var ongotpointercapture: ((Event) -> dynamic)? - override var onlostpointercapture: ((Event) -> dynamic)? - override var onpointerdown: ((Event) -> dynamic)? - override var onpointermove: ((Event) -> dynamic)? - override var onpointerup: ((Event) -> dynamic)? - override var onpointercancel: ((Event) -> dynamic)? - override var onpointerover: ((Event) -> dynamic)? - override var onpointerout: ((Event) -> dynamic)? - override var onpointerenter: ((Event) -> dynamic)? - override var onpointerleave: ((Event) -> dynamic)? + override var ongotpointercapture: ((PointerEvent) -> dynamic)? + override var onlostpointercapture: ((PointerEvent) -> dynamic)? + override var onpointerdown: ((PointerEvent) -> dynamic)? + override var onpointermove: ((PointerEvent) -> dynamic)? + override var onpointerup: ((PointerEvent) -> dynamic)? + override var onpointercancel: ((PointerEvent) -> dynamic)? + override var onpointerover: ((PointerEvent) -> dynamic)? + override var onpointerout: ((PointerEvent) -> dynamic)? + override var onpointerenter: ((PointerEvent) -> dynamic)? + override var onpointerleave: ((PointerEvent) -> dynamic)? override var onabort: ((Event) -> dynamic)? - override var onblur: ((Event) -> dynamic)? + override var onblur: ((FocusEvent) -> dynamic)? override var oncancel: ((Event) -> dynamic)? override var oncanplay: ((Event) -> dynamic)? override var oncanplaythrough: ((Event) -> dynamic)? override var onchange: ((Event) -> dynamic)? - override var onclick: ((Event) -> dynamic)? + override var onclick: ((MouseEvent) -> dynamic)? override var onclose: ((Event) -> dynamic)? - override var oncontextmenu: ((Event) -> dynamic)? + override var oncontextmenu: ((MouseEvent) -> dynamic)? override var oncuechange: ((Event) -> dynamic)? - override var ondblclick: ((Event) -> dynamic)? - override var ondrag: ((Event) -> dynamic)? - override var ondragend: ((Event) -> dynamic)? - override var ondragenter: ((Event) -> dynamic)? - override var ondragexit: ((Event) -> dynamic)? - override var ondragleave: ((Event) -> dynamic)? - override var ondragover: ((Event) -> dynamic)? - override var ondragstart: ((Event) -> dynamic)? - override var ondrop: ((Event) -> dynamic)? + override var ondblclick: ((MouseEvent) -> dynamic)? + override var ondrag: ((DragEvent) -> dynamic)? + override var ondragend: ((DragEvent) -> dynamic)? + override var ondragenter: ((DragEvent) -> dynamic)? + override var ondragexit: ((DragEvent) -> dynamic)? + override var ondragleave: ((DragEvent) -> dynamic)? + override var ondragover: ((DragEvent) -> dynamic)? + override var ondragstart: ((DragEvent) -> dynamic)? + override var ondrop: ((DragEvent) -> dynamic)? override var ondurationchange: ((Event) -> dynamic)? override var onemptied: ((Event) -> dynamic)? override var onended: ((Event) -> dynamic)? override var onerror: ((dynamic, String, Int, Int, Any?) -> dynamic)? - override var onfocus: ((Event) -> dynamic)? - override var oninput: ((Event) -> dynamic)? + override var onfocus: ((FocusEvent) -> dynamic)? + override var oninput: ((InputEvent) -> dynamic)? override var oninvalid: ((Event) -> dynamic)? - override var onkeydown: ((Event) -> dynamic)? - override var onkeypress: ((Event) -> dynamic)? - override var onkeyup: ((Event) -> dynamic)? + override var onkeydown: ((KeyboardEvent) -> dynamic)? + override var onkeypress: ((KeyboardEvent) -> dynamic)? + override var onkeyup: ((KeyboardEvent) -> dynamic)? override var onload: ((Event) -> dynamic)? override var onloadeddata: ((Event) -> dynamic)? override var onloadedmetadata: ((Event) -> dynamic)? override var onloadend: ((Event) -> dynamic)? - override var onloadstart: ((Event) -> dynamic)? - override var onmousedown: ((Event) -> dynamic)? - override var onmouseenter: ((Event) -> dynamic)? - override var onmouseleave: ((Event) -> dynamic)? - override var onmousemove: ((Event) -> dynamic)? - override var onmouseout: ((Event) -> dynamic)? - override var onmouseover: ((Event) -> dynamic)? - override var onmouseup: ((Event) -> dynamic)? - override var onwheel: ((Event) -> dynamic)? + override var onloadstart: ((ProgressEvent) -> dynamic)? + override var onmousedown: ((MouseEvent) -> dynamic)? + override var onmouseenter: ((MouseEvent) -> dynamic)? + override var onmouseleave: ((MouseEvent) -> dynamic)? + override var onmousemove: ((MouseEvent) -> dynamic)? + override var onmouseout: ((MouseEvent) -> dynamic)? + override var onmouseover: ((MouseEvent) -> dynamic)? + override var onmouseup: ((MouseEvent) -> dynamic)? + override var onwheel: ((WheelEvent) -> dynamic)? override var onpause: ((Event) -> dynamic)? override var onplay: ((Event) -> dynamic)? override var onplaying: ((Event) -> dynamic)? - override var onprogress: ((Event) -> dynamic)? + override var onprogress: ((ProgressEvent) -> dynamic)? override var onratechange: ((Event) -> dynamic)? override var onreset: ((Event) -> dynamic)? override var onresize: ((Event) -> dynamic)? @@ -2032,7 +2032,7 @@ public external abstract class ApplicationCache : EventTarget { open var onerror: ((Event) -> dynamic)? open var onnoupdate: ((Event) -> dynamic)? open var ondownloading: ((Event) -> dynamic)? - open var onprogress: ((Event) -> dynamic)? + open var onprogress: ((ProgressEvent) -> dynamic)? open var onupdateready: ((Event) -> dynamic)? open var oncached: ((Event) -> dynamic)? open var onobsolete: ((Event) -> dynamic)? @@ -2136,62 +2136,62 @@ public inline fun PromiseRejectionEventInit(promise: Promise?, reason: Any * Exposes the JavaScript [GlobalEventHandlers](https://developer.mozilla.org/en/docs/Web/API/GlobalEventHandlers) to Kotlin */ public external interface GlobalEventHandlers { - var ongotpointercapture: ((Event) -> dynamic)? - var onlostpointercapture: ((Event) -> dynamic)? - var onpointerdown: ((Event) -> dynamic)? - var onpointermove: ((Event) -> dynamic)? - var onpointerup: ((Event) -> dynamic)? - var onpointercancel: ((Event) -> dynamic)? - var onpointerover: ((Event) -> dynamic)? - var onpointerout: ((Event) -> dynamic)? - var onpointerenter: ((Event) -> dynamic)? - var onpointerleave: ((Event) -> dynamic)? + var ongotpointercapture: ((PointerEvent) -> dynamic)? + var onlostpointercapture: ((PointerEvent) -> dynamic)? + var onpointerdown: ((PointerEvent) -> dynamic)? + var onpointermove: ((PointerEvent) -> dynamic)? + var onpointerup: ((PointerEvent) -> dynamic)? + var onpointercancel: ((PointerEvent) -> dynamic)? + var onpointerover: ((PointerEvent) -> dynamic)? + var onpointerout: ((PointerEvent) -> dynamic)? + var onpointerenter: ((PointerEvent) -> dynamic)? + var onpointerleave: ((PointerEvent) -> dynamic)? var onabort: ((Event) -> dynamic)? - var onblur: ((Event) -> dynamic)? + var onblur: ((FocusEvent) -> dynamic)? var oncancel: ((Event) -> dynamic)? var oncanplay: ((Event) -> dynamic)? var oncanplaythrough: ((Event) -> dynamic)? var onchange: ((Event) -> dynamic)? - var onclick: ((Event) -> dynamic)? + var onclick: ((MouseEvent) -> dynamic)? var onclose: ((Event) -> dynamic)? - var oncontextmenu: ((Event) -> dynamic)? + var oncontextmenu: ((MouseEvent) -> dynamic)? var oncuechange: ((Event) -> dynamic)? - var ondblclick: ((Event) -> dynamic)? - var ondrag: ((Event) -> dynamic)? - var ondragend: ((Event) -> dynamic)? - var ondragenter: ((Event) -> dynamic)? - var ondragexit: ((Event) -> dynamic)? - var ondragleave: ((Event) -> dynamic)? - var ondragover: ((Event) -> dynamic)? - var ondragstart: ((Event) -> dynamic)? - var ondrop: ((Event) -> dynamic)? + var ondblclick: ((MouseEvent) -> dynamic)? + var ondrag: ((DragEvent) -> dynamic)? + var ondragend: ((DragEvent) -> dynamic)? + var ondragenter: ((DragEvent) -> dynamic)? + var ondragexit: ((DragEvent) -> dynamic)? + var ondragleave: ((DragEvent) -> dynamic)? + var ondragover: ((DragEvent) -> dynamic)? + var ondragstart: ((DragEvent) -> dynamic)? + var ondrop: ((DragEvent) -> dynamic)? var ondurationchange: ((Event) -> dynamic)? var onemptied: ((Event) -> dynamic)? var onended: ((Event) -> dynamic)? var onerror: ((dynamic, String, Int, Int, Any?) -> dynamic)? - var onfocus: ((Event) -> dynamic)? - var oninput: ((Event) -> dynamic)? + var onfocus: ((FocusEvent) -> dynamic)? + var oninput: ((InputEvent) -> dynamic)? var oninvalid: ((Event) -> dynamic)? - var onkeydown: ((Event) -> dynamic)? - var onkeypress: ((Event) -> dynamic)? - var onkeyup: ((Event) -> dynamic)? + var onkeydown: ((KeyboardEvent) -> dynamic)? + var onkeypress: ((KeyboardEvent) -> dynamic)? + var onkeyup: ((KeyboardEvent) -> dynamic)? var onload: ((Event) -> dynamic)? var onloadeddata: ((Event) -> dynamic)? var onloadedmetadata: ((Event) -> dynamic)? var onloadend: ((Event) -> dynamic)? - var onloadstart: ((Event) -> dynamic)? - var onmousedown: ((Event) -> dynamic)? - var onmouseenter: ((Event) -> dynamic)? - var onmouseleave: ((Event) -> dynamic)? - var onmousemove: ((Event) -> dynamic)? - var onmouseout: ((Event) -> dynamic)? - var onmouseover: ((Event) -> dynamic)? - var onmouseup: ((Event) -> dynamic)? - var onwheel: ((Event) -> dynamic)? + var onloadstart: ((ProgressEvent) -> dynamic)? + var onmousedown: ((MouseEvent) -> dynamic)? + var onmouseenter: ((MouseEvent) -> dynamic)? + var onmouseleave: ((MouseEvent) -> dynamic)? + var onmousemove: ((MouseEvent) -> dynamic)? + var onmouseout: ((MouseEvent) -> dynamic)? + var onmouseover: ((MouseEvent) -> dynamic)? + var onmouseup: ((MouseEvent) -> dynamic)? + var onwheel: ((WheelEvent) -> dynamic)? var onpause: ((Event) -> dynamic)? var onplay: ((Event) -> dynamic)? var onplaying: ((Event) -> dynamic)? - var onprogress: ((Event) -> dynamic)? + var onprogress: ((ProgressEvent) -> dynamic)? var onratechange: ((Event) -> dynamic)? var onreset: ((Event) -> dynamic)? var onresize: ((Event) -> dynamic)? @@ -2215,18 +2215,18 @@ public external interface GlobalEventHandlers { public external interface WindowEventHandlers { var onafterprint: ((Event) -> dynamic)? var onbeforeprint: ((Event) -> dynamic)? - var onbeforeunload: ((Event) -> String?)? - var onhashchange: ((Event) -> dynamic)? + var onbeforeunload: ((BeforeUnloadEvent) -> String?)? + var onhashchange: ((HashChangeEvent) -> dynamic)? var onlanguagechange: ((Event) -> dynamic)? - var onmessage: ((Event) -> dynamic)? + var onmessage: ((MessageEvent) -> dynamic)? var onoffline: ((Event) -> dynamic)? var ononline: ((Event) -> dynamic)? - var onpagehide: ((Event) -> dynamic)? - var onpageshow: ((Event) -> dynamic)? - var onpopstate: ((Event) -> dynamic)? + var onpagehide: ((PageTransitionEvent) -> dynamic)? + var onpageshow: ((PageTransitionEvent) -> dynamic)? + var onpopstate: ((PopStateEvent) -> dynamic)? var onrejectionhandled: ((Event) -> dynamic)? - var onstorage: ((Event) -> dynamic)? - var onunhandledrejection: ((Event) -> dynamic)? + var onstorage: ((StorageEvent) -> dynamic)? + var onunhandledrejection: ((PromiseRejectionEvent) -> dynamic)? var onunload: ((Event) -> dynamic)? } @@ -2454,7 +2454,7 @@ public external open class EventSource(url: String, eventSourceInitDict: EventSo open val withCredentials: Boolean open val readyState: Short var onopen: ((Event) -> dynamic)? - var onmessage: ((Event) -> dynamic)? + var onmessage: ((MessageEvent) -> dynamic)? var onerror: ((Event) -> dynamic)? fun close(): Unit @@ -2492,7 +2492,7 @@ public external open class WebSocket(url: String, protocols: dynamic = definedEx var onclose: ((Event) -> dynamic)? open val extensions: String open val protocol: String - var onmessage: ((Event) -> dynamic)? + var onmessage: ((MessageEvent) -> dynamic)? var binaryType: BinaryType fun close(code: Short = definedExternally, reason: String = definedExternally): Unit fun send(data: String): Unit @@ -2555,7 +2555,7 @@ public external open class MessageChannel { * Exposes the JavaScript [MessagePort](https://developer.mozilla.org/en/docs/Web/API/MessagePort) to Kotlin */ public external abstract class MessagePort : EventTarget, UnionMessagePortOrWindow, UnionMessagePortOrServiceWorker, UnionClientOrMessagePortOrServiceWorker { - open var onmessage: ((Event) -> dynamic)? + open var onmessage: ((MessageEvent) -> dynamic)? fun postMessage(message: Any?, transfer: Array = definedExternally): Unit fun start(): Unit fun close(): Unit @@ -2566,7 +2566,7 @@ public external abstract class MessagePort : EventTarget, UnionMessagePortOrWind */ public external open class BroadcastChannel(name: String) : EventTarget { open val name: String - var onmessage: ((Event) -> dynamic)? + var onmessage: ((MessageEvent) -> dynamic)? fun postMessage(message: Any?): Unit fun close(): Unit } @@ -2583,7 +2583,7 @@ public external abstract class WorkerGlobalScope : EventTarget, WindowOrWorkerGl open var onoffline: ((Event) -> dynamic)? open var ononline: ((Event) -> dynamic)? open var onrejectionhandled: ((Event) -> dynamic)? - open var onunhandledrejection: ((Event) -> dynamic)? + open var onunhandledrejection: ((PromiseRejectionEvent) -> dynamic)? fun importScripts(vararg urls: String): Unit } @@ -2591,7 +2591,7 @@ public external abstract class WorkerGlobalScope : EventTarget, WindowOrWorkerGl * Exposes the JavaScript [DedicatedWorkerGlobalScope](https://developer.mozilla.org/en/docs/Web/API/DedicatedWorkerGlobalScope) to Kotlin */ public external abstract class DedicatedWorkerGlobalScope : WorkerGlobalScope { - open var onmessage: ((Event) -> dynamic)? + open var onmessage: ((MessageEvent) -> dynamic)? fun postMessage(message: Any?, transfer: Array = definedExternally): Unit fun close(): Unit } @@ -2617,7 +2617,7 @@ public external interface AbstractWorker { * Exposes the JavaScript [Worker](https://developer.mozilla.org/en/docs/Web/API/Worker) to Kotlin */ public external open class Worker(scriptURL: String, options: WorkerOptions = definedExternally) : EventTarget, AbstractWorker { - var onmessage: ((Event) -> dynamic)? + var onmessage: ((MessageEvent) -> dynamic)? override var onerror: ((Event) -> dynamic)? fun terminate(): Unit fun postMessage(message: Any?, transfer: Array = definedExternally): Unit diff --git a/libraries/stdlib/js/src/org.w3c/org.w3c.files.kt b/libraries/stdlib/js/src/org.w3c/org.w3c.files.kt index 6c8e1dd3bf8..22ee1a0e015 100644 --- a/libraries/stdlib/js/src/org.w3c/org.w3c.files.kt +++ b/libraries/stdlib/js/src/org.w3c/org.w3c.files.kt @@ -90,8 +90,8 @@ public external open class FileReader : EventTarget { open val readyState: Short open val result: dynamic open val error: dynamic - var onloadstart: ((Event) -> dynamic)? - var onprogress: ((Event) -> dynamic)? + var onloadstart: ((ProgressEvent) -> dynamic)? + var onprogress: ((ProgressEvent) -> dynamic)? var onload: ((Event) -> dynamic)? var onabort: ((Event) -> dynamic)? var onerror: ((Event) -> dynamic)? diff --git a/libraries/stdlib/js/src/org.w3c/org.w3c.notifications.kt b/libraries/stdlib/js/src/org.w3c/org.w3c.notifications.kt index 4845d4862e5..a04ba6e4a7e 100644 --- a/libraries/stdlib/js/src/org.w3c/org.w3c.notifications.kt +++ b/libraries/stdlib/js/src/org.w3c/org.w3c.notifications.kt @@ -28,7 +28,7 @@ import org.w3c.xhr.* * Exposes the JavaScript [Notification](https://developer.mozilla.org/en/docs/Web/API/Notification) to Kotlin */ public external open class Notification(title: String, options: NotificationOptions = definedExternally) : EventTarget { - var onclick: ((Event) -> dynamic)? + var onclick: ((MouseEvent) -> dynamic)? var onerror: ((Event) -> dynamic)? open val title: String open val dir: NotificationDirection diff --git a/libraries/stdlib/js/src/org.w3c/org.w3c.workers.kt b/libraries/stdlib/js/src/org.w3c/org.w3c.workers.kt index 141d6680d49..7b11396a0fe 100644 --- a/libraries/stdlib/js/src/org.w3c/org.w3c.workers.kt +++ b/libraries/stdlib/js/src/org.w3c/org.w3c.workers.kt @@ -49,12 +49,12 @@ public external abstract class ServiceWorkerGlobalScope : WorkerGlobalScope { open val registration: ServiceWorkerRegistration open var oninstall: ((Event) -> dynamic)? open var onactivate: ((Event) -> dynamic)? - open var onfetch: ((Event) -> dynamic)? + open var onfetch: ((FetchEvent) -> dynamic)? open var onforeignfetch: ((Event) -> dynamic)? - open var onmessage: ((Event) -> dynamic)? + open var onmessage: ((MessageEvent) -> dynamic)? open var onfunctionalevent: ((Event) -> dynamic)? - open var onnotificationclick: ((Event) -> dynamic)? - open var onnotificationclose: ((Event) -> dynamic)? + open var onnotificationclick: ((NotificationEvent) -> dynamic)? + open var onnotificationclose: ((NotificationEvent) -> dynamic)? fun skipWaiting(): Promise } @@ -75,7 +75,7 @@ public external abstract class ServiceWorkerContainer : EventTarget { open val controller: ServiceWorker? open val ready: Promise open var oncontrollerchange: ((Event) -> dynamic)? - open var onmessage: ((Event) -> dynamic)? + open var onmessage: ((MessageEvent) -> dynamic)? fun register(scriptURL: String, options: RegistrationOptions = definedExternally): Promise fun getRegistration(clientURL: String = definedExternally): Promise fun getRegistrations(): Promise diff --git a/libraries/stdlib/js/src/org.w3c/org.w3c.xhr.kt b/libraries/stdlib/js/src/org.w3c/org.w3c.xhr.kt index b74daf68173..7602cb6cc7a 100644 --- a/libraries/stdlib/js/src/org.w3c/org.w3c.xhr.kt +++ b/libraries/stdlib/js/src/org.w3c/org.w3c.xhr.kt @@ -28,8 +28,8 @@ import org.w3c.workers.* * Exposes the JavaScript [XMLHttpRequestEventTarget](https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequestEventTarget) to Kotlin */ public external abstract class XMLHttpRequestEventTarget : EventTarget { - open var onloadstart: ((Event) -> dynamic)? - open var onprogress: ((Event) -> dynamic)? + open var onloadstart: ((ProgressEvent) -> dynamic)? + open var onprogress: ((ProgressEvent) -> dynamic)? open var onabort: ((Event) -> dynamic)? open var onerror: ((Event) -> dynamic)? open var onload: ((Event) -> dynamic)? diff --git a/libraries/tools/idl2k/src/main/kotlin/config.kt b/libraries/tools/idl2k/src/main/kotlin/config.kt index 875f2b7c1a3..f3115143a7b 100644 --- a/libraries/tools/idl2k/src/main/kotlin/config.kt +++ b/libraries/tools/idl2k/src/main/kotlin/config.kt @@ -91,4 +91,71 @@ val kotlinBuiltinInterfaces = mapOf( primaryConstructor = null, secondaryConstructors = emptyList() ) -) \ No newline at end of file +) + +val specifyEventMapper = mapOf( + "onbeforeunload" to "BeforeUnloadEvent", + + "ondrag" to "DragEvent", + "ondragend" to "DragEvent", + "ondragenter" to "DragEvent", + "ondragexit" to "DragEvent", + "ondragleave" to "DragEvent", + "ondragover" to "DragEvent", + "ondragstart" to "DragEvent", + "ondrop" to "DragEvent", + + "onfetch" to "FetchEvent", + + "onblur" to "FocusEvent", + "onfocus" to "FocusEvent", + + "onhashchange" to "HashChangeEvent", + + "oninput" to "InputEvent", + + "onkeydown" to "KeyboardEvent", + "onkeypress" to "KeyboardEvent", + "onkeyup" to "KeyboardEvent", + + "onmessage" to "MessageEvent", + + "onclick" to "MouseEvent", + "oncontextmenu" to "MouseEvent", + "ondblclick" to "MouseEvent", + "onmousedown" to "MouseEvent", + "onmouseenter" to "MouseEvent", + "onmouseleave" to "MouseEvent", + "onmousemove" to "MouseEvent", + "onmouseout" to "MouseEvent", + "onmouseover" to "MouseEvent", + "onmouseup" to "MouseEvent", + + "onnotificationclick" to "NotificationEvent", + "onnotificationclose" to "NotificationEvent", + + "onpagehide" to "PageTransitionEvent", + "onpageshow" to "PageTransitionEvent", + + "ongotpointercapture" to "PointerEvent", + "onlostpointercapture" to "PointerEvent", + "onpointercancel" to "PointerEvent", + "onpointerdown" to "PointerEvent", + "onpointerenter" to "PointerEvent", + "onpointerleave" to "PointerEvent", + "onpointermove" to "PointerEvent", + "onpointerout" to "PointerEvent", + "onpointerover" to "PointerEvent", + "onpointerup" to "PointerEvent", + + "onpopstate" to "PopStateEvent", + + "onloadstart" to "ProgressEvent", + "onprogress" to "ProgressEvent", + + "onunhandledrejection" to "PromiseRejectionEvent", + + "onstorage" to "StorageEvent", + + "onwheel" to "WheelEvent" +) diff --git a/libraries/tools/idl2k/src/main/kotlin/gen.kt b/libraries/tools/idl2k/src/main/kotlin/gen.kt index c42efa3a880..a8258a660e4 100644 --- a/libraries/tools/idl2k/src/main/kotlin/gen.kt +++ b/libraries/tools/idl2k/src/main/kotlin/gen.kt @@ -86,26 +86,26 @@ fun generateFunctions(repository: Repository, function: Operation): List = iface.findConstructors()): GenerateDefinitionKind = @@ -259,6 +259,25 @@ private fun mapLiteral(literal: String?, expectedType: Type = DynamicType, enums } } + +private fun specifyType(name: String, type: Type): Type { + if ((type is SimpleType) && (type.type == "Event")) { + specifyEventMapper[name]?.let { + return type.copy(type = it) + } + } + + return type +} + +private fun generalizeType(name: String, type: Type): Type { + if ((type is FunctionType) && (type.parameterTypes.size == 1)) { + val paramAttribute = type.parameterTypes[0] + return type.copy(parameterTypes = listOf(paramAttribute.copy(type = specifyType(name, paramAttribute.type)))) + } + return type +} + fun implementInterfaces(declarations: List) { val unimplementedMemberMap = getUnimplementedMembers(declarations) val nonAbstractDeclarations = declarations.filter { it.kind == GenerateDefinitionKind.CLASS } @@ -266,7 +285,7 @@ fun implementInterfaces(declarations: List) { val unimplementedMembers = unimplementedMemberMap[declaration.name] ?: continue for (attribute in unimplementedMembers.attributes) { - declaration.memberAttributes += attribute.copy(override = true) + declaration.memberAttributes += attribute.copy(override = true, type = generalizeType(attribute.name, attribute.type)) } for (function in unimplementedMembers.functions) { declaration.memberFunctions += function.copy(override = true) diff --git a/libraries/tools/idl2k/src/main/kotlin/typeMappings.kt b/libraries/tools/idl2k/src/main/kotlin/typeMappings.kt index ee9c5363a80..58a326065d4 100644 --- a/libraries/tools/idl2k/src/main/kotlin/typeMappings.kt +++ b/libraries/tools/idl2k/src/main/kotlin/typeMappings.kt @@ -19,42 +19,49 @@ package org.jetbrains.idl2k import java.util.* private val typeMapper = mapOf( - "unsignedlong" to SimpleType("Int", false), - "unsignedlonglong" to SimpleType("Int", false), - "longlong" to SimpleType("Int", false), - "unsignedshort" to SimpleType("Short", false), - "unsignedbyte" to SimpleType("Byte", false), - "octet" to SimpleType("Byte", false), - "void" to UnitType, - "boolean" to SimpleType("Boolean", false), - "byte" to SimpleType("Byte", false), - "short" to SimpleType("Short", false), - "long" to SimpleType("Int", false), - "float" to SimpleType("Float", false), - "double" to SimpleType("Double", false), - "any" to AnyType(true), - "DOMTimeStamp" to SimpleType("Number", false), - "object" to DynamicType, // TODO map to Any? - "WindowProxy" to SimpleType("Window", false), - "USVString" to SimpleType("String", false), - "DOMString" to SimpleType("String", false), - "ByteString" to SimpleType("String", false), - "DOMError" to DynamicType, - "Elements" to DynamicType, - "Date" to SimpleType("Date", false), - "" to DynamicType + "unsignedlong" to SimpleType("Int", false), + "unsignedlonglong" to SimpleType("Int", false), + "longlong" to SimpleType("Int", false), + "unsignedshort" to SimpleType("Short", false), + "unsignedbyte" to SimpleType("Byte", false), + "octet" to SimpleType("Byte", false), + "void" to UnitType, + "boolean" to SimpleType("Boolean", false), + "byte" to SimpleType("Byte", false), + "short" to SimpleType("Short", false), + "long" to SimpleType("Int", false), + "float" to SimpleType("Float", false), + "double" to SimpleType("Double", false), + "any" to AnyType(true), + "DOMTimeStamp" to SimpleType("Number", false), + "object" to DynamicType, // TODO map to Any? + "WindowProxy" to SimpleType("Window", false), + "USVString" to SimpleType("String", false), + "DOMString" to SimpleType("String", false), + "ByteString" to SimpleType("String", false), + "DOMError" to DynamicType, + "Elements" to DynamicType, + "Date" to SimpleType("Date", false), + "" to DynamicType ) -fun GenerateTraitOrClass.allSuperTypes(all: Map) = LinkedHashSet().let { result -> allSuperTypesImpl(listOf(this), all, result); result.toList() } +fun GenerateTraitOrClass.allSuperTypes(all: Map) = + LinkedHashSet().let { result -> allSuperTypesImpl(listOf(this), all, result); result.toList() } -tailrec fun allSuperTypesImpl(roots: List, all: Map, result: MutableSet) { +tailrec fun allSuperTypesImpl( + roots: List, + all: Map, + result: MutableSet +) { if (roots.isNotEmpty()) { - allSuperTypesImpl(roots.flatMap { it.superTypes }.map { all[it] ?: all[it.substringBefore("<")] }.filterNotNull().filter { result.add(it) }, all, result) + allSuperTypesImpl(roots.flatMap { it.superTypes }.map { + all[it] ?: all[it.substringBefore("<")] + }.filterNotNull().filter { result.add(it) }, all, result) } } -fun standardTypes() = typeMapper.values.map {it.dropNullable()}.toSet() +fun standardTypes() = typeMapper.values.map { it.dropNullable() }.toSet() fun Type.dynamicIfUnknownType(allTypes: Set, standardTypes: Set = standardTypes()): Type = when { this is DynamicType || this is UnitType -> this @@ -62,7 +69,16 @@ fun Type.dynamicIfUnknownType(allTypes: Set, standardTypes: Set = this.dropNullable() in standardTypes -> this this is ArrayType -> copy(memberType = this.memberType.dynamicIfUnknownType(allTypes, standardTypes)) this is UnionType -> if (this.name !in allTypes) DynamicType else this - this is FunctionType -> copy(returnType = returnType.dynamicIfUnknownType(allTypes, standardTypes), parameterTypes = parameterTypes.map { it.copy(type = it.type.dynamicIfUnknownType(allTypes, standardTypes)) }) + this is FunctionType -> copy( + returnType = returnType.dynamicIfUnknownType(allTypes, standardTypes), + parameterTypes = parameterTypes.map { + it.copy( + type = it.type.dynamicIfUnknownType( + allTypes, + standardTypes + ) + ) + }) this is PromiseType -> copy(valueType = valueType.dynamicIfUnknownType(allTypes, standardTypes)) @@ -84,11 +100,15 @@ internal fun mapType(repository: Repository, type: Type): Type = when (type) { } is PromiseType -> type.copy(valueType = mapType(repository, type.valueType)) is ArrayType -> type.copy(memberType = mapType(repository, type.memberType)) - is UnionType -> UnionType(type.namespace, type.memberTypes.map { mt -> mapType(repository, mt) }, type.nullable).toSingleTypeIfPossible() + is UnionType -> UnionType( + type.namespace, + type.memberTypes.map { mt -> mapType(repository, mt) }, + type.nullable + ).toSingleTypeIfPossible() is FunctionType -> type.copy( - // TODO: Remove takeWhile { !vararg } when we have varargs supported. See KT-3115 - returnType = mapType(repository, type.returnType).dynamicIfAnyType(), - parameterTypes = type.parameterTypes.takeWhile { !it.vararg }.map { it.copy(type = mapType(repository, it.type)) } + // TODO: Remove takeWhile { !vararg } when we have varargs supported. See KT-3115 + returnType = mapType(repository, type.returnType).dynamicIfAnyType(), + parameterTypes = type.parameterTypes.takeWhile { !it.vararg }.map { it.copy(type = mapType(repository, it.type)) } ) is AnyType, @@ -100,30 +120,39 @@ private fun mapTypedef(repository: Repository, type: SimpleType): Type { val typedef = repository.typeDefs[type.type]!! return when { - typedef.types is UnionType && typedef.types.memberTypes.size == 1 -> mapType(repository, typedef.types.memberTypes.single().withNullability(type.nullable)) + typedef.types is UnionType && typedef.types.memberTypes.size == 1 -> mapType( + repository, + typedef.types.memberTypes.single().withNullability(type.nullable) + ) typedef.types is UnionType -> SimpleType(typedef.name, type.nullable) else -> mapType(repository, typedef.types.withNullability(type.nullable)) } } -private fun GenerateFunction?.allTypes() = if (this != null) sequenceOf(returnType) + arguments.asSequence().map { it.type } else emptySequence() +private fun GenerateFunction?.allTypes() = + if (this != null) sequenceOf(returnType) + arguments.asSequence().map { it.type } else emptySequence() internal fun collectUnionTypes(allTypes: Map) = - allTypes.values.asSequence() - .flatMap { - it.secondaryConstructors.asSequence().flatMap { it.constructor.allTypes() } + + allTypes.values.asSequence() + .flatMap { + it.secondaryConstructors.asSequence().flatMap { it.constructor.allTypes() } + sequenceOf(it.primaryConstructor).filterNotNull().flatMap { it.constructor.allTypes() } + - it.memberAttributes.asSequence().map { it.type } + - it.memberFunctions.asSequence().flatMap { it.allTypes() } - } - .filterIsInstance() - .map { it.dropNullable() } - .filter { it.memberTypes.all { unionMember -> unionMember is SimpleType && unionMember.type in allTypes } } - .distinct() - .map { it.copy(namespace = guessPackage(it.memberTypes.filterIsInstance().map { it.type }, allTypes), types = it.memberTypes) } + it.memberAttributes.asSequence().map { it.type } + + it.memberFunctions.asSequence().flatMap { it.allTypes() } + } + .filterIsInstance() + .map { it.dropNullable() } + .filter { it.memberTypes.all { unionMember -> unionMember is SimpleType && unionMember.type in allTypes } } + .distinct() + .map { + it.copy( + namespace = guessPackage(it.memberTypes.filterIsInstance().map { it.type }, allTypes), + types = it.memberTypes + ) + } -private fun guessPackage(types : List, allTypes: Map) = - types.map { allTypes[it] } +private fun guessPackage(types: List, allTypes: Map) = + types.map { allTypes[it] } .map { it?.namespace } .filterNotNull() .filter { it.isNotEmpty() }