| # Support for JVM's ACC_NATIVE flag |
| |
| Goal: enable JNI interop for Kotlin, so that anything that works through JNI in Java could be reproduced 1-to-1 in Kotlin |
| |
| ## Syntax |
| |
| The following definition is present in the library: |
| |
| ``` kotlin |
| package kotlin.jvm |
| |
| Retention(RetentionPolicy.SOURCE) |
| public annotation class native |
| ``` |
| |
| This annotation is applicable to |
| - functions |
| - property accessors |
| |
| A declaration marked with this annotation is referred to as a *native declaration*. |
| |
| Checks to perform: |
| - a native declaration can not be abstract |
| - a native declaration can not have a body |
| - a native declaration can not be marked `inline` |
| - a native declaration can not have `reified` type parameters |
| NOTE: this is achieved through prohibiting `inline`, as `reified` is only allowed on inline-functions now |
| - members of traits can not be native |
| |
| NOTE: native members can override open (or abstract) members of supertypes |
| |
| ## Semantics on the JVM |
| |
| Intuition: a JVM method whose source declaration is native is marked with the `ACC_NATIVE` flag, and has no `CODE` attribute. |
| |
| ### Interaction with \[platformStatic\] |
| |
| A native member of an object marked `native` and `platformStatic` is translated in a straightforward way: |
| there is only one JVM method corresponding to it, and it is marked as `ACC_NATIVE`. |
| |
| A member of a companion object of class `C` marked `native` and `platformStatic` yields two JVM methods: |
| - static member of `C` that is marked `ACC_NATIVE`; |
| - instance member of `C$object` that is not marked `ACC_NATIVE` and its body delegates to the native static method. |
| |
| ### Top-level declarations |
| |
| A native member of package `p` yields one JVM method: |
| - member of a package-facade class `PPackage` which is marked with `ACC_NATIVE` flag. |
| |
| ### Native Property Accessors |
| |
| A property can not be marked `native`. |
| A *property accessor* can be marked `native` if it has no body (i.e. it is a *default accessor*). |
| In this case the generated code is the same as for a native function defined in the same context as the property. |
| |
| Example: |
| ``` kotlin |
| val foo: Int |
| [native] get |
| ``` |
| |
| ## Not implemented (yet) |
| |
| - native property accessors |
| - frontend: when accessors are default and native, don't require an initializer, don't allow a backing field |
| - backend: when accessors are default and native, don't generate a backing field |
| - applicability checks: only functions and property accessors |