JVM IR: Fix inlining of inline class properties in external modules
This commit is contained in:
committed by
Alexander Udalov
parent
fa62d0c325
commit
23dfade24f
+7
-6
@@ -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),
|
||||
|
||||
+1
-1
@@ -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
|
||||
|
||||
|
||||
+2
@@ -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
|
||||
}
|
||||
+5
@@ -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");
|
||||
|
||||
Generated
+5
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user