diff --git a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/fir/Fir2IrTextTestGenerated.java b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/fir/Fir2IrTextTestGenerated.java index 23161689b13..68c0a3a5482 100644 --- a/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/fir/Fir2IrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests/org/jetbrains/kotlin/fir/Fir2IrTextTestGenerated.java @@ -1349,6 +1349,11 @@ public class Fir2IrTextTestGenerated extends AbstractFir2IrTextTest { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/ir/irText/expressions/callableReferences"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @TestMetadata("boundInnerGenericConstructor.kt") + public void testBoundInnerGenericConstructor() throws Exception { + runTest("compiler/testData/ir/irText/expressions/callableReferences/boundInnerGenericConstructor.kt"); + } + @TestMetadata("constructorWithAdaptedArguments.kt") public void testConstructorWithAdaptedArguments() throws Exception { runTest("compiler/testData/ir/irText/expressions/callableReferences/constructorWithAdaptedArguments.kt"); diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt index 33179c5f6b1..199912b9558 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt @@ -218,8 +218,8 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St context.callToSubstitutedDescriptorMap[irAdapteeCallInner] = resolvedDescriptor - val irDispatchReceiver = dispatchReceiverValue?.load() - val irExtensionReceiver = extensionReceiverValue?.load() + val irDispatchReceiver = dispatchReceiverValue?.loadIfExists() + val irExtensionReceiver = extensionReceiverValue?.loadIfExists() if (irDispatchReceiver != null) { if (irDispatchReceiver.isSafeToUseWithoutCopying()) { diff --git a/compiler/testData/ir/irText/expressions/callableReferences/boundInnerGenericConstructor.fir.txt b/compiler/testData/ir/irText/expressions/callableReferences/boundInnerGenericConstructor.fir.txt new file mode 100644 index 00000000000..2ecab187eaa --- /dev/null +++ b/compiler/testData/ir/irText/expressions/callableReferences/boundInnerGenericConstructor.fir.txt @@ -0,0 +1,91 @@ +FILE fqName:test fileName:/boundInnerGenericConstructor.kt + CLASS CLASS name:Foo modality:FINAL visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:test.Foo + TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?] + CONSTRUCTOR visibility:public <> () returnType:test.Foo [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Foo modality:FINAL visibility:public superTypes:[kotlin.Any]' + CLASS CLASS name:Inner modality:FINAL visibility:public [inner] superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:test.Foo.Inner + TYPE_PARAMETER name:P index:0 variance: superTypes:[kotlin.Any?] + CONSTRUCTOR visibility:public <> (a:T of test.Foo, b:P of test.Foo.Inner) returnType:test.Foo.Inner

[primary] + VALUE_PARAMETER name:a index:0 type:T of test.Foo + VALUE_PARAMETER name:b index:1 type:P of test.Foo.Inner + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Inner modality:FINAL visibility:public [inner] superTypes:[kotlin.Any]' + PROPERTY name:a visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:a type:T of test.Foo visibility:private [final] + EXPRESSION_BODY + GET_VAR 'a: T of test.Foo declared in test.Foo.Inner.' type=T of test.Foo origin=INITIALIZE_PROPERTY_FROM_PARAMETER + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:test.Foo.Inner) returnType:T of test.Foo + correspondingProperty: PROPERTY name:a visibility:public modality:FINAL [val] + $this: VALUE_PARAMETER name: type:test.Foo.Inner + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): T of test.Foo declared in test.Foo.Inner' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:a type:T of test.Foo visibility:private [final]' type=T of test.Foo origin=null + receiver: GET_VAR ': test.Foo.Inner declared in test.Foo.Inner.' type=test.Foo.Inner origin=null + PROPERTY name:b visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:b type:P of test.Foo.Inner visibility:private [final] + EXPRESSION_BODY + GET_VAR 'b: P of test.Foo.Inner declared in test.Foo.Inner.' type=P of test.Foo.Inner origin=INITIALIZE_PROPERTY_FROM_PARAMETER + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:test.Foo.Inner) returnType:P of test.Foo.Inner + correspondingProperty: PROPERTY name:b visibility:public modality:FINAL [val] + $this: VALUE_PARAMETER name: type:test.Foo.Inner + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): P of test.Foo.Inner declared in test.Foo.Inner' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:b type:P of test.Foo.Inner visibility:private [final]' type=P of test.Foo.Inner origin=null + receiver: GET_VAR ': test.Foo.Inner declared in test.Foo.Inner.' type=test.Foo.Inner origin=null + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN name:foo visibility:public modality:FINAL (a:A of test.foo, b:B of test.foo, x:kotlin.Function2>) returnType:test.Foo.Inner [inline] + TYPE_PARAMETER name:A index:0 variance: superTypes:[kotlin.Any?] + TYPE_PARAMETER name:B index:0 variance: superTypes:[kotlin.Any?] + VALUE_PARAMETER name:a index:0 type:A of test.foo + VALUE_PARAMETER name:b index:1 type:B of test.foo + VALUE_PARAMETER name:x index:2 type:kotlin.Function2> + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun foo (a: A of test.foo, b: B of test.foo, x: kotlin.Function2>): test.Foo.Inner [inline] declared in test' + CALL 'public abstract fun invoke (p1: A of test.foo, p2: B of test.foo): test.Foo.Inner [operator] declared in kotlin.Function2' type=test.Foo.Inner origin=null + $this: GET_VAR 'x: kotlin.Function2> declared in test.foo' type=kotlin.Function2> origin=null + p1: GET_VAR 'a: A of test.foo declared in test.foo' type=A of test.foo origin=null + p2: GET_VAR 'b: B of test.foo declared in test.foo' type=B of test.foo origin=null + FUN name:box visibility:public modality:FINAL <> () returnType:kotlin.String + BLOCK_BODY + VAR name:z type:test.Foo [val] + CONSTRUCTOR_CALL 'public constructor () [primary] declared in test.Foo' type=test.Foo origin=null + : kotlin.String + VAR name:foo type:IrErrorType [val] + ERROR_CALL 'Unresolved reference: #' type=IrErrorType + CONST String type=kotlin.String value="O" + CONST String type=kotlin.String value="K" + FUNCTION_REFERENCE 'public constructor (a: T of test.Foo, b: P of test.Foo.Inner) [primary] declared in test.Foo.Inner' type=kotlin.reflect.KFunction2> origin=null reflectionTarget= + RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in test' + CALL 'public final fun plus (other: kotlin.Any?): kotlin.String [operator] declared in kotlin' type=kotlin.String origin=null + $receiver: ERROR_CALL 'Unresolved reference: #' type=IrErrorType + other: ERROR_CALL 'Unresolved reference: #' type=IrErrorType diff --git a/compiler/testData/ir/irText/expressions/callableReferences/boundInnerGenericConstructor.kt b/compiler/testData/ir/irText/expressions/callableReferences/boundInnerGenericConstructor.kt new file mode 100644 index 00000000000..74d6002459a --- /dev/null +++ b/compiler/testData/ir/irText/expressions/callableReferences/boundInnerGenericConstructor.kt @@ -0,0 +1,13 @@ +package test + +class Foo { + inner class Inner

(val a: T, val b: P) +} + +inline fun foo(a: A, b: B, x: (A, B) -> Foo.Inner): Foo.Inner = x(a, b) + +fun box(): String { + val z = Foo() + val foo = foo("O", "K", z::Inner) + return foo.a + foo.b +} diff --git a/compiler/testData/ir/irText/expressions/callableReferences/boundInnerGenericConstructor.txt b/compiler/testData/ir/irText/expressions/callableReferences/boundInnerGenericConstructor.txt new file mode 100644 index 00000000000..dde638e9a37 --- /dev/null +++ b/compiler/testData/ir/irText/expressions/callableReferences/boundInnerGenericConstructor.txt @@ -0,0 +1,98 @@ +FILE fqName:test fileName:/boundInnerGenericConstructor.kt + CLASS CLASS name:Foo modality:FINAL visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:test.Foo + TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?] + CONSTRUCTOR visibility:public <> () returnType:test.Foo [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Foo modality:FINAL visibility:public superTypes:[kotlin.Any]' + CLASS CLASS name:Inner modality:FINAL visibility:public [inner] superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:test.Foo.Inner

+ TYPE_PARAMETER name:P index:0 variance: superTypes:[kotlin.Any?] + CONSTRUCTOR visibility:public <> ($this:test.Foo, a:T of test.Foo, b:P of test.Foo.Inner) returnType:test.Foo.Inner

[primary] + $outer: VALUE_PARAMETER name: type:test.Foo + VALUE_PARAMETER name:a index:0 type:T of test.Foo + VALUE_PARAMETER name:b index:1 type:P of test.Foo.Inner + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:Inner modality:FINAL visibility:public [inner] superTypes:[kotlin.Any]' + PROPERTY name:a visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:a type:T of test.Foo visibility:private [final] + EXPRESSION_BODY + GET_VAR 'a: T of test.Foo declared in test.Foo.Inner.' type=T of test.Foo origin=INITIALIZE_PROPERTY_FROM_PARAMETER + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:test.Foo.Inner

) returnType:T of test.Foo + correspondingProperty: PROPERTY name:a visibility:public modality:FINAL [val] + $this: VALUE_PARAMETER name: type:test.Foo.Inner

+ BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): T of test.Foo declared in test.Foo.Inner' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:a type:T of test.Foo visibility:private [final]' type=T of test.Foo origin=null + receiver: GET_VAR ': test.Foo.Inner

declared in test.Foo.Inner.' type=test.Foo.Inner

origin=null + PROPERTY name:b visibility:public modality:FINAL [val] + FIELD PROPERTY_BACKING_FIELD name:b type:P of test.Foo.Inner visibility:private [final] + EXPRESSION_BODY + GET_VAR 'b: P of test.Foo.Inner declared in test.Foo.Inner.' type=P of test.Foo.Inner origin=INITIALIZE_PROPERTY_FROM_PARAMETER + FUN DEFAULT_PROPERTY_ACCESSOR name: visibility:public modality:FINAL <> ($this:test.Foo.Inner

) returnType:P of test.Foo.Inner + correspondingProperty: PROPERTY name:b visibility:public modality:FINAL [val] + $this: VALUE_PARAMETER name: type:test.Foo.Inner

+ BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun (): P of test.Foo.Inner declared in test.Foo.Inner' + GET_FIELD 'FIELD PROPERTY_BACKING_FIELD name:b type:P of test.Foo.Inner visibility:private [final]' type=P of test.Foo.Inner origin=null + receiver: GET_VAR ': test.Foo.Inner

