Skip to content

Commit

Permalink
Browser. Immutable JSO interfaces
Browse files Browse the repository at this point in the history
  • Loading branch information
turansky committed Oct 9, 2024
1 parent f154509 commit 8082311
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 11 deletions.
22 changes: 13 additions & 9 deletions buildSrc/src/main/kotlin/karakum/browser/Html.kt
Original file line number Diff line number Diff line change
Expand Up @@ -1153,7 +1153,7 @@ internal fun convertInterface(

else -> {
if (abortable) {
result.replace("var signal: AbortSignal?", "override var signal: AbortSignal?")
result.replace("val signal: AbortSignal?", "override val signal: AbortSignal?")
} else result
}
}
Expand All @@ -1175,22 +1175,25 @@ internal fun convertInterface(
.filter { it.isNotEmpty() }
.joinToString("\n\n")

val annotations = when {
!declaration.startsWith("interface ") -> ""
"= definedExternally" in members -> ""
val annotations = if (IDLRegistry.isPlainObjectInterface(name)) {
require(declaration.startsWith("interface ")) {
"JSO `$name` should be interface"
}

require("= definedExternally" !in members) {
"JSO `$name` should not contain default properties"
}

IDLRegistry.isPlainObjectInterface(name) -> {
when (name) {
when (name) {
"QueuingStrategy",
-> "// @JsPlainObject"

else -> "@JsPlainObject"
}
} else {
""
}

else -> ""
}

val modifier = when {
name == DOM_EXCEPTION ||
name == "Animation" ||
Expand Down Expand Up @@ -1792,6 +1795,7 @@ private fun convertProperty(
typeProvider: TypeProvider,
): String? {
val isVal = source.startsWith("readonly ")
|| typeProvider.readonlyMode
val modifier = if (isVal) "val" else "var"

var (name, type) = source.removePrefix("readonly ").let {
Expand Down
17 changes: 15 additions & 2 deletions buildSrc/src/main/kotlin/karakum/browser/IDL.kt
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,19 @@ internal object IDLRegistry {

fun isPlainObjectInterface(
name: String,
): Boolean =
name in plainObjectInterfaces || name.endsWith("Options")
): Boolean {
if (name in plainObjectInterfaces)
return true

if (!name.endsWith("Options"))
return false

return when (name) {
"LocaleOptions",
"PushSubscriptionOptions",
-> false

else -> true
}
}
}
3 changes: 3 additions & 0 deletions buildSrc/src/main/kotlin/karakum/browser/Numbers.kt
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,9 @@ internal class TypeProvider(
}
}

val readonlyMode: Boolean =
IDLRegistry.isPlainObjectInterface(parentType)

fun isDefined(): Boolean =
parentType in Mixins.ALL

Expand Down

0 comments on commit 8082311

Please sign in to comment.