[FIR] Infer type arguments for captured parameters of inner classes

KT-38992
This commit is contained in:
Dmitriy Novozhilov
2020-07-13 15:59:09 +03:00
parent 1c622a5a3f
commit 1ce4eca3a6
27 changed files with 316 additions and 85 deletions
@@ -0,0 +1,29 @@
interface AbstractFirTreeBuilder
class FirTreeBuilder : AbstractFirTreeBuilder
abstract class AbstractBuilderConfigurator<T : AbstractFirTreeBuilder> {
abstract class BuilderConfigurationContext
inner class LeafBuilderConfigurationContext : BuilderConfigurationContext()
}
class BuilderConfigurator : AbstractBuilderConfigurator<FirTreeBuilder>() {
fun test(func: (LeafBuilderConfigurationContext) -> Unit) {
val context = LeafBuilderConfigurationContext()
func(context)
}
}
class Outer<E> {
inner class Inner
fun foo(x: (Inner) -> Unit, y: Inner.() -> Unit) {
// each call reported as INAPPLICABLE because "Inner<E> is not a subtype of Inner"
bar(Inner())
x(Inner())
Inner().y()
}
fun bar(i: Inner) {}
}
@@ -0,0 +1,62 @@
FILE: invokeWithReceiverAndArgument.kt
public abstract interface AbstractFirTreeBuilder : R|kotlin/Any| {
}
public final class FirTreeBuilder : R|AbstractFirTreeBuilder| {
public constructor(): R|FirTreeBuilder| {
super<R|kotlin/Any|>()
}
}
public abstract class AbstractBuilderConfigurator<T : R|AbstractFirTreeBuilder|> : R|kotlin/Any| {
public constructor<T : R|AbstractFirTreeBuilder|>(): R|AbstractBuilderConfigurator<T>| {
super<R|kotlin/Any|>()
}
public abstract class BuilderConfigurationContext : R|kotlin/Any| {
public constructor(): R|AbstractBuilderConfigurator.BuilderConfigurationContext| {
super<R|kotlin/Any|>()
}
}
public final inner class LeafBuilderConfigurationContext<T : R|AbstractFirTreeBuilder|> : R|AbstractBuilderConfigurator.BuilderConfigurationContext| {
public constructor(): R|AbstractBuilderConfigurator.LeafBuilderConfigurationContext<T>| {
super<R|AbstractBuilderConfigurator.BuilderConfigurationContext|>()
}
}
}
public final class BuilderConfigurator : R|AbstractBuilderConfigurator<FirTreeBuilder>| {
public constructor(): R|BuilderConfigurator| {
super<R|AbstractBuilderConfigurator<FirTreeBuilder>|>()
}
public final fun test(func: R|(AbstractBuilderConfigurator.LeafBuilderConfigurationContext<FirTreeBuilder>) -> kotlin/Unit|): R|kotlin/Unit| {
lval context: R|AbstractBuilderConfigurator.LeafBuilderConfigurationContext<FirTreeBuilder>| = this@R|/BuilderConfigurator|.R|/AbstractBuilderConfigurator.LeafBuilderConfigurationContext.LeafBuilderConfigurationContext|()
R|<local>/func|.R|FakeOverride<kotlin/Function1.invoke: R|kotlin/Unit|>|(R|<local>/context|)
}
}
public final class Outer<E> : R|kotlin/Any| {
public constructor<E>(): R|Outer<E>| {
super<R|kotlin/Any|>()
}
public final inner class Inner<E> : R|kotlin/Any| {
public constructor(): R|Outer.Inner<E>| {
super<R|kotlin/Any|>()
}
}
public final fun foo(x: R|(Outer.Inner<E>) -> kotlin/Unit|, y: R|Outer.Inner<E>.() -> kotlin/Unit|): R|kotlin/Unit| {
this@R|/Outer|.R|/Outer.bar|(this@R|/Outer|.R|/Outer.Inner.Inner|())
R|<local>/x|.R|FakeOverride<kotlin/Function1.invoke: R|kotlin/Unit|>|(this@R|/Outer|.R|/Outer.Inner.Inner|())
R|<local>/y|.R|FakeOverride<kotlin/Function1.invoke: R|kotlin/Unit|>|(this@R|/Outer|.R|/Outer.Inner.Inner|())
}
public final fun bar(i: R|Outer.Inner<E>|): R|kotlin/Unit| {
}
}