Introduce better typing for on[event-name] attributes from idl

see https://upsource.jetbrains.com/kotlin/review/KOTLIN-CR-2548
This commit is contained in:
Shagen Ogandzhanian
2018-12-14 13:13:27 +01:00
parent 8c0ad321e2
commit 714b4f25c0
8 changed files with 285 additions and 170 deletions
+90 -90
View File
@@ -75,62 +75,62 @@ public external open class Document : Node, GlobalEventHandlers, DocumentAndElem
open val documentElement: Element? open val documentElement: Element?
open val scrollingElement: Element? open val scrollingElement: Element?
open val styleSheets: StyleSheetList open val styleSheets: StyleSheetList
override var ongotpointercapture: ((Event) -> dynamic)? override var ongotpointercapture: ((PointerEvent) -> dynamic)?
override var onlostpointercapture: ((Event) -> dynamic)? override var onlostpointercapture: ((PointerEvent) -> dynamic)?
override var onpointerdown: ((Event) -> dynamic)? override var onpointerdown: ((PointerEvent) -> dynamic)?
override var onpointermove: ((Event) -> dynamic)? override var onpointermove: ((PointerEvent) -> dynamic)?
override var onpointerup: ((Event) -> dynamic)? override var onpointerup: ((PointerEvent) -> dynamic)?
override var onpointercancel: ((Event) -> dynamic)? override var onpointercancel: ((PointerEvent) -> dynamic)?
override var onpointerover: ((Event) -> dynamic)? override var onpointerover: ((PointerEvent) -> dynamic)?
override var onpointerout: ((Event) -> dynamic)? override var onpointerout: ((PointerEvent) -> dynamic)?
override var onpointerenter: ((Event) -> dynamic)? override var onpointerenter: ((PointerEvent) -> dynamic)?
override var onpointerleave: ((Event) -> dynamic)? override var onpointerleave: ((PointerEvent) -> dynamic)?
override var onabort: ((Event) -> dynamic)? override var onabort: ((Event) -> dynamic)?
override var onblur: ((Event) -> dynamic)? override var onblur: ((FocusEvent) -> dynamic)?
override var oncancel: ((Event) -> dynamic)? override var oncancel: ((Event) -> dynamic)?
override var oncanplay: ((Event) -> dynamic)? override var oncanplay: ((Event) -> dynamic)?
override var oncanplaythrough: ((Event) -> dynamic)? override var oncanplaythrough: ((Event) -> dynamic)?
override var onchange: ((Event) -> dynamic)? override var onchange: ((Event) -> dynamic)?
override var onclick: ((Event) -> dynamic)? override var onclick: ((MouseEvent) -> dynamic)?
override var onclose: ((Event) -> dynamic)? override var onclose: ((Event) -> dynamic)?
override var oncontextmenu: ((Event) -> dynamic)? override var oncontextmenu: ((MouseEvent) -> dynamic)?
override var oncuechange: ((Event) -> dynamic)? override var oncuechange: ((Event) -> dynamic)?
override var ondblclick: ((Event) -> dynamic)? override var ondblclick: ((MouseEvent) -> dynamic)?
override var ondrag: ((Event) -> dynamic)? override var ondrag: ((DragEvent) -> dynamic)?
override var ondragend: ((Event) -> dynamic)? override var ondragend: ((DragEvent) -> dynamic)?
override var ondragenter: ((Event) -> dynamic)? override var ondragenter: ((DragEvent) -> dynamic)?
override var ondragexit: ((Event) -> dynamic)? override var ondragexit: ((DragEvent) -> dynamic)?
override var ondragleave: ((Event) -> dynamic)? override var ondragleave: ((DragEvent) -> dynamic)?
override var ondragover: ((Event) -> dynamic)? override var ondragover: ((DragEvent) -> dynamic)?
override var ondragstart: ((Event) -> dynamic)? override var ondragstart: ((DragEvent) -> dynamic)?
override var ondrop: ((Event) -> dynamic)? override var ondrop: ((DragEvent) -> dynamic)?
override var ondurationchange: ((Event) -> dynamic)? override var ondurationchange: ((Event) -> dynamic)?
override var onemptied: ((Event) -> dynamic)? override var onemptied: ((Event) -> dynamic)?
override var onended: ((Event) -> dynamic)? override var onended: ((Event) -> dynamic)?
override var onerror: ((dynamic, String, Int, Int, Any?) -> dynamic)? override var onerror: ((dynamic, String, Int, Int, Any?) -> dynamic)?
override var onfocus: ((Event) -> dynamic)? override var onfocus: ((FocusEvent) -> dynamic)?
override var oninput: ((Event) -> dynamic)? override var oninput: ((InputEvent) -> dynamic)?
override var oninvalid: ((Event) -> dynamic)? override var oninvalid: ((Event) -> dynamic)?
override var onkeydown: ((Event) -> dynamic)? override var onkeydown: ((KeyboardEvent) -> dynamic)?
override var onkeypress: ((Event) -> dynamic)? override var onkeypress: ((KeyboardEvent) -> dynamic)?
override var onkeyup: ((Event) -> dynamic)? override var onkeyup: ((KeyboardEvent) -> dynamic)?
override var onload: ((Event) -> dynamic)? override var onload: ((Event) -> dynamic)?
override var onloadeddata: ((Event) -> dynamic)? override var onloadeddata: ((Event) -> dynamic)?
override var onloadedmetadata: ((Event) -> dynamic)? override var onloadedmetadata: ((Event) -> dynamic)?
override var onloadend: ((Event) -> dynamic)? override var onloadend: ((Event) -> dynamic)?
override var onloadstart: ((Event) -> dynamic)? override var onloadstart: ((ProgressEvent) -> dynamic)?
override var onmousedown: ((Event) -> dynamic)? override var onmousedown: ((MouseEvent) -> dynamic)?
override var onmouseenter: ((Event) -> dynamic)? override var onmouseenter: ((MouseEvent) -> dynamic)?
override var onmouseleave: ((Event) -> dynamic)? override var onmouseleave: ((MouseEvent) -> dynamic)?
override var onmousemove: ((Event) -> dynamic)? override var onmousemove: ((MouseEvent) -> dynamic)?
override var onmouseout: ((Event) -> dynamic)? override var onmouseout: ((MouseEvent) -> dynamic)?
override var onmouseover: ((Event) -> dynamic)? override var onmouseover: ((MouseEvent) -> dynamic)?
override var onmouseup: ((Event) -> dynamic)? override var onmouseup: ((MouseEvent) -> dynamic)?
override var onwheel: ((Event) -> dynamic)? override var onwheel: ((WheelEvent) -> dynamic)?
override var onpause: ((Event) -> dynamic)? override var onpause: ((Event) -> dynamic)?
override var onplay: ((Event) -> dynamic)? override var onplay: ((Event) -> dynamic)?
override var onplaying: ((Event) -> dynamic)? override var onplaying: ((Event) -> dynamic)?
override var onprogress: ((Event) -> dynamic)? override var onprogress: ((ProgressEvent) -> dynamic)?
override var onratechange: ((Event) -> dynamic)? override var onratechange: ((Event) -> dynamic)?
override var onreset: ((Event) -> dynamic)? override var onreset: ((Event) -> dynamic)?
override var onresize: ((Event) -> dynamic)? override var onresize: ((Event) -> dynamic)?
@@ -2032,7 +2032,7 @@ public external abstract class ApplicationCache : EventTarget {
open var onerror: ((Event) -> dynamic)? open var onerror: ((Event) -> dynamic)?
open var onnoupdate: ((Event) -> dynamic)? open var onnoupdate: ((Event) -> dynamic)?
open var ondownloading: ((Event) -> dynamic)? open var ondownloading: ((Event) -> dynamic)?
open var onprogress: ((Event) -> dynamic)? open var onprogress: ((ProgressEvent) -> dynamic)?
open var onupdateready: ((Event) -> dynamic)? open var onupdateready: ((Event) -> dynamic)?
open var oncached: ((Event) -> dynamic)? open var oncached: ((Event) -> dynamic)?
open var onobsolete: ((Event) -> dynamic)? open var onobsolete: ((Event) -> dynamic)?
@@ -2136,62 +2136,62 @@ public inline fun PromiseRejectionEventInit(promise: Promise<Any?>?, reason: Any
* Exposes the JavaScript [GlobalEventHandlers](https://developer.mozilla.org/en/docs/Web/API/GlobalEventHandlers) to Kotlin * Exposes the JavaScript [GlobalEventHandlers](https://developer.mozilla.org/en/docs/Web/API/GlobalEventHandlers) to Kotlin
*/ */
public external interface GlobalEventHandlers { public external interface GlobalEventHandlers {
var ongotpointercapture: ((Event) -> dynamic)? var ongotpointercapture: ((PointerEvent) -> dynamic)?
var onlostpointercapture: ((Event) -> dynamic)? var onlostpointercapture: ((PointerEvent) -> dynamic)?
var onpointerdown: ((Event) -> dynamic)? var onpointerdown: ((PointerEvent) -> dynamic)?
var onpointermove: ((Event) -> dynamic)? var onpointermove: ((PointerEvent) -> dynamic)?
var onpointerup: ((Event) -> dynamic)? var onpointerup: ((PointerEvent) -> dynamic)?
var onpointercancel: ((Event) -> dynamic)? var onpointercancel: ((PointerEvent) -> dynamic)?
var onpointerover: ((Event) -> dynamic)? var onpointerover: ((PointerEvent) -> dynamic)?
var onpointerout: ((Event) -> dynamic)? var onpointerout: ((PointerEvent) -> dynamic)?
var onpointerenter: ((Event) -> dynamic)? var onpointerenter: ((PointerEvent) -> dynamic)?
var onpointerleave: ((Event) -> dynamic)? var onpointerleave: ((PointerEvent) -> dynamic)?
var onabort: ((Event) -> dynamic)? var onabort: ((Event) -> dynamic)?
var onblur: ((Event) -> dynamic)? var onblur: ((FocusEvent) -> dynamic)?
var oncancel: ((Event) -> dynamic)? var oncancel: ((Event) -> dynamic)?
var oncanplay: ((Event) -> dynamic)? var oncanplay: ((Event) -> dynamic)?
var oncanplaythrough: ((Event) -> dynamic)? var oncanplaythrough: ((Event) -> dynamic)?
var onchange: ((Event) -> dynamic)? var onchange: ((Event) -> dynamic)?
var onclick: ((Event) -> dynamic)? var onclick: ((MouseEvent) -> dynamic)?
var onclose: ((Event) -> dynamic)? var onclose: ((Event) -> dynamic)?
var oncontextmenu: ((Event) -> dynamic)? var oncontextmenu: ((MouseEvent) -> dynamic)?
var oncuechange: ((Event) -> dynamic)? var oncuechange: ((Event) -> dynamic)?
var ondblclick: ((Event) -> dynamic)? var ondblclick: ((MouseEvent) -> dynamic)?
var ondrag: ((Event) -> dynamic)? var ondrag: ((DragEvent) -> dynamic)?
var ondragend: ((Event) -> dynamic)? var ondragend: ((DragEvent) -> dynamic)?
var ondragenter: ((Event) -> dynamic)? var ondragenter: ((DragEvent) -> dynamic)?
var ondragexit: ((Event) -> dynamic)? var ondragexit: ((DragEvent) -> dynamic)?
var ondragleave: ((Event) -> dynamic)? var ondragleave: ((DragEvent) -> dynamic)?
var ondragover: ((Event) -> dynamic)? var ondragover: ((DragEvent) -> dynamic)?
var ondragstart: ((Event) -> dynamic)? var ondragstart: ((DragEvent) -> dynamic)?
var ondrop: ((Event) -> dynamic)? var ondrop: ((DragEvent) -> dynamic)?
var ondurationchange: ((Event) -> dynamic)? var ondurationchange: ((Event) -> dynamic)?
var onemptied: ((Event) -> dynamic)? var onemptied: ((Event) -> dynamic)?
var onended: ((Event) -> dynamic)? var onended: ((Event) -> dynamic)?
var onerror: ((dynamic, String, Int, Int, Any?) -> dynamic)? var onerror: ((dynamic, String, Int, Int, Any?) -> dynamic)?
var onfocus: ((Event) -> dynamic)? var onfocus: ((FocusEvent) -> dynamic)?
var oninput: ((Event) -> dynamic)? var oninput: ((InputEvent) -> dynamic)?
var oninvalid: ((Event) -> dynamic)? var oninvalid: ((Event) -> dynamic)?
var onkeydown: ((Event) -> dynamic)? var onkeydown: ((KeyboardEvent) -> dynamic)?
var onkeypress: ((Event) -> dynamic)? var onkeypress: ((KeyboardEvent) -> dynamic)?
var onkeyup: ((Event) -> dynamic)? var onkeyup: ((KeyboardEvent) -> dynamic)?
var onload: ((Event) -> dynamic)? var onload: ((Event) -> dynamic)?
var onloadeddata: ((Event) -> dynamic)? var onloadeddata: ((Event) -> dynamic)?
var onloadedmetadata: ((Event) -> dynamic)? var onloadedmetadata: ((Event) -> dynamic)?
var onloadend: ((Event) -> dynamic)? var onloadend: ((Event) -> dynamic)?
var onloadstart: ((Event) -> dynamic)? var onloadstart: ((ProgressEvent) -> dynamic)?
var onmousedown: ((Event) -> dynamic)? var onmousedown: ((MouseEvent) -> dynamic)?
var onmouseenter: ((Event) -> dynamic)? var onmouseenter: ((MouseEvent) -> dynamic)?
var onmouseleave: ((Event) -> dynamic)? var onmouseleave: ((MouseEvent) -> dynamic)?
var onmousemove: ((Event) -> dynamic)? var onmousemove: ((MouseEvent) -> dynamic)?
var onmouseout: ((Event) -> dynamic)? var onmouseout: ((MouseEvent) -> dynamic)?
var onmouseover: ((Event) -> dynamic)? var onmouseover: ((MouseEvent) -> dynamic)?
var onmouseup: ((Event) -> dynamic)? var onmouseup: ((MouseEvent) -> dynamic)?
var onwheel: ((Event) -> dynamic)? var onwheel: ((WheelEvent) -> dynamic)?
var onpause: ((Event) -> dynamic)? var onpause: ((Event) -> dynamic)?
var onplay: ((Event) -> dynamic)? var onplay: ((Event) -> dynamic)?
var onplaying: ((Event) -> dynamic)? var onplaying: ((Event) -> dynamic)?
var onprogress: ((Event) -> dynamic)? var onprogress: ((ProgressEvent) -> dynamic)?
var onratechange: ((Event) -> dynamic)? var onratechange: ((Event) -> dynamic)?
var onreset: ((Event) -> dynamic)? var onreset: ((Event) -> dynamic)?
var onresize: ((Event) -> dynamic)? var onresize: ((Event) -> dynamic)?
@@ -2215,18 +2215,18 @@ public external interface GlobalEventHandlers {
public external interface WindowEventHandlers { public external interface WindowEventHandlers {
var onafterprint: ((Event) -> dynamic)? var onafterprint: ((Event) -> dynamic)?
var onbeforeprint: ((Event) -> dynamic)? var onbeforeprint: ((Event) -> dynamic)?
var onbeforeunload: ((Event) -> String?)? var onbeforeunload: ((BeforeUnloadEvent) -> String?)?
var onhashchange: ((Event) -> dynamic)? var onhashchange: ((HashChangeEvent) -> dynamic)?
var onlanguagechange: ((Event) -> dynamic)? var onlanguagechange: ((Event) -> dynamic)?
var onmessage: ((Event) -> dynamic)? var onmessage: ((MessageEvent) -> dynamic)?
var onoffline: ((Event) -> dynamic)? var onoffline: ((Event) -> dynamic)?
var ononline: ((Event) -> dynamic)? var ononline: ((Event) -> dynamic)?
var onpagehide: ((Event) -> dynamic)? var onpagehide: ((PageTransitionEvent) -> dynamic)?
var onpageshow: ((Event) -> dynamic)? var onpageshow: ((PageTransitionEvent) -> dynamic)?
var onpopstate: ((Event) -> dynamic)? var onpopstate: ((PopStateEvent) -> dynamic)?
var onrejectionhandled: ((Event) -> dynamic)? var onrejectionhandled: ((Event) -> dynamic)?
var onstorage: ((Event) -> dynamic)? var onstorage: ((StorageEvent) -> dynamic)?
var onunhandledrejection: ((Event) -> dynamic)? var onunhandledrejection: ((PromiseRejectionEvent) -> dynamic)?
var onunload: ((Event) -> dynamic)? var onunload: ((Event) -> dynamic)?
} }
@@ -2454,7 +2454,7 @@ public external open class EventSource(url: String, eventSourceInitDict: EventSo
open val withCredentials: Boolean open val withCredentials: Boolean
open val readyState: Short open val readyState: Short
var onopen: ((Event) -> dynamic)? var onopen: ((Event) -> dynamic)?
var onmessage: ((Event) -> dynamic)? var onmessage: ((MessageEvent) -> dynamic)?
var onerror: ((Event) -> dynamic)? var onerror: ((Event) -> dynamic)?
fun close(): Unit fun close(): Unit
@@ -2492,7 +2492,7 @@ public external open class WebSocket(url: String, protocols: dynamic = definedEx
var onclose: ((Event) -> dynamic)? var onclose: ((Event) -> dynamic)?
open val extensions: String open val extensions: String
open val protocol: String open val protocol: String
var onmessage: ((Event) -> dynamic)? var onmessage: ((MessageEvent) -> dynamic)?
var binaryType: BinaryType var binaryType: BinaryType
fun close(code: Short = definedExternally, reason: String = definedExternally): Unit fun close(code: Short = definedExternally, reason: String = definedExternally): Unit
fun send(data: String): 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 * Exposes the JavaScript [MessagePort](https://developer.mozilla.org/en/docs/Web/API/MessagePort) to Kotlin
*/ */
public external abstract class MessagePort : EventTarget, UnionMessagePortOrWindow, UnionMessagePortOrServiceWorker, UnionClientOrMessagePortOrServiceWorker { 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<dynamic> = definedExternally): Unit fun postMessage(message: Any?, transfer: Array<dynamic> = definedExternally): Unit
fun start(): Unit fun start(): Unit
fun close(): Unit fun close(): Unit
@@ -2566,7 +2566,7 @@ public external abstract class MessagePort : EventTarget, UnionMessagePortOrWind
*/ */
public external open class BroadcastChannel(name: String) : EventTarget { public external open class BroadcastChannel(name: String) : EventTarget {
open val name: String open val name: String
var onmessage: ((Event) -> dynamic)? var onmessage: ((MessageEvent) -> dynamic)?
fun postMessage(message: Any?): Unit fun postMessage(message: Any?): Unit
fun close(): Unit fun close(): Unit
} }
@@ -2583,7 +2583,7 @@ public external abstract class WorkerGlobalScope : EventTarget, WindowOrWorkerGl
open var onoffline: ((Event) -> dynamic)? open var onoffline: ((Event) -> dynamic)?
open var ononline: ((Event) -> dynamic)? open var ononline: ((Event) -> dynamic)?
open var onrejectionhandled: ((Event) -> dynamic)? open var onrejectionhandled: ((Event) -> dynamic)?
open var onunhandledrejection: ((Event) -> dynamic)? open var onunhandledrejection: ((PromiseRejectionEvent) -> dynamic)?
fun importScripts(vararg urls: String): Unit 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 * Exposes the JavaScript [DedicatedWorkerGlobalScope](https://developer.mozilla.org/en/docs/Web/API/DedicatedWorkerGlobalScope) to Kotlin
*/ */
public external abstract class DedicatedWorkerGlobalScope : WorkerGlobalScope { public external abstract class DedicatedWorkerGlobalScope : WorkerGlobalScope {
open var onmessage: ((Event) -> dynamic)? open var onmessage: ((MessageEvent) -> dynamic)?
fun postMessage(message: Any?, transfer: Array<dynamic> = definedExternally): Unit fun postMessage(message: Any?, transfer: Array<dynamic> = definedExternally): Unit
fun close(): 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 * 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 { 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)? override var onerror: ((Event) -> dynamic)?
fun terminate(): Unit fun terminate(): Unit
fun postMessage(message: Any?, transfer: Array<dynamic> = definedExternally): Unit fun postMessage(message: Any?, transfer: Array<dynamic> = definedExternally): Unit
@@ -90,8 +90,8 @@ public external open class FileReader : EventTarget {
open val readyState: Short open val readyState: Short
open val result: dynamic open val result: dynamic
open val error: dynamic open val error: dynamic
var onloadstart: ((Event) -> dynamic)? var onloadstart: ((ProgressEvent) -> dynamic)?
var onprogress: ((Event) -> dynamic)? var onprogress: ((ProgressEvent) -> dynamic)?
var onload: ((Event) -> dynamic)? var onload: ((Event) -> dynamic)?
var onabort: ((Event) -> dynamic)? var onabort: ((Event) -> dynamic)?
var onerror: ((Event) -> dynamic)? var onerror: ((Event) -> dynamic)?
@@ -28,7 +28,7 @@ import org.w3c.xhr.*
* Exposes the JavaScript [Notification](https://developer.mozilla.org/en/docs/Web/API/Notification) to Kotlin * 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 { public external open class Notification(title: String, options: NotificationOptions = definedExternally) : EventTarget {
var onclick: ((Event) -> dynamic)? var onclick: ((MouseEvent) -> dynamic)?
var onerror: ((Event) -> dynamic)? var onerror: ((Event) -> dynamic)?
open val title: String open val title: String
open val dir: NotificationDirection open val dir: NotificationDirection
@@ -49,12 +49,12 @@ public external abstract class ServiceWorkerGlobalScope : WorkerGlobalScope {
open val registration: ServiceWorkerRegistration open val registration: ServiceWorkerRegistration
open var oninstall: ((Event) -> dynamic)? open var oninstall: ((Event) -> dynamic)?
open var onactivate: ((Event) -> dynamic)? open var onactivate: ((Event) -> dynamic)?
open var onfetch: ((Event) -> dynamic)? open var onfetch: ((FetchEvent) -> dynamic)?
open var onforeignfetch: ((Event) -> dynamic)? open var onforeignfetch: ((Event) -> dynamic)?
open var onmessage: ((Event) -> dynamic)? open var onmessage: ((MessageEvent) -> dynamic)?
open var onfunctionalevent: ((Event) -> dynamic)? open var onfunctionalevent: ((Event) -> dynamic)?
open var onnotificationclick: ((Event) -> dynamic)? open var onnotificationclick: ((NotificationEvent) -> dynamic)?
open var onnotificationclose: ((Event) -> dynamic)? open var onnotificationclose: ((NotificationEvent) -> dynamic)?
fun skipWaiting(): Promise<Unit> fun skipWaiting(): Promise<Unit>
} }
@@ -75,7 +75,7 @@ public external abstract class ServiceWorkerContainer : EventTarget {
open val controller: ServiceWorker? open val controller: ServiceWorker?
open val ready: Promise<ServiceWorkerRegistration> open val ready: Promise<ServiceWorkerRegistration>
open var oncontrollerchange: ((Event) -> dynamic)? open var oncontrollerchange: ((Event) -> dynamic)?
open var onmessage: ((Event) -> dynamic)? open var onmessage: ((MessageEvent) -> dynamic)?
fun register(scriptURL: String, options: RegistrationOptions = definedExternally): Promise<ServiceWorkerRegistration> fun register(scriptURL: String, options: RegistrationOptions = definedExternally): Promise<ServiceWorkerRegistration>
fun getRegistration(clientURL: String = definedExternally): Promise<Any?> fun getRegistration(clientURL: String = definedExternally): Promise<Any?>
fun getRegistrations(): Promise<dynamic> fun getRegistrations(): Promise<dynamic>
@@ -28,8 +28,8 @@ import org.w3c.workers.*
* Exposes the JavaScript [XMLHttpRequestEventTarget](https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequestEventTarget) to Kotlin * Exposes the JavaScript [XMLHttpRequestEventTarget](https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequestEventTarget) to Kotlin
*/ */
public external abstract class XMLHttpRequestEventTarget : EventTarget { public external abstract class XMLHttpRequestEventTarget : EventTarget {
open var onloadstart: ((Event) -> dynamic)? open var onloadstart: ((ProgressEvent) -> dynamic)?
open var onprogress: ((Event) -> dynamic)? open var onprogress: ((ProgressEvent) -> dynamic)?
open var onabort: ((Event) -> dynamic)? open var onabort: ((Event) -> dynamic)?
open var onerror: ((Event) -> dynamic)? open var onerror: ((Event) -> dynamic)?
open var onload: ((Event) -> dynamic)? open var onload: ((Event) -> dynamic)?
@@ -91,4 +91,71 @@ val kotlinBuiltinInterfaces = mapOf(
primaryConstructor = null, primaryConstructor = null,
secondaryConstructors = emptyList() secondaryConstructors = emptyList()
) )
) )
val specifyEventMapper = mapOf<String, String>(
"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"
)
+40 -21
View File
@@ -86,26 +86,26 @@ fun generateFunctions(repository: Repository, function: Operation): List<Generat
return listOf(realFunction, getterOrSetterFunction, functionWithCallbackOrNull).filterNotNull() return listOf(realFunction, getterOrSetterFunction, functionWithCallbackOrNull).filterNotNull()
} }
fun generateAttribute(putNoImpl: Boolean, repository: Repository, attribute: Attribute, nullableAttributes: Boolean): GenerateAttribute = fun generateAttribute(putNoImpl: Boolean, repository: Repository, attribute: Attribute, nullableAttributes: Boolean): GenerateAttribute {
GenerateAttribute(attribute.name, val mappedType = mapType(repository, attribute.type).let { if (nullableAttributes) it.toNullable() else it }
type = mapType(repository, attribute.type).let { if (nullableAttributes) it.toNullable() else it }, return GenerateAttribute(attribute.name,
initializer = type = generalizeType(attribute.name, mappedType),
if (putNoImpl && !attribute.static) { initializer =
mapLiteral(attribute.defaultValue, mapType(repository, attribute.type), repository.enums) if (putNoImpl && !attribute.static) {
} mapLiteral(attribute.defaultValue, mapType(repository, attribute.type), repository.enums)
else if (attribute.defaultValue != null) { } else if (attribute.defaultValue != null) {
"definedExternally" "definedExternally"
} } else {
else { null
null },
}, getterSetterNoImpl = putNoImpl,
getterSetterNoImpl = putNoImpl, kind = if (attribute.readOnly) AttributeKind.VAL else AttributeKind.VAR,
kind = if (attribute.readOnly) AttributeKind.VAL else AttributeKind.VAR, override = false,
override = false, vararg = attribute.vararg,
vararg = attribute.vararg, static = attribute.static,
static = attribute.static, required = attribute.required
required = attribute.required )
) }
private fun InterfaceDefinition.superTypes(repository: Repository) = superTypes.map { repository.interfaces[it] }.filterNotNull() private fun InterfaceDefinition.superTypes(repository: Repository) = superTypes.map { repository.interfaces[it] }.filterNotNull()
private fun resolveDefinitionKind(repository: Repository, iface: InterfaceDefinition, constructors: List<ExtendedAttribute> = iface.findConstructors()): GenerateDefinitionKind = private fun resolveDefinitionKind(repository: Repository, iface: InterfaceDefinition, constructors: List<ExtendedAttribute> = 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<GenerateTraitOrClass>) { fun implementInterfaces(declarations: List<GenerateTraitOrClass>) {
val unimplementedMemberMap = getUnimplementedMembers(declarations) val unimplementedMemberMap = getUnimplementedMembers(declarations)
val nonAbstractDeclarations = declarations.filter { it.kind == GenerateDefinitionKind.CLASS } val nonAbstractDeclarations = declarations.filter { it.kind == GenerateDefinitionKind.CLASS }
@@ -266,7 +285,7 @@ fun implementInterfaces(declarations: List<GenerateTraitOrClass>) {
val unimplementedMembers = unimplementedMemberMap[declaration.name] ?: continue val unimplementedMembers = unimplementedMemberMap[declaration.name] ?: continue
for (attribute in unimplementedMembers.attributes) { 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) { for (function in unimplementedMembers.functions) {
declaration.memberFunctions += function.copy(override = true) declaration.memberFunctions += function.copy(override = true)
@@ -19,42 +19,49 @@ package org.jetbrains.idl2k
import java.util.* import java.util.*
private val typeMapper = mapOf( private val typeMapper = mapOf(
"unsignedlong" to SimpleType("Int", false), "unsignedlong" to SimpleType("Int", false),
"unsignedlonglong" to SimpleType("Int", false), "unsignedlonglong" to SimpleType("Int", false),
"longlong" to SimpleType("Int", false), "longlong" to SimpleType("Int", false),
"unsignedshort" to SimpleType("Short", false), "unsignedshort" to SimpleType("Short", false),
"unsignedbyte" to SimpleType("Byte", false), "unsignedbyte" to SimpleType("Byte", false),
"octet" to SimpleType("Byte", false), "octet" to SimpleType("Byte", false),
"void" to UnitType, "void" to UnitType,
"boolean" to SimpleType("Boolean", false), "boolean" to SimpleType("Boolean", false),
"byte" to SimpleType("Byte", false), "byte" to SimpleType("Byte", false),
"short" to SimpleType("Short", false), "short" to SimpleType("Short", false),
"long" to SimpleType("Int", false), "long" to SimpleType("Int", false),
"float" to SimpleType("Float", false), "float" to SimpleType("Float", false),
"double" to SimpleType("Double", false), "double" to SimpleType("Double", false),
"any" to AnyType(true), "any" to AnyType(true),
"DOMTimeStamp" to SimpleType("Number", false), "DOMTimeStamp" to SimpleType("Number", false),
"object" to DynamicType, // TODO map to Any? "object" to DynamicType, // TODO map to Any?
"WindowProxy" to SimpleType("Window", false), "WindowProxy" to SimpleType("Window", false),
"USVString" to SimpleType("String", false), "USVString" to SimpleType("String", false),
"DOMString" to SimpleType("String", false), "DOMString" to SimpleType("String", false),
"ByteString" to SimpleType("String", false), "ByteString" to SimpleType("String", false),
"DOMError" to DynamicType, "DOMError" to DynamicType,
"Elements" to DynamicType, "Elements" to DynamicType,
"Date" to SimpleType("Date", false), "Date" to SimpleType("Date", false),
"" to DynamicType "" to DynamicType
) )
fun GenerateTraitOrClass.allSuperTypes(all: Map<String, GenerateTraitOrClass>) = LinkedHashSet<GenerateTraitOrClass>().let { result -> allSuperTypesImpl(listOf(this), all, result); result.toList() } fun GenerateTraitOrClass.allSuperTypes(all: Map<String, GenerateTraitOrClass>) =
LinkedHashSet<GenerateTraitOrClass>().let { result -> allSuperTypesImpl(listOf(this), all, result); result.toList() }
tailrec fun allSuperTypesImpl(roots: List<GenerateTraitOrClass>, all: Map<String, GenerateTraitOrClass>, result: MutableSet<GenerateTraitOrClass>) { tailrec fun allSuperTypesImpl(
roots: List<GenerateTraitOrClass>,
all: Map<String, GenerateTraitOrClass>,
result: MutableSet<GenerateTraitOrClass>
) {
if (roots.isNotEmpty()) { 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<String>, standardTypes: Set<Type> = standardTypes()): Type = when { fun Type.dynamicIfUnknownType(allTypes: Set<String>, standardTypes: Set<Type> = standardTypes()): Type = when {
this is DynamicType || this is UnitType -> this this is DynamicType || this is UnitType -> this
@@ -62,7 +69,16 @@ fun Type.dynamicIfUnknownType(allTypes: Set<String>, standardTypes: Set<Type> =
this.dropNullable() in standardTypes -> this this.dropNullable() in standardTypes -> this
this is ArrayType -> copy(memberType = this.memberType.dynamicIfUnknownType(allTypes, standardTypes)) this is ArrayType -> copy(memberType = this.memberType.dynamicIfUnknownType(allTypes, standardTypes))
this is UnionType -> if (this.name !in allTypes) DynamicType else this 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 -> this is PromiseType ->
copy(valueType = valueType.dynamicIfUnknownType(allTypes, standardTypes)) 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 PromiseType -> type.copy(valueType = mapType(repository, type.valueType))
is ArrayType -> type.copy(memberType = mapType(repository, type.memberType)) 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( is FunctionType -> type.copy(
// TODO: Remove takeWhile { !vararg } when we have varargs supported. See KT-3115 // TODO: Remove takeWhile { !vararg } when we have varargs supported. See KT-3115
returnType = mapType(repository, type.returnType).dynamicIfAnyType(), returnType = mapType(repository, type.returnType).dynamicIfAnyType(),
parameterTypes = type.parameterTypes.takeWhile { !it.vararg }.map { it.copy(type = mapType(repository, it.type)) } parameterTypes = type.parameterTypes.takeWhile { !it.vararg }.map { it.copy(type = mapType(repository, it.type)) }
) )
is AnyType, is AnyType,
@@ -100,30 +120,39 @@ private fun mapTypedef(repository: Repository, type: SimpleType): Type {
val typedef = repository.typeDefs[type.type]!! val typedef = repository.typeDefs[type.type]!!
return when { 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) typedef.types is UnionType -> SimpleType(typedef.name, type.nullable)
else -> mapType(repository, typedef.types.withNullability(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<String, GenerateTraitOrClass>) = internal fun collectUnionTypes(allTypes: Map<String, GenerateTraitOrClass>) =
allTypes.values.asSequence() allTypes.values.asSequence()
.flatMap { .flatMap {
it.secondaryConstructors.asSequence().flatMap { it.constructor.allTypes() } + it.secondaryConstructors.asSequence().flatMap { it.constructor.allTypes() } +
sequenceOf(it.primaryConstructor).filterNotNull().flatMap { it.constructor.allTypes() } + sequenceOf(it.primaryConstructor).filterNotNull().flatMap { it.constructor.allTypes() } +
it.memberAttributes.asSequence().map { it.type } + it.memberAttributes.asSequence().map { it.type } +
it.memberFunctions.asSequence().flatMap { it.allTypes() } it.memberFunctions.asSequence().flatMap { it.allTypes() }
} }
.filterIsInstance<UnionType>() .filterIsInstance<UnionType>()
.map { it.dropNullable() } .map { it.dropNullable() }
.filter { it.memberTypes.all { unionMember -> unionMember is SimpleType && unionMember.type in allTypes } } .filter { it.memberTypes.all { unionMember -> unionMember is SimpleType && unionMember.type in allTypes } }
.distinct() .distinct()
.map { it.copy(namespace = guessPackage(it.memberTypes.filterIsInstance<SimpleType>().map { it.type }, allTypes), types = it.memberTypes) } .map {
it.copy(
namespace = guessPackage(it.memberTypes.filterIsInstance<SimpleType>().map { it.type }, allTypes),
types = it.memberTypes
)
}
private fun guessPackage(types : List<String>, allTypes: Map<String, GenerateTraitOrClass>) = private fun guessPackage(types: List<String>, allTypes: Map<String, GenerateTraitOrClass>) =
types.map { allTypes[it] } types.map { allTypes[it] }
.map { it?.namespace } .map { it?.namespace }
.filterNotNull() .filterNotNull()
.filter { it.isNotEmpty() } .filter { it.isNotEmpty() }