declared in test.Foo.Inner.' type=test.Foo.Inner

origin=null + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN name:foo visibility:public modality:FINAL (a:A of test.foo, b:B of test.foo, x:kotlin.Function2>) returnType:test.Foo.Inner [inline] + TYPE_PARAMETER name:A index:0 variance: superTypes:[kotlin.Any?] + TYPE_PARAMETER name:B index:1 variance: superTypes:[kotlin.Any?] + VALUE_PARAMETER name:a index:0 type:A of test.foo + VALUE_PARAMETER name:b index:1 type:B of test.foo + VALUE_PARAMETER name:x index:2 type:kotlin.Function2> + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun foo (a: A of test.foo, b: B of test.foo, x: kotlin.Function2>): test.Foo.Inner [inline] declared in test' + CALL 'public abstract fun invoke (p1: P1 of kotlin.Function2, p2: P2 of kotlin.Function2): R of kotlin.Function2 [operator] declared in kotlin.Function2' type=test.Foo.Inner origin=INVOKE + $this: GET_VAR 'x: kotlin.Function2> declared in test.foo' type=kotlin.Function2> origin=VARIABLE_AS_FUNCTION + p1: GET_VAR 'a: A of test.foo declared in test.foo' type=A of test.foo origin=null + p2: GET_VAR 'b: B of test.foo declared in test.foo' type=B of test.foo origin=null + FUN name:box visibility:public modality:FINAL <> () returnType:kotlin.String + BLOCK_BODY + VAR name:z type:test.Foo [val] + CONSTRUCTOR_CALL 'public constructor () [primary] declared in test.Foo' type=test.Foo origin=null + : kotlin.String + VAR name:foo type:test.Foo.Inner [val] + CALL 'public final fun foo (a: A of test.foo, b: B of test.foo, x: kotlin.Function2>): test.Foo.Inner [inline] declared in test' type=test.Foo.Inner origin=null + : kotlin.String + : kotlin.String + a: CONST String type=kotlin.String value="O" + b: CONST String type=kotlin.String value="K" + x: FUNCTION_REFERENCE 'public constructor (a: T of test.Foo, b: P of test.Foo.Inner) [primary] declared in test.Foo.Inner' type=kotlin.reflect.KFunction2<@[ParameterName(name = 'a')] kotlin.String, @[ParameterName(name = 'b')] kotlin.String, test.Foo.Inner> origin=null reflectionTarget= +

: kotlin.String + $this: GET_VAR 'val z: test.Foo [val] declared in test.box' type=test.Foo origin=null + RETURN type=kotlin.Nothing from='public final fun box (): kotlin.String declared in test' + CALL 'public final fun plus (other: kotlin.Any?): kotlin.String [operator] declared in kotlin.String' type=kotlin.String origin=PLUS + $this: CALL 'public final fun (): T of test.Foo declared in test.Foo.Inner' type=kotlin.String origin=GET_PROPERTY + $this: GET_VAR 'val foo: test.Foo.Inner [val] declared in test.box' type=test.Foo.Inner origin=null + other: CALL 'public final fun (): P of test.Foo.Inner declared in test.Foo.Inner' type=kotlin.String origin=GET_PROPERTY + $this: GET_VAR 'val foo: test.Foo.Inner [val] declared in test.box' type=test.Foo.Inner origin=null diff --git a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java index ee6e2a05b5e..be418b520f7 100644 --- a/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/ir/IrTextTestCaseGenerated.java @@ -1348,6 +1348,11 @@ public class IrTextTestCaseGenerated extends AbstractIrTextTestCase { KotlinTestUtils.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/ir/irText/expressions/callableReferences"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @TestMetadata("boundInnerGenericConstructor.kt") + public void testBoundInnerGenericConstructor() throws Exception { + runTest("compiler/testData/ir/irText/expressions/callableReferences/boundInnerGenericConstructor.kt"); + } + @TestMetadata("constructorWithAdaptedArguments.kt") public void testConstructorWithAdaptedArguments() throws Exception { runTest("compiler/testData/ir/irText/expressions/callableReferences/constructorWithAdaptedArguments.kt");