From 42f1f9df0364bc4e66d0bf04882de5f94e4df44a Mon Sep 17 00:00:00 2001 From: Sergey Mashkov Date: Wed, 13 May 2015 19:17:18 +0300 Subject: [PATCH] JS Union type members should have inherit corresponding marker interface --- js/js.libraries/src/generated/org.w3c.dom.kt | 13 ++++++++----- libraries/tools/idl2k/src/main/kotlin/gen.kt | 2 +- libraries/tools/idl2k/src/main/kotlin/main.kt | 5 +++-- .../tools/idl2k/src/main/kotlin/typeMappings.kt | 1 + 4 files changed, 13 insertions(+), 8 deletions(-) diff --git a/js/js.libraries/src/generated/org.w3c.dom.kt b/js/js.libraries/src/generated/org.w3c.dom.kt index 05e2896865d..9ff9ec001db 100644 --- a/js/js.libraries/src/generated/org.w3c.dom.kt +++ b/js/js.libraries/src/generated/org.w3c.dom.kt @@ -3022,7 +3022,7 @@ native public open class DragEventInit : MouseEventInit() { var dataTransfer: DataTransfer? } -native public trait Window : EventTarget { +native public trait Window : EventTarget, UnionMessagePortOrWindow { var caches: CacheStorage get() = noImpl set(value) = noImpl @@ -3638,20 +3638,20 @@ native public open class MessageEvent(type: String, eventInitDict: MessageEventI var lastEventId: String get() = noImpl set(value) = noImpl - var source: dynamic + var source: UnionMessagePortOrWindow? get() = noImpl set(value) = noImpl var ports: Array get() = noImpl set(value) = noImpl - fun initMessageEvent(typeArg: String, canBubbleArg: Boolean, cancelableArg: Boolean, dataArg: dynamic, originArg: String, lastEventIdArg: String, sourceArg: dynamic, portsArg: Array): Unit = noImpl + fun initMessageEvent(typeArg: String, canBubbleArg: Boolean, cancelableArg: Boolean, dataArg: dynamic, originArg: String, lastEventIdArg: String, sourceArg: UnionMessagePortOrWindow, portsArg: Array): Unit = noImpl } native public open class MessageEventInit : EventInit() { var data: dynamic var origin: String var lastEventId: String - var source: dynamic + var source: UnionMessagePortOrWindow? var ports: Array } @@ -3759,7 +3759,7 @@ native public open class MessageChannel { set(value) = noImpl } -native public trait MessagePort : EventTarget, Transferable { +native public trait MessagePort : EventTarget, UnionMessagePortOrWindow, UnionMessagePortOrServiceWorker, UnionClientOrMessagePortOrServiceWorker, Transferable { var onmessage: ((Event) -> dynamic)? get() = noImpl set(value) = noImpl @@ -4836,6 +4836,9 @@ native public marker trait UnionAudioTrackOrTextTrackOrVideoTrack { native public marker trait UnionElementOrMouseEvent { } +native public marker trait UnionMessagePortOrWindow { +} + native public marker trait UnionElementOrProcessingInstruction { } diff --git a/libraries/tools/idl2k/src/main/kotlin/gen.kt b/libraries/tools/idl2k/src/main/kotlin/gen.kt index 6c64346327f..c49fb619af3 100644 --- a/libraries/tools/idl2k/src/main/kotlin/gen.kt +++ b/libraries/tools/idl2k/src/main/kotlin/gen.kt @@ -170,7 +170,7 @@ fun generateUnions(ifaces: List, typedefs: Iterable type in declaredTypes } } val typedefsMarkersMap = typedefsToBeGenerated.groupBy { it.name }.mapValues { mapUnionType(it.value.first().value).copy(name = it.key) } - val typeNamesToUnions = anonymousUnionTypes.flatMap { unionType -> unionType.memberTypes.map { unionMember -> unionMember to unionType.name } }.toMultiMap() + + val typeNamesToUnions = anonymousUnionTypes.flatMap { unionType -> unionType.memberTypes.map { unionMember -> unionMember to unionType.name } }.toMultiMap() merge typedefsToBeGenerated.flatMap { typedef -> typedef.value.memberTypes.map { unionMember -> unionMember to typedef.name } }.toMultiMap() return GenerateUnionTypes( diff --git a/libraries/tools/idl2k/src/main/kotlin/main.kt b/libraries/tools/idl2k/src/main/kotlin/main.kt index b2b32402637..ec4afd293c9 100644 --- a/libraries/tools/idl2k/src/main/kotlin/main.kt +++ b/libraries/tools/idl2k/src/main/kotlin/main.kt @@ -13,8 +13,6 @@ fun main(args: Array) { System.exit(1) return } - outDir.deleteRecursively() - outDir.mkdirs() val repository = srcDir.walkTopDown().filter { it.isDirectory() || it.extension == "idl" }.asSequence().filter { it.isFile() }.fold(Repository(emptyMap(), emptyMap(), emptyMap(), emptyMap())) { acc, e -> val fileRepository = parseIDL(ANTLRFileStream(e.getAbsolutePath(), "UTF-8")) @@ -31,6 +29,9 @@ fun main(args: Array) { val unions = generateUnions(definitions, repository.typeDefs.values()) val allPackages = definitions.map { it.namespace }.distinct().sort() + outDir.deleteRecursively() + outDir.mkdirs() + allPackages.forEach { pkg -> File(outDir, pkg + ".kt").bufferedWriter().use { w -> w.appendln("/*") diff --git a/libraries/tools/idl2k/src/main/kotlin/typeMappings.kt b/libraries/tools/idl2k/src/main/kotlin/typeMappings.kt index cdd66c721b7..abddd9392b6 100644 --- a/libraries/tools/idl2k/src/main/kotlin/typeMappings.kt +++ b/libraries/tools/idl2k/src/main/kotlin/typeMappings.kt @@ -102,6 +102,7 @@ private fun mapType(repository: Repository, type: String): String = type.startsWith("unrestricted") -> mapType(repository, type.substring(12)) type.startsWith("sequence<") -> "Array<${mapType(repository, type.removePrefix("sequence<").removeSuffix(">").trim())}>" type.startsWith("sequence") -> "Array" + type.startsWith("Union<") -> "Union<" + splitUnionType(type).map { mapType(repository, it) }.join(",") + ">" type in repository.typeDefs -> mapTypedef(repository, type) type in repository.enums -> "String" type.contains("->") -> {