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 { fun IrFunctionBuilder.buildFun(originalDescriptor: FunctionDescriptor? = null): IrFunctionImpl {
val wrappedDescriptor = if (originalDescriptor is DescriptorWithContainerSource) val wrappedDescriptor = when(originalDescriptor) {
WrappedFunctionDescriptorWithContainerSource(originalDescriptor.containerSource) is DescriptorWithContainerSource -> WrappedFunctionDescriptorWithContainerSource(originalDescriptor.containerSource)
else if (originalDescriptor != null) is PropertyGetterDescriptor -> WrappedPropertyGetterDescriptor(originalDescriptor.annotations, originalDescriptor.source)
WrappedSimpleFunctionDescriptor(originalDescriptor) is PropertySetterDescriptor -> WrappedPropertySetterDescriptor(originalDescriptor.annotations, originalDescriptor.source)
else null -> WrappedSimpleFunctionDescriptor()
WrappedSimpleFunctionDescriptor() else -> WrappedSimpleFunctionDescriptor(originalDescriptor)
}
return IrFunctionImpl( return IrFunctionImpl(
startOffset, endOffset, origin, startOffset, endOffset, origin,
IrSimpleFunctionSymbolImpl(wrappedDescriptor), IrSimpleFunctionSymbolImpl(wrappedDescriptor),
@@ -74,7 +74,7 @@ class MethodSignatureMapper(private val context: JvmBackendContext) {
if (nameForSpecialFunction != null) return nameForSpecialFunction if (nameForSpecialFunction != null) return nameForSpecialFunction
val property = (function as? IrSimpleFunction)?.correspondingPropertySymbol?.owner val property = (function as? IrSimpleFunction)?.correspondingPropertySymbol?.owner
if (property != null) { if (property != null && function.name.isSpecial) {
val propertyName = property.name.asString() val propertyName = property.name.asString()
if (property.parent.let { it is IrClass && it.isAnnotationClass }) return propertyName 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.name.Name
import org.jetbrains.kotlin.resolve.InlineClassDescriptorResolver import org.jetbrains.kotlin.resolve.InlineClassDescriptorResolver
import org.jetbrains.kotlin.storage.LockBasedStorageManager import org.jetbrains.kotlin.storage.LockBasedStorageManager
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class IrReplacementFunction( class IrReplacementFunction(
val function: IrFunction, val function: IrFunction,
@@ -196,6 +197,7 @@ class MemoizedInlineClassReplacements {
copyTypeParameters(function.constructedClass.typeParameters + function.typeParameters) copyTypeParameters(function.constructedClass.typeParameters + function.typeParameters)
} else { } else {
copyTypeParametersFrom(function) copyTypeParametersFrom(function)
correspondingPropertySymbol = function.safeAs<IrSimpleFunction>()?.correspondingPropertySymbol
} }
body() 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"); runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt");
} }
@TestMetadata("inlineClassInlineProperty.kt")
public void testInlineClassInlineProperty() throws Exception {
runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassInlineProperty.kt");
}
@TestMetadata("inlinedConstants.kt") @TestMetadata("inlinedConstants.kt")
public void testInlinedConstants() throws Exception { public void testInlinedConstants() throws Exception {
runTest("compiler/testData/compileKotlinAgainstKotlin/inlinedConstants.kt"); runTest("compiler/testData/compileKotlinAgainstKotlin/inlinedConstants.kt");
@@ -128,6 +128,11 @@ public class IrCompileKotlinAgainstKotlinTestGenerated extends AbstractIrCompile
runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt"); runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassFromBinaryDependencies.kt");
} }
@TestMetadata("inlineClassInlineProperty.kt")
public void testInlineClassInlineProperty() throws Exception {
runTest("compiler/testData/compileKotlinAgainstKotlin/inlineClassInlineProperty.kt");
}
@TestMetadata("inlinedConstants.kt") @TestMetadata("inlinedConstants.kt")
public void testInlinedConstants() throws Exception { public void testInlinedConstants() throws Exception {
runTest("compiler/testData/compileKotlinAgainstKotlin/inlinedConstants.kt"); runTest("compiler/testData/compileKotlinAgainstKotlin/inlinedConstants.kt");