JS: prevent IDL2K from generating @nativeGetter/@nativeSetter annotations, generate inline extension function with asDynamic() instead
This commit is contained in:
@@ -100,32 +100,38 @@ private fun Appendable.renderArgumentsDeclaration(args: List<GenerateAttribute>,
|
|||||||
|
|
||||||
private fun renderCall(call: GenerateFunctionCall) = "${call.name.replaceKeywords()}(${call.arguments.joinToString(separator = ", ", transform = String::replaceKeywords)})"
|
private fun renderCall(call: GenerateFunctionCall) = "${call.name.replaceKeywords()}(${call.arguments.joinToString(separator = ", ", transform = String::replaceKeywords)})"
|
||||||
|
|
||||||
private fun Appendable.renderFunctionDeclaration(f: GenerateFunction, override: Boolean, commented: Boolean, level: Int = 1) {
|
private fun Appendable.renderFunctionDeclaration(owner: String, f: GenerateFunction, override: Boolean, commented: Boolean, level: Int = 1) {
|
||||||
indent(commented, level)
|
indent(commented, level)
|
||||||
|
|
||||||
if (f.nativeGetterOrSetter == NativeGetterOrSetter.GETTER
|
|
||||||
&& !f.returnType.nullable
|
|
||||||
&& f.returnType != DynamicType) {
|
|
||||||
appendln("@Suppress(\"NATIVE_GETTER_RETURN_TYPE_SHOULD_BE_NULLABLE\")")
|
|
||||||
indent(commented, level)
|
|
||||||
}
|
|
||||||
|
|
||||||
when (f.nativeGetterOrSetter) {
|
|
||||||
NativeGetterOrSetter.GETTER -> { appendln("@nativeGetter"); indent(commented, level); append("operator ") }
|
|
||||||
NativeGetterOrSetter.SETTER -> { appendln("@nativeSetter"); indent(commented, level); append("operator ") }
|
|
||||||
NativeGetterOrSetter.NONE -> {}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (override) {
|
if (override) {
|
||||||
append("override ")
|
append("override ")
|
||||||
}
|
}
|
||||||
|
if (f.nativeGetterOrSetter != NativeGetterOrSetter.NONE) {
|
||||||
|
append("inline operator ")
|
||||||
|
}
|
||||||
|
|
||||||
if (f.name in keywords) {
|
if (f.name in keywords) {
|
||||||
append("@JsName(\"${f.name}\") ")
|
append("@JsName(\"${f.name}\") ")
|
||||||
}
|
}
|
||||||
append("fun ${f.name.replaceKeywords()}")
|
append("fun ")
|
||||||
|
if (f.nativeGetterOrSetter != NativeGetterOrSetter.NONE) {
|
||||||
|
append("$owner.")
|
||||||
|
}
|
||||||
|
append(f.name.replaceKeywords())
|
||||||
renderArgumentsDeclaration(f.arguments, override)
|
renderArgumentsDeclaration(f.arguments, override)
|
||||||
appendln(": ${f.returnType.render()}")
|
append(": ${f.returnType.render()}")
|
||||||
|
|
||||||
|
when (f.nativeGetterOrSetter) {
|
||||||
|
NativeGetterOrSetter.GETTER -> {
|
||||||
|
append(" = asDynamic()[${f.arguments[0].name}]")
|
||||||
|
}
|
||||||
|
NativeGetterOrSetter.SETTER -> {
|
||||||
|
append(" { asDynamic()[${f.arguments[0].name}] = ${f.arguments[1].name}; }")
|
||||||
|
}
|
||||||
|
NativeGetterOrSetter.NONE -> {}
|
||||||
|
}
|
||||||
|
|
||||||
|
appendln()
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun List<GenerateAttribute>.hasNoVars() = none { it.isVar }
|
private fun List<GenerateAttribute>.hasNoVars() = none { it.isVar }
|
||||||
@@ -210,10 +216,20 @@ fun Appendable.render(allTypes: Map<String, GenerateTraitOrClass>, typeNamesToUn
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
iface.memberFunctions.filter { (it !in superFunctions || it.override) && !it.static }.map { it.dynamicIfUnknownType(allTypes.keys) }.groupBy { it.signature }.reduceValues(::betterFunction).values.forEach {
|
val memberFunctions = iface.memberFunctions.filter { (it !in superFunctions || it.override) && !it.static }
|
||||||
renderFunctionDeclaration(it.fixRequiredArguments(iface.name), it.signature in superSignatures || it.override, commented = it.isCommented(iface.name))
|
.map { it.dynamicIfUnknownType(allTypes.keys) }.groupBy { it.signature }.reduceValues(::betterFunction).values
|
||||||
|
|
||||||
|
fun doRenderFunction(function: GenerateFunction, level: Int = 1) {
|
||||||
|
renderFunctionDeclaration(
|
||||||
|
iface.name, function.fixRequiredArguments(iface.name),
|
||||||
|
function.signature in superSignatures || function.override,
|
||||||
|
commented = function.isCommented(iface.name),
|
||||||
|
level = level
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
memberFunctions.filter { it.nativeGetterOrSetter == NativeGetterOrSetter.NONE }.forEach { doRenderFunction(it) }
|
||||||
|
|
||||||
val staticAttributes = iface.memberAttributes.filter { it.static }
|
val staticAttributes = iface.memberAttributes.filter { it.static }
|
||||||
val staticFunctions = iface.memberFunctions.filter { it.static }
|
val staticFunctions = iface.memberFunctions.filter { it.static }
|
||||||
|
|
||||||
@@ -228,13 +244,14 @@ fun Appendable.render(allTypes: Map<String, GenerateTraitOrClass>, typeNamesToUn
|
|||||||
renderAttributeDeclarationAsProperty(it, MemberModality.FINAL, level = 2, commented = it.isCommented(iface.name))
|
renderAttributeDeclarationAsProperty(it, MemberModality.FINAL, level = 2, commented = it.isCommented(iface.name))
|
||||||
}
|
}
|
||||||
staticFunctions.forEach {
|
staticFunctions.forEach {
|
||||||
renderFunctionDeclaration(it.fixRequiredArguments(iface.name), override = false, level = 2, commented = it.isCommented(iface.name))
|
renderFunctionDeclaration(iface.name, it.fixRequiredArguments(iface.name), override = false, level = 2, commented = it.isCommented(iface.name))
|
||||||
}
|
}
|
||||||
indent(false, 1)
|
indent(false, 1)
|
||||||
appendln("}")
|
appendln("}")
|
||||||
}
|
}
|
||||||
|
|
||||||
appendln("}")
|
appendln("}")
|
||||||
|
memberFunctions.filter { it.nativeGetterOrSetter != NativeGetterOrSetter.NONE }.forEach { doRenderFunction(it, 0) }
|
||||||
appendln()
|
appendln()
|
||||||
|
|
||||||
if (iface.generateBuilderFunction) {
|
if (iface.generateBuilderFunction) {
|
||||||
@@ -249,7 +266,6 @@ fun Appendable.renderBuilderFunction(dictionary: GenerateTraitOrClass, allSuperT
|
|||||||
.dynamicIfUnknownType(allTypes)
|
.dynamicIfUnknownType(allTypes)
|
||||||
.map { if (it.initializer == null && (it.type.nullable || it.type == DynamicType) && !it.required) it.copy(initializer = "null") else it }
|
.map { if (it.initializer == null && (it.type.nullable || it.type == DynamicType) && !it.required) it.copy(initializer = "null") else it }
|
||||||
|
|
||||||
appendln("@Suppress(\"NOTHING_TO_INLINE\")")
|
|
||||||
append("public inline fun ${dictionary.name}")
|
append("public inline fun ${dictionary.name}")
|
||||||
renderArgumentsDeclaration(fields)
|
renderArgumentsDeclaration(fields)
|
||||||
appendln(": ${dictionary.name} {")
|
appendln(": ${dictionary.name} {")
|
||||||
|
|||||||
Reference in New Issue
Block a user