Edoardo Luppi
07/19/2023, 7:59 AMopen external class XMLParser(options: X2jOptions = definedExternally) {
open fun <T> parse(xmlData: String, validationOptions: ValidationOptions = definedExternally): T
open fun <T> parse(xmlData: String): T
open fun <T> parse(xmlData: String, validationOptions: Boolean = definedExternally): T
open fun <T> parse(xmlData: Buffer, validationOptions: ValidationOptions = definedExternally): T
open fun <T> parse(xmlData: Buffer): T
open fun <T> parse(xmlData: Buffer, validationOptions: Boolean = definedExternally): T
open fun addEntity(entityIdentifier: String, entityValue: String)
}
The parse
function returns any
in the TS version (fxp.d.ts). It basically return a JSON-like object.
To represent the T
type in Kotlin, should I use an interface or a class?Edoardo Luppi
07/19/2023, 8:22 AMT
types are not `JsExport`ed, how do I prevent name mangling of properties?Artem Kobzar
07/19/2023, 9:34 AMEdoardo Luppi
07/19/2023, 9:37 AMJsName
turns off mangling, and I get the desired property name.
It's also important to use a class
, if it's not `JsExport`ed.
If you use an interface
, like
interface ParseResult {
val messages: Array<String>
}
The generated JS will have a function call instead of a property access.Edoardo Luppi
07/19/2023, 9:38 AMcommonMain
, I can't use external definitions, which - maybe - would have been better suitedArtem Kobzar
07/19/2023, 9:40 AMJsExport
right now, and I'm changing the behavior.Edoardo Luppi
07/19/2023, 9:51 AMEdoardo Luppi
07/19/2023, 12:01 PMval messages > getMessages()
), will the new property-by-default behavior be customizable to generate a function call instead?Artem Kobzar
07/19/2023, 12:18 PMEdoardo Luppi
07/19/2023, 12:41 PMThe same situation with the interface with theright nowJsExport
@JsExport
public interface ZMessage {
public val number: Int
public val text: String
}
KT usage site:
// Returns Array<ZMessage>, which simply type some data returned by Fast XML Parser
val messages = service.doSomething()
println(messages?.last()?.number)
Generated JS code:
var tmp2_safe_receiver = this.result10__1;
var tmp3_safe_receiver = tmp2_safe_receiver == null ? null : last(tmp2_safe_receiver);
println(tmp3_safe_receiver == null ? null : tmp3_safe_receiver.number);
It seems working as expected to me (tmp3_safe_receiver.number
). Or did you mean something else?
In my case the issue manifest when I remove JsExport
.
public interface ZMessage {
@JsName("number")
public val number: Int
public val text: String
}
Generated JS code:
var tmp2_safe_receiver = this.result10__1;
var tmp3_safe_receiver = tmp2_safe_receiver == null ? null : last(tmp2_safe_receiver);
println(tmp3_safe_receiver == null ? null : tmp3_safe_receiver.get_number_hay53m_k$());
Note tmp3_safe_receiver.get_number_hay53m_k$()
JsName
turns off mangling only for classes it seems.Artem Kobzar
07/19/2023, 12:45 PMZMessage
typeEdoardo Luppi
07/19/2023, 12:48 PMwill annotate the message variable withYou mean only if you explicitly specify the type? LiketypeZMessage
val messages: Array<ZMessage> = service...
Or
val message: ZMessage = messages.last()
Artem Kobzar
07/19/2023, 12:55 PMEdoardo Luppi
07/19/2023, 1:03 PMEdoardo Luppi
07/19/2023, 1:08 PMArtem Kobzar
07/19/2023, 1:19 PM