blob: dcd6396b8bda4f532ff13c84fa268516c49ede0a [file] [log] [blame] [view]
# Accessing private declarations from inline functions
Sometimes, inline functions have more priveliges, than their callsite has.
```kotlin
class A {
private fun bar() { println("bar")}
inline internal fun foo() = bar()
}
fun main() {
A().foo()
}
```
This code is compilable, and effectively equivalent to calling `bar()` in main.
But bar() is a private function and can't be called in main().
### Current non-jvm approach
As inlining happens after klib linking, there is no issue with that.
### Current jvm-approach
For methods, synthetic accessors are generated.
For example, class `A` from above is generated to
```
public final class A {
public A();
private final void bar();
public final void foo$main();
public static final void access$bar(A);
}
```
And this `access$bar(A)` method is called instead of `bar` inside inline functions.
Accessing classes is more complex. They are just accessed as is. Which works in simple cases, but for example
```kotlin
// other.kt
package other
class A {
private class B public constructor() {
fun bar() { println("bar")}
}
private fun produce() : Any = B()
private fun consume(b: B) { b.bar() }
inline internal fun foo() {
val x = produce() as B
consume(x)
}
}
// main.kt
fun main() {
other.A().foo()
}
```
fails with IllegalAccessError.
It is unclear if it should be considered as a bug, and deprecated, or it is intended behaviour.
Probably, we can use this approach in all backends and move it to fir2ir phase.