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 {
|
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),
|
||||||
|
|||||||
+1
-1
@@ -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
|
||||||
|
|
||||||
|
|||||||
+2
@@ -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
|
||||||
|
}
|
||||||
+5
@@ -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");
|
||||||
|
|||||||
Generated
+5
@@ -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");
|
||||||
|
|||||||
Reference in New Issue
Block a user