@@ -13,7 +13,12 @@ import javax.xml.parsers.SAXParserFactory
1313import org.gradle.api.DefaultTask
1414import org.gradle.api.tasks.TaskAction
1515
16- data class Config (val project : String , val xsd : String , val outputDir : String )
16+ data class Config (
17+ val project : String ,
18+ val xsd : String ,
19+ val outputDir : String ,
20+ val jsExport : Boolean ,
21+ )
1722
1823// Entry points for schema parsing and code generation
1924val configs =
@@ -22,11 +27,13 @@ val configs =
2227 project = " cql" ,
2328 xsd = " ../../cql-lm/schema/model/modelinfo.xsd" ,
2429 outputDir = " ../cql/build/generated/sources/cql/commonMain/kotlin" ,
30+ jsExport = false ,
2531 ),
2632 Config (
2733 project = " elm" ,
2834 xsd = " ../../cql-lm/schema/elm/library.xsd" ,
2935 outputDir = " ../elm/build/generated/sources/elm/commonMain/kotlin" ,
36+ jsExport = true ,
3037 ),
3138 )
3239
@@ -350,7 +357,7 @@ fun getOwnAttributes(complexType: XSComplexType): List<XSAttributeUse> {
350357}
351358
352359// Creates a class for a complex type with nested classes for nested anonymous complex types
353- fun buildClass (complexType : XSComplexType , className : ClassName ): TypeSpec {
360+ fun getClassBuilder (complexType : XSComplexType , className : ClassName ): TypeSpec . Builder {
354361 return TypeSpec .classBuilder(className)
355362 .apply {
356363 if (complexType.isAbstract) {
@@ -503,7 +510,10 @@ fun buildClass(complexType: XSComplexType, className: ClassName): TypeSpec {
503510 )
504511
505512 // Add a nested class for the anonymous complex type
506- addType(buildClass(elementDecl.type.asComplexType(), nestedClassName))
513+ addType(
514+ getClassBuilder(elementDecl.type.asComplexType(), nestedClassName)
515+ .build()
516+ )
507517
508518 addElement(elementDecl, nestedClassName, className, particle.isRepeated)
509519 } else {
@@ -608,7 +618,6 @@ fun buildClass(complexType: XSComplexType, className: ClassName): TypeSpec {
608618 .build()
609619 )
610620 .addType(TypeSpec .companionObjectBuilder().build())
611- .build()
612621}
613622
614623// Returns all subtypes of a complex type (including indirect subtypes)
@@ -1124,6 +1133,29 @@ fun FileSpec.Builder.addSerializers(
11241133 return this
11251134}
11261135
1136+ // Adds `@JsOnlyExport`
1137+ fun TypeSpec.Builder.addJsExport (): TypeSpec .Builder {
1138+ addAnnotation(
1139+ AnnotationSpec .builder(ClassName (" kotlin" , " OptIn" ))
1140+ .addMember(" %T::class" , ClassName (" kotlin.js" , " ExperimentalJsExport" ))
1141+ .build()
1142+ )
1143+ addAnnotation(ClassName (" org.cqframework.cql.shared" , " JsOnlyExport" ))
1144+
1145+ return this
1146+ }
1147+
1148+ // Adds `@file:Suppress("UNNECESSARY_SAFE_CALL")`
1149+ fun FileSpec.Builder.addSuppressSafeCalls (): FileSpec .Builder {
1150+ addAnnotation(
1151+ AnnotationSpec .builder(ClassName (" kotlin" , " Suppress" ))
1152+ .addMember(" %S" , " UNNECESSARY_SAFE_CALL" )
1153+ .build()
1154+ )
1155+
1156+ return this
1157+ }
1158+
11271159open class XsdKotlinGenTask : DefaultTask () {
11281160
11291161 @TaskAction
@@ -1156,6 +1188,11 @@ open class XsdKotlinGenTask : DefaultTask() {
11561188 FileSpec .builder(typeName)
11571189 .addType(
11581190 TypeSpec .enumBuilder(typeName)
1191+ .apply {
1192+ if (config.jsExport) {
1193+ addJsExport()
1194+ }
1195+ }
11591196 .primaryConstructor(
11601197 FunSpec .constructorBuilder()
11611198 .addParameter(" value" , String ::class )
@@ -1226,8 +1263,17 @@ open class XsdKotlinGenTask : DefaultTask() {
12261263
12271264 // Generate the class and XML and JSON parsers and serializers
12281265 FileSpec .builder(className)
1229- .addType(buildClass(complexType, className))
1266+ .addType(
1267+ getClassBuilder(complexType, className)
1268+ .apply {
1269+ if (config.jsExport) {
1270+ addJsExport()
1271+ }
1272+ }
1273+ .build()
1274+ )
12301275 .addSerializers(complexType, className)
1276+ .addSuppressSafeCalls()
12311277 .build()
12321278 .writeTo(File (project.projectDir, config.outputDir))
12331279 }
0 commit comments