1*3c321d95SSadaf EbrahimiKotlinPoet-metadata 2*3c321d95SSadaf Ebrahimi=================== 3*3c321d95SSadaf Ebrahimi 4*3c321d95SSadaf Ebrahimi`interop:kotlinx-metadata` is an API for working with Kotlin `@Metadata` annotations. Its API 5*3c321d95SSadaf Ebrahimisits atop [kotlinx-metadata](https://github.com/JetBrains/kotlin/tree/master/libraries/kotlinx-metadata/jvm), 6*3c321d95SSadaf Ebrahimioffering extensions for its types + JVM metadata information. This can be used to read 7*3c321d95SSadaf EbrahimiKotlin language semantics off of `Class` or `TypeElement` `@Metadata` annotations. 8*3c321d95SSadaf Ebrahimi 9*3c321d95SSadaf Ebrahimi### Example 10*3c321d95SSadaf Ebrahimi 11*3c321d95SSadaf Ebrahimi```kotlin 12*3c321d95SSadaf Ebrahimidata class Taco(val seasoning: String, val soft: Boolean) { 13*3c321d95SSadaf Ebrahimi fun prepare() { 14*3c321d95SSadaf Ebrahimi 15*3c321d95SSadaf Ebrahimi } 16*3c321d95SSadaf Ebrahimi} 17*3c321d95SSadaf Ebrahimi 18*3c321d95SSadaf Ebrahimival kmClass = Taco::class.toKmClass() 19*3c321d95SSadaf Ebrahimi 20*3c321d95SSadaf Ebrahimi// Now you can access misc information about Taco from a Kotlin lens 21*3c321d95SSadaf Ebrahimiprintln(kmClass.name) 22*3c321d95SSadaf EbrahimikmClass.properties.forEach { println(it.name) } 23*3c321d95SSadaf EbrahimikmClass.functions.forEach { println(it.name) } 24*3c321d95SSadaf Ebrahimi``` 25*3c321d95SSadaf Ebrahimi 26*3c321d95SSadaf Ebrahimi### Flags 27*3c321d95SSadaf Ebrahimi 28*3c321d95SSadaf EbrahimiThere are a number of boolean flags available to types as well under `Flags.kt`. These read the 29*3c321d95SSadaf Ebrahimiunderlying kotlinx-metadata `Flags` property. 30*3c321d95SSadaf Ebrahimi 31*3c321d95SSadaf EbrahimiUsing the Taco example above, we can glean certain information: 32*3c321d95SSadaf Ebrahimi 33*3c321d95SSadaf Ebrahimi```kotlin 34*3c321d95SSadaf Ebrahimiprintln("Is class? ${kmClass.isClass}") 35*3c321d95SSadaf Ebrahimiprintln("Is data class? ${kmClass.isData}") 36*3c321d95SSadaf Ebrahimi``` 37*3c321d95SSadaf Ebrahimi 38*3c321d95SSadaf Ebrahimi### Interop with KotlinPoet 39*3c321d95SSadaf Ebrahimi 40*3c321d95SSadaf Ebrahimi`interop:kotlinx-metadata` offers an API for converting core kotlinx-metadata `Km` types to 41*3c321d95SSadaf EbrahimiKotlinPoet source representations of their APIs. This includes full type resolution, signatures, 42*3c321d95SSadaf Ebrahimienclosed elements, and general stub source representations of the underlying API. 43*3c321d95SSadaf Ebrahimi 44*3c321d95SSadaf Ebrahimi### Example 45*3c321d95SSadaf Ebrahimi 46*3c321d95SSadaf Ebrahimi```kotlin 47*3c321d95SSadaf Ebrahimidata class Taco(val seasoning: String, val soft: Boolean) { 48*3c321d95SSadaf Ebrahimi fun prepare() { 49*3c321d95SSadaf Ebrahimi } 50*3c321d95SSadaf Ebrahimi} 51*3c321d95SSadaf Ebrahimi 52*3c321d95SSadaf Ebrahimival typeSpec = Taco::class.toTypeSpec() 53*3c321d95SSadaf Ebrahimi 54*3c321d95SSadaf Ebrahimi// Or FileSpec 55*3c321d95SSadaf Ebrahimival fileSpec = Taco::class.toFileSpec() 56*3c321d95SSadaf Ebrahimi``` 57*3c321d95SSadaf Ebrahimi 58*3c321d95SSadaf Ebrahimi### Source representation 59*3c321d95SSadaf Ebrahimi 60*3c321d95SSadaf EbrahimiThe generated representations are a _best effort_ representation of the underlying source code. 61*3c321d95SSadaf EbrahimiThis means that synthetic elements will be excluded from generation. Kotlin-specific language 62*3c321d95SSadaf Ebrahimifeatures like lambdas or delegation will be coerced to their idiomatic source form. 63*3c321d95SSadaf Ebrahimi 64*3c321d95SSadaf EbrahimiTo aid with this, `toTypeSpec()` and `toFileSpec()` accept optional `ClassInspector` instances 65*3c321d95SSadaf Ebrahimito assist in parsing/understanding the underlying JVM code. This is important for things like 66*3c321d95SSadaf Ebrahimiannotations, companion objects, certain JVM modifiers, overrides, and more. While it is optional, 67*3c321d95SSadaf Ebrahimirepresented sources can be incomplete without this information available. Reflective and javax 68*3c321d95SSadaf Ebrahimi`Elements` implementations are available under the 69*3c321d95SSadaf Ebrahimi`com.squareup.kotlinpoet.metadata.classinspectors` package. 70*3c321d95SSadaf Ebrahimi 71*3c321d95SSadaf EbrahimiGenerated sources are solely _stub_ implementations, meaning implementation details of elements 72*3c321d95SSadaf Ebrahimilike functions, property getters, and delegated properties are simply stubbed with `TODO()` 73*3c321d95SSadaf Ebrahimiplaceholders. 74*3c321d95SSadaf Ebrahimi 75*3c321d95SSadaf Ebrahimi### Known limitations 76*3c321d95SSadaf Ebrahimi 77*3c321d95SSadaf Ebrahimi- Only `KotlinClassMetadata.Class` and `KotlinClassMetadata.FileFacade` are supported for now. No support for `SyntheticClass`, `MultiFileClassFacade`, or `MultiFileClassPart` 78*3c321d95SSadaf Ebrahimi- `@JvmOverloads` annotations are only supported with `ElementsClassInspector` and not reflection. 79*3c321d95SSadaf Ebrahimi- Non-const literal values are only supported with `ElementsClassInspector` and not reflection. 80*3c321d95SSadaf Ebrahimi- ClassInspector data sourced from `synthetic` constructs are only supported with 81*3c321d95SSadaf Ebrahimi `ReflectiveClassInspector` and not elements. This is because the javax Elements API does not model 82*3c321d95SSadaf Ebrahimi synthetic constructs. This can yield some missing information, like static companion object properties 83*3c321d95SSadaf Ebrahimi or `property:` site target annotations. 84*3c321d95SSadaf Ebrahimi- Annotations annotated with `AnnotationRetention.SOURCE` are not parsable in reflection nor javax elements. 85