KT-26765: Support 'call' for constructors with inline class parameters

This commit is contained in:
Dmitry Petrov
2018-10-19 15:45:01 +03:00
parent 23ead5e430
commit 6d0a403ead
11 changed files with 145 additions and 35 deletions
@@ -34,6 +34,7 @@ import org.jetbrains.kotlin.resolve.descriptorUtil.getSuperClassNotAny
import org.jetbrains.kotlin.resolve.jvm.AsmTypes.*
import org.jetbrains.kotlin.resolve.jvm.diagnostics.JvmDeclarationOrigin
import org.jetbrains.kotlin.resolve.jvm.jvmSignature.JvmMethodSignature
import org.jetbrains.kotlin.resolve.jvm.shouldHideConstructorDueToInlineClassTypeValueParameters
import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.typeUtil.builtIns
import org.jetbrains.kotlin.util.OperatorNameConventions
@@ -241,6 +242,11 @@ class PropertyReferenceCodegen(
}
val accessor = when (callable) {
is ClassConstructorDescriptor ->
if (shouldHideConstructorDueToInlineClassTypeValueParameters(callable))
AccessorForConstructorDescriptor(callable, callable.containingDeclaration, null, AccessorKind.NORMAL)
else
callable
is FunctionDescriptor -> callable
is VariableDescriptorWithAccessors ->
callable.getter ?: DescriptorFactory.createDefaultGetter(callable as PropertyDescriptor, Annotations.EMPTY).apply {
@@ -0,0 +1,27 @@
// IGNORE_BACKEND: JS_IR, JS, NATIVE, JVM_IR
// WITH_REFLECT
import kotlin.test.assertEquals
inline class Z(val x: Int)
class Outer(val z1: Z) {
inner class Inner(val z2: Z) {
val test = "$z1 $z2"
}
}
inline class InlineOuter(val z1: Z) {
inner class Inner(val z2: Z) {
val test = "$z1 $z2"
}
}
fun box(): String {
assertEquals(Z(1), ::Outer.call(Z(1)).z1)
assertEquals("Z(x=1) Z(x=2)", Outer::Inner.call(Outer(Z(1)), Z(2)).test)
assertEquals("Z(x=1) Z(x=3)", Outer(Z(1))::Inner.call(Z(3)).test)
assertEquals("Z(x=1) Z(x=2)", InlineOuter::Inner.call(InlineOuter(Z(1)), Z(2)).test)
assertEquals("Z(x=1) Z(x=3)", InlineOuter(Z(1))::Inner.call(Z(3)).test)
return "OK"
}
@@ -13,14 +13,6 @@ class C {
fun topLevel(x: String, y: S): S = S(x) + y
/* TODO: support constructors with inline class types in the signature (KT-26765)
class D {
inner class Inner(x: S, y: S) {
val result = x + y
}
}
*/
fun S.extension(y: S): S = this + y
fun S.extension2(): String = value
@@ -28,12 +20,10 @@ fun S.extension2(): String = value
fun box(): String {
assertEquals(S("ab"), C::member.call(C(), S("a"), "b"))
assertEquals(S("cd"), ::topLevel.call("c", S("d")))
// assertEquals(S("ef"), D::Inner.call(D(), S("e"), S("f")).result)
assertEquals(S("gh"), S::extension.call(S("g"), S("h")))
assertEquals("_", S::extension2.call(S("_")))
assertEquals(S("ij"), C()::member.call(S("i"), "j"))
// assertEquals(S("kl"), D()::Inner.call(S("k"), S("l")).result)
assertEquals(S("mn"), S("m")::extension.call(S("n")))
assertEquals("_", S("_")::extension2.call())
@@ -19283,14 +19283,19 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/reflection/call/inlineClasses"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true);
}
@TestMetadata("constructorWithInlineClassParameters.kt")
public void testConstructorWithInlineClassParameters() throws Exception {
runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/constructorWithInlineClassParameters.kt");
}
@TestMetadata("fieldAccessors.kt")
public void testFieldAccessors() throws Exception {
runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/fieldAccessors.kt");
}
@TestMetadata("functionsAndConstructors.kt")
public void testFunctionsAndConstructors() throws Exception {
runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/functionsAndConstructors.kt");
@TestMetadata("functionsWithInlineClassParameters.kt")
public void testFunctionsWithInlineClassParameters() throws Exception {
runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/functionsWithInlineClassParameters.kt");
}
@TestMetadata("inlineClassConstructor.kt")
@@ -19283,14 +19283,19 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/reflection/call/inlineClasses"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM, true);
}
@TestMetadata("constructorWithInlineClassParameters.kt")
public void testConstructorWithInlineClassParameters() throws Exception {
runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/constructorWithInlineClassParameters.kt");
}
@TestMetadata("fieldAccessors.kt")
public void testFieldAccessors() throws Exception {
runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/fieldAccessors.kt");
}
@TestMetadata("functionsAndConstructors.kt")
public void testFunctionsAndConstructors() throws Exception {
runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/functionsAndConstructors.kt");
@TestMetadata("functionsWithInlineClassParameters.kt")
public void testFunctionsWithInlineClassParameters() throws Exception {
runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/functionsWithInlineClassParameters.kt");
}
@TestMetadata("inlineClassConstructor.kt")
@@ -19288,14 +19288,19 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("compiler/testData/codegen/box/reflection/call/inlineClasses"), Pattern.compile("^(.+)\\.kt$"), TargetBackend.JVM_IR, true);
}
@TestMetadata("constructorWithInlineClassParameters.kt")
public void testConstructorWithInlineClassParameters() throws Exception {
runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/constructorWithInlineClassParameters.kt");
}
@TestMetadata("fieldAccessors.kt")
public void testFieldAccessors() throws Exception {
runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/fieldAccessors.kt");
}
@TestMetadata("functionsAndConstructors.kt")
public void testFunctionsAndConstructors() throws Exception {
runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/functionsAndConstructors.kt");
@TestMetadata("functionsWithInlineClassParameters.kt")
public void testFunctionsWithInlineClassParameters() throws Exception {
runTest("compiler/testData/codegen/box/reflection/call/inlineClasses/functionsWithInlineClassParameters.kt");
}
@TestMetadata("inlineClassConstructor.kt")