JS: prevent IDL2K from generating @nativeGetter/@nativeSetter annotations, generate inline extension function with asDynamic() instead

This commit is contained in:
Alexey Andreev
2017-01-20 15:37:39 +03:00
parent c1838d423b
commit 36d2a91057
+36 -20
View File
@@ -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} {")