4c30bcfca0
Addressed some comments on the main article
58 lines
1.3 KiB
Markdown
58 lines
1.3 KiB
Markdown
## Motivation
|
|
|
|
#### Locals have the highest priority
|
|
|
|
A variable of function type goes before members:
|
|
|
|
```
|
|
class A { fun foo() = 1 }
|
|
|
|
fun test(a: A, foo: () -> Int) {
|
|
with (a) {
|
|
foo()
|
|
}
|
|
}
|
|
```
|
|
|
|
In anonymous objects local variables are chosen, not members:
|
|
|
|
```
|
|
interface A {
|
|
val foo: Int
|
|
}
|
|
|
|
fun createA(foo: Int) = object : A {
|
|
override val foo = foo
|
|
}
|
|
```
|
|
|
|
#### Top-level scope chain
|
|
|
|
The priorities: explicit imports; functions in the same package; star-imports; function from stdlib.
|
|
|
|
Explicit import should hide descriptors imported by `*`.
|
|
|
|
There is no scope for file, because moving a function to another file in the same package should not change the resolution.
|
|
|
|
The function imported explicitly goes before the function from the same package; the latter one may live in another file.
|
|
|
|
#### The order of implicit receivers
|
|
|
|
See the discussion here: https://youtrack.jetbrains.com/issue/KT-10510.
|
|
|
|
## Technical notes
|
|
|
|
When we resolve a property `foo` for a call `foo()` we don't stop on the first property, but instead we collect all variables with the name `foo` and for each of them try to find the `invoke` function:
|
|
|
|
```
|
|
class A {
|
|
val foo: () -> Unit = { println("Hello world!") }
|
|
}
|
|
|
|
fun test(foo: Int) {
|
|
with(A()) {
|
|
foo // parameter
|
|
foo() // property + invoke
|
|
}
|
|
}
|
|
``` |