JVM IR: Fix inlining of inline class properties in external modules

This commit is contained in:
Steven Schäfer
2019-11-12 12:21:02 +01:00
committed by Alexander Udalov
parent fa62d0c325
commit 23dfade24f
6 changed files with 35 additions and 7 deletions
@@ -116,12 +116,13 @@ inline fun IrProperty.addSetter(builder: IrFunctionBuilder.() -> Unit = {}): IrS
}
fun IrFunctionBuilder.buildFun(originalDescriptor: FunctionDescriptor? = null): IrFunctionImpl {
val wrappedDescriptor = if (originalDescriptor is DescriptorWithContainerSource)
WrappedFunctionDescriptorWithContainerSource(originalDescriptor.containerSource)
else if (originalDescriptor != null)
WrappedSimpleFunctionDescriptor(originalDescriptor)
else
WrappedSimpleFunctionDescriptor()
val wrappedDescriptor = when(originalDescriptor) {
is DescriptorWithContainerSource -> WrappedFunctionDescriptorWithContainerSource(originalDescriptor.containerSource)
is PropertyGetterDescriptor -> WrappedPropertyGetterDescriptor(originalDescriptor.annotations, originalDescriptor.source)
is PropertySetterDescriptor -> WrappedPropertySetterDescriptor(originalDescriptor.annotations, originalDescriptor.source)
null -> WrappedSimpleFunctionDescriptor()
else -> WrappedSimpleFunctionDescriptor(originalDescriptor)
}
return IrFunctionImpl(
startOffset, endOffset, origin,
IrSimpleFunctionSymbolImpl(wrappedDescriptor),
@@ -74,7 +74,7 @@ class MethodSignatureMapper(private val context: JvmBackendContext) {
if (nameForSpecialFunction != null) return nameForSpecialFunction
val property = (function as? IrSimpleFunction)?.correspondingPropertySymbol?.owner
if (property != null) {
if (property != null && function.name.isSpecial) {
val propertyName = property.name.asString()
if (property.parent.let { it is IrClass && it.isAnnotationClass }) return propertyName
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.ir.util.explicitParameters
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.InlineClassDescriptorResolver
import org.jetbrains.kotlin.storage.LockBasedStorageManager
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class IrReplacementFunction(
val function: IrFunction,
@@ -196,6 +197,7 @@ class MemoizedInlineClassReplacements {
copyTypeParameters(function.constructedClass.typeParameters + function.typeParameters)
} else {
copyTypeParametersFrom(function)
correspondingPropertySymbol = function.safeAs<IrSimpleFunction>()?.correspondingPropertySymbol
}
body()
}
@@ -0,0 +1,15 @@
// !LANGUAGE: +InlineClasses
// FILE: A.kt
package a
inline class S(val value: String) {
inline val k: String
get() = value + "K"
}
// FILE: B.kt
fun box(): String {
return a.S("O").k
}
@@ -133,6 +133,11 @@ public class CompileKotlinAgainstKotlinTestGenerated extends AbstractCompileKotl
runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt");
}
@TestMetadata("inlineClassInlineProperty.kt")
public void testInlineClassInlineProperty() throws Exception {
runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassInlineProperty.kt");
}
@TestMetadata("inlinedConstants.kt")
public void testInlinedConstants() throws Exception {
runTest("compiler/testData/compileKotlinAgainstKotlin/inlinedConstants.kt");
@@ -128,6 +128,11 @@ public class IrCompileKotlinAgainstKotlinTestGenerated extends AbstractIrCompile
runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt");
}
@TestMetadata("inlineClassInlineProperty.kt")
public void testInlineClassInlineProperty() throws Exception {
runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassInlineProperty.kt");
}
@TestMetadata("inlinedConstants.kt")
public void testInlinedConstants() throws Exception {
runTest("compiler/testData/compileKotlinAgainstKotlin/inlinedConstants.kt");