blob: 8220d20ad745b05ae6c02698fb00b2ce07a8fa04 [file] [log] [blame] [view] [edit]
# 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