xref: /aosp_15_r20/external/kotlinpoet/docs/interop-kotlinx-metadata.md (revision 3c321d951dd070fb96f8ba59e952ffc3131379a0)
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