IC Mangling: search parents for method if descriptor is fake override
Otherwise, the compiler generates call using old mangling scheme because classfile does not contain the method.
This commit is contained in:
@@ -6,10 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.codegen
|
package org.jetbrains.kotlin.codegen
|
||||||
|
|
||||||
import org.jetbrains.kotlin.codegen.state.GenerationState
|
import org.jetbrains.kotlin.codegen.state.GenerationState
|
||||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
|
|
||||||
import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor
|
||||||
import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource
|
import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource
|
||||||
import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder
|
import org.jetbrains.kotlin.load.kotlin.VirtualFileFinder
|
||||||
@@ -44,6 +41,10 @@ fun CallableDescriptor.isGenericParameter(): Boolean {
|
|||||||
fun classFileContainsMethod(descriptor: FunctionDescriptor, state: GenerationState, method: Method): Boolean? {
|
fun classFileContainsMethod(descriptor: FunctionDescriptor, state: GenerationState, method: Method): Boolean? {
|
||||||
if (descriptor !is DeserializedSimpleFunctionDescriptor) return null
|
if (descriptor !is DeserializedSimpleFunctionDescriptor) return null
|
||||||
|
|
||||||
|
if (descriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) {
|
||||||
|
return descriptor.overriddenDescriptors.any { classFileContainsMethod(it, state, method) == true }
|
||||||
|
}
|
||||||
|
|
||||||
val classId: ClassId = when {
|
val classId: ClassId = when {
|
||||||
descriptor.containingDeclaration is DeserializedClassDescriptor -> {
|
descriptor.containingDeclaration is DeserializedClassDescriptor -> {
|
||||||
(descriptor.containingDeclaration as DeserializedClassDescriptor).classId ?: return null
|
(descriptor.containingDeclaration as DeserializedClassDescriptor).classId ?: return null
|
||||||
|
|||||||
+5
@@ -153,6 +153,11 @@ public class FirCompileKotlinAgainstKotlinTestGenerated extends AbstractFirCompi
|
|||||||
runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt");
|
runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("inlineClassFakeOverrideMangling.kt")
|
||||||
|
public void testInlineClassFakeOverrideMangling() throws Exception {
|
||||||
|
runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFakeOverrideMangling.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("inlineClassFromBinaryDependencies.kt")
|
@TestMetadata("inlineClassFromBinaryDependencies.kt")
|
||||||
public void testInlineClassFromBinaryDependencies() throws Exception {
|
public void testInlineClassFromBinaryDependencies() throws Exception {
|
||||||
runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt");
|
runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt");
|
||||||
|
|||||||
+22
@@ -0,0 +1,22 @@
|
|||||||
|
// !LANGUAGE: +InlineClasses
|
||||||
|
|
||||||
|
// FILE: 1.kt
|
||||||
|
|
||||||
|
inline class IC(val s: String)
|
||||||
|
|
||||||
|
abstract class A {
|
||||||
|
fun foo(s: String) = IC(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
open class C : A()
|
||||||
|
|
||||||
|
class D: C()
|
||||||
|
|
||||||
|
// FILE: 2.kt
|
||||||
|
|
||||||
|
fun box(): String {
|
||||||
|
var res = C().foo("OK").s
|
||||||
|
if (res != "OK") return "FAIL 1 $res"
|
||||||
|
res = D().foo("OK").s
|
||||||
|
return res
|
||||||
|
}
|
||||||
Generated
+5
@@ -158,6 +158,11 @@ public class CompileKotlinAgainstKotlinTestGenerated extends AbstractCompileKotl
|
|||||||
runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt");
|
runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("inlineClassFakeOverrideMangling.kt")
|
||||||
|
public void testInlineClassFakeOverrideMangling() throws Exception {
|
||||||
|
runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFakeOverrideMangling.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("inlineClassFromBinaryDependencies.kt")
|
@TestMetadata("inlineClassFromBinaryDependencies.kt")
|
||||||
public void testInlineClassFromBinaryDependencies() throws Exception {
|
public void testInlineClassFromBinaryDependencies() throws Exception {
|
||||||
runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt");
|
runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt");
|
||||||
|
|||||||
Generated
+5
@@ -153,6 +153,11 @@ public class IrCompileKotlinAgainstKotlinTestGenerated extends AbstractIrCompile
|
|||||||
runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt");
|
runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("inlineClassFakeOverrideMangling.kt")
|
||||||
|
public void testInlineClassFakeOverrideMangling() throws Exception {
|
||||||
|
runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFakeOverrideMangling.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("inlineClassFromBinaryDependencies.kt")
|
@TestMetadata("inlineClassFromBinaryDependencies.kt")
|
||||||
public void testInlineClassFromBinaryDependencies() throws Exception {
|
public void testInlineClassFromBinaryDependencies() throws Exception {
|
||||||
runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt");
|
runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt");
|
||||||
|
|||||||
+5
@@ -153,6 +153,11 @@ public class JvmIrAgainstOldBoxTestGenerated extends AbstractJvmIrAgainstOldBoxT
|
|||||||
runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt");
|
runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("inlineClassFakeOverrideMangling.kt")
|
||||||
|
public void testInlineClassFakeOverrideMangling() throws Exception {
|
||||||
|
runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFakeOverrideMangling.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("inlineClassFromBinaryDependencies.kt")
|
@TestMetadata("inlineClassFromBinaryDependencies.kt")
|
||||||
public void testInlineClassFromBinaryDependencies() throws Exception {
|
public void testInlineClassFromBinaryDependencies() throws Exception {
|
||||||
runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt");
|
runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt");
|
||||||
|
|||||||
+5
@@ -153,6 +153,11 @@ public class JvmOldAgainstIrBoxTestGenerated extends AbstractJvmOldAgainstIrBoxT
|
|||||||
runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt");
|
runTest("compiler/testData/compileKotlinAgainstKotlin/importCompanion.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("inlineClassFakeOverrideMangling.kt")
|
||||||
|
public void testInlineClassFakeOverrideMangling() throws Exception {
|
||||||
|
runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFakeOverrideMangling.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("inlineClassFromBinaryDependencies.kt")
|
@TestMetadata("inlineClassFromBinaryDependencies.kt")
|
||||||
public void testInlineClassFromBinaryDependencies() throws Exception {
|
public void testInlineClassFromBinaryDependencies() throws Exception {
|
||||||
runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt");
|
runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user