Treat accessors to JvmStatic methods as having no dispatch receiver

#KT-21246 Fixed
This commit is contained in:
Dmitry Petrov
2017-11-13 15:29:14 +03:00
parent db2aad1857
commit 15ac471626
7 changed files with 77 additions and 3 deletions
@@ -812,7 +812,10 @@ public abstract class MemberCodegen<T extends KtPureElement/* TODO: & KtDeclarat
((AccessorForCallableDescriptor) accessorDescriptor).getSuperCallTarget() != null
);
boolean hasDispatchReceiver = !isStaticDeclaration(functionDescriptor) && !isNonDefaultInterfaceMember(functionDescriptor, state);
boolean isJvmStaticInObjectOrClass = CodegenUtilKt.isJvmStaticInObjectOrClass(functionDescriptor);
boolean hasDispatchReceiver = !isStaticDeclaration(functionDescriptor) &&
!isNonDefaultInterfaceMember(functionDescriptor, state) &&
!isJvmStaticInObjectOrClass;
boolean accessorIsConstructor = accessorDescriptor instanceof AccessorForConstructorDescriptor;
int accessorParam = (hasDispatchReceiver && !accessorIsConstructor) ? 1 : 0;
@@ -824,7 +827,7 @@ public abstract class MemberCodegen<T extends KtPureElement/* TODO: & KtDeclarat
accessorParam = 0;
}
else if (KotlinTypeMapper.isAccessor(accessorDescriptor) && (hasDispatchReceiver || accessorIsConstructor)) {
if (!CodegenUtilKt.isJvmStaticInObjectOrClass(functionDescriptor)) {
if (!isJvmStaticInObjectOrClass) {
iv.load(0, OBJECT_TYPE);
}
}
@@ -85,7 +85,7 @@ public abstract class TransformationMethodVisitor extends MethodVisitor {
delegate.visitEnd();
}
catch (Throwable t) {
throw new CompilationException("Couldn't transform method node: " + getNodeText(methodNode), t, null);
throw new CompilationException("Couldn't transform method node:\n" + getNodeText(methodNode), t, null);
}
}
+20
View File
@@ -0,0 +1,20 @@
// WITH_RUNTIME
// TARGET_BACKEND: JVM
object Test {
@JvmStatic
fun test() = action { createWildcard("OK") }.x
@JvmStatic
private fun createWildcard(s: String): Type<*>? {
return Type<Any>(s)
}
inline fun action(crossinline f: () -> Type<*>?) = f()!!
class Type<T>(val x: String)
}
fun box() = Test.test()
+15
View File
@@ -0,0 +1,15 @@
// WITH_RUNTIME
// TARGET_BACKEND: JVM
object Test {
fun test() = { createWildcard("OK") }()
@JvmStatic
private fun createWildcard(s: String) = Type<Any>(s).x
class Type<T>(val x: String)
}
fun box() = Test.test()
@@ -11081,6 +11081,18 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
doTest(fileName);
}
@TestMetadata("kt21246.kt")
public void testKt21246() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/jvmStatic/kt21246.kt");
doTest(fileName);
}
@TestMetadata("kt21246a.kt")
public void testKt21246a() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/jvmStatic/kt21246a.kt");
doTest(fileName);
}
@TestMetadata("kt9897_static.kt")
public void testKt9897_static() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/jvmStatic/kt9897_static.kt");
@@ -11081,6 +11081,18 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
doTest(fileName);
}
@TestMetadata("kt21246.kt")
public void testKt21246() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/jvmStatic/kt21246.kt");
doTest(fileName);
}
@TestMetadata("kt21246a.kt")
public void testKt21246a() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/jvmStatic/kt21246a.kt");
doTest(fileName);
}
@TestMetadata("kt9897_static.kt")
public void testKt9897_static() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/jvmStatic/kt9897_static.kt");
@@ -11081,6 +11081,18 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
doTest(fileName);
}
@TestMetadata("kt21246.kt")
public void testKt21246() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/jvmStatic/kt21246.kt");
doTest(fileName);
}
@TestMetadata("kt21246a.kt")
public void testKt21246a() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/jvmStatic/kt21246a.kt");
doTest(fileName);
}
@TestMetadata("kt9897_static.kt")
public void testKt9897_static() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/jvmStatic/kt9897_static.kt");