Refine multi-file facades generation

Do not generate delegation from multi-file facade to inline-only functions
because they are effectively private in bytecode

 #KT-10858 Fixed
This commit is contained in:
Denis Zharkov
2016-02-03 18:40:52 +03:00
parent e4583fd275
commit 889b136a68
6 changed files with 38 additions and 3 deletions
@@ -213,7 +213,8 @@ class MultifileClassCodegen(
if (declaration is KtNamedFunction || declaration is KtProperty) {
val descriptor = state.bindingContext.get(BindingContext.DECLARATION_TO_DESCRIPTOR, declaration)
assert(descriptor is CallableMemberDescriptor) { "Expected callable member, was " + descriptor + " for " + declaration.text }
if (!Visibilities.isPrivate((descriptor as CallableMemberDescriptor).visibility)) {
if (!Visibilities.isPrivate((descriptor as CallableMemberDescriptor).visibility)
&& AsmUtil.getVisibilityAccessFlag(descriptor) != Opcodes.ACC_PRIVATE) {
generateCallableMemberTasks.put(descriptor, { memberCodegen.genFunctionOrProperty(declaration) })
}
}
@@ -1,3 +1,7 @@
import a.foo
import a.inlineOnly
fun box(): String = foo { "OK" }
fun box(): String {
if (!a.inlineOnly<String>("OK")) return "fail 1"
return foo { "OK" }
}
@@ -3,4 +3,6 @@ package a
inline fun foo(body: () -> String): String = bar(body())
public fun bar(x: String): String = x
public fun bar(x: String): String = x
inline fun <reified T> inlineOnly(x: Any?): Boolean = x is T
@@ -0,0 +1,10 @@
@file:[JvmName("Foo") JvmMultifileClass]
package test
fun foo() {
inlineOnly<String>()
}
// No method should be generated in multifile facade for 'inlineOnly'
// Because 'inlineOnly' is private in file part (because it's inline-only) and can't be delegated from facade
public inline fun <reified T> inlineOnly() {}
@@ -0,0 +1,12 @@
@kotlin.Metadata
@kotlin.jvm.internal.KotlinMultifileClass
public final class test/Foo {
public final static method foo(): void
}
@kotlin.Metadata
@kotlin.jvm.internal.KotlinMultifileClassPart
synthetic final class test/Foo__InlineOnlyMultifileKt {
public final static method foo(): void
private final static method inlineOnly(): void
}
@@ -47,6 +47,12 @@ public class BytecodeListingTestGenerated extends AbstractBytecodeListingTest {
doTest(fileName);
}
@TestMetadata("InlineOnlyMultifile.kt")
public void testInlineOnlyMultifile() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeListing/InlineOnlyMultifile.kt");
doTest(fileName);
}
@TestMetadata("compiler/testData/codegen/bytecodeListing/annotations")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)