[IR] Fix synthetic declarations generator to make it produce correct type
- Fix KT-40126 - Add test
This commit is contained in:
+4
-4
@@ -133,7 +133,7 @@ class StandaloneDeclarationGenerator(private val context: GeneratorContext) {
|
|||||||
protected fun generateValueParameterDeclarations(
|
protected fun generateValueParameterDeclarations(
|
||||||
irFunction: IrFunction,
|
irFunction: IrFunction,
|
||||||
functionDescriptor: FunctionDescriptor,
|
functionDescriptor: FunctionDescriptor,
|
||||||
defaultArgumentFactory: IrFunction.(ValueParameterDescriptor) -> IrExpressionBody?
|
defaultArgumentFactory: IrFunction.(IrValueParameter) -> IrExpressionBody?
|
||||||
) {
|
) {
|
||||||
|
|
||||||
// TODO: KtElements
|
// TODO: KtElements
|
||||||
@@ -150,14 +150,14 @@ class StandaloneDeclarationGenerator(private val context: GeneratorContext) {
|
|||||||
irFunction.valueParameters = functionDescriptor.valueParameters.map { valueParameterDescriptor ->
|
irFunction.valueParameters = functionDescriptor.valueParameters.map { valueParameterDescriptor ->
|
||||||
val ktParameter = DescriptorToSourceUtils.getSourceFromDescriptor(valueParameterDescriptor) as? KtParameter
|
val ktParameter = DescriptorToSourceUtils.getSourceFromDescriptor(valueParameterDescriptor) as? KtParameter
|
||||||
declareParameter(valueParameterDescriptor, ktParameter, irFunction).also {
|
declareParameter(valueParameterDescriptor, ktParameter, irFunction).also {
|
||||||
it.defaultValue = irFunction.defaultArgumentFactory(valueParameterDescriptor)
|
it.defaultValue = irFunction.defaultArgumentFactory(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun generateConstructor(
|
fun generateConstructor(
|
||||||
startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, descriptor: ClassConstructorDescriptor, symbol: IrConstructorSymbol,
|
startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, descriptor: ClassConstructorDescriptor, symbol: IrConstructorSymbol,
|
||||||
defaultArgumentFactory: IrFunction.(ValueParameterDescriptor) -> IrExpressionBody? = { null }
|
defaultArgumentFactory: IrFunction.(IrValueParameter) -> IrExpressionBody? = { null }
|
||||||
): IrConstructor {
|
): IrConstructor {
|
||||||
val irConstructor = IrConstructorImpl(startOffset, endOffset, origin, symbol, IrUninitializedType, descriptor)
|
val irConstructor = IrConstructorImpl(startOffset, endOffset, origin, symbol, IrUninitializedType, descriptor)
|
||||||
irConstructor.metadata = MetadataSource.Function(descriptor)
|
irConstructor.metadata = MetadataSource.Function(descriptor)
|
||||||
@@ -178,7 +178,7 @@ class StandaloneDeclarationGenerator(private val context: GeneratorContext) {
|
|||||||
|
|
||||||
fun generateSimpleFunction(
|
fun generateSimpleFunction(
|
||||||
startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, descriptor: FunctionDescriptor, symbol: IrSimpleFunctionSymbol,
|
startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, descriptor: FunctionDescriptor, symbol: IrSimpleFunctionSymbol,
|
||||||
defaultArgumentFactory: IrFunction.(ValueParameterDescriptor) -> IrExpressionBody? = { null }
|
defaultArgumentFactory: IrFunction.(IrValueParameter) -> IrExpressionBody? = { null }
|
||||||
): IrSimpleFunction {
|
): IrSimpleFunction {
|
||||||
val irFunction = IrFunctionImpl(startOffset, endOffset, origin, symbol, IrUninitializedType, descriptor)
|
val irFunction = IrFunctionImpl(startOffset, endOffset, origin, symbol, IrUninitializedType, descriptor)
|
||||||
irFunction.metadata = MetadataSource.Function(descriptor)
|
irFunction.metadata = MetadataSource.Function(descriptor)
|
||||||
|
|||||||
+4
-5
@@ -31,16 +31,15 @@ class SyntheticDeclarationsGenerator(context: GeneratorContext) : DeclarationDes
|
|||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
private val errorType = IrErrorTypeImpl(null, emptyList(), Variance.INVARIANT)
|
private fun IrFunction.defaultArgumentFactory(parameter: IrValueParameter): IrExpressionBody? {
|
||||||
|
val descriptor = parameter.descriptor as ValueParameterDescriptor
|
||||||
private fun IrFunction.defaultArgumentFactory(descriptor: ValueParameterDescriptor): IrExpressionBody? {
|
|
||||||
if (!descriptor.declaresDefaultValue()) return null
|
if (!descriptor.declaresDefaultValue()) return null
|
||||||
|
|
||||||
val description = "Default Argument Value stub for ${descriptor.name}|${descriptor.index}"
|
val description = "Default Argument Value stub for ${descriptor.name}|${descriptor.index}"
|
||||||
return IrExpressionBodyImpl(IrErrorExpressionImpl(startOffset, endOffset, errorType, description))
|
return IrExpressionBodyImpl(IrErrorExpressionImpl(startOffset, endOffset, parameter.type, description))
|
||||||
}
|
}
|
||||||
|
|
||||||
private val defaultFactoryReference: IrFunction.(ValueParameterDescriptor) -> IrExpressionBody? = { defaultArgumentFactory(it) }
|
private val defaultFactoryReference: IrFunction.(IrValueParameter) -> IrExpressionBody? = { defaultArgumentFactory(it) }
|
||||||
|
|
||||||
override fun visitPackageFragmentDescriptor(descriptor: PackageFragmentDescriptor, data: IrDeclarationContainer?) {
|
override fun visitPackageFragmentDescriptor(descriptor: PackageFragmentDescriptor, data: IrDeclarationContainer?) {
|
||||||
error("Unexpected declaration descriptor $descriptor")
|
error("Unexpected declaration descriptor $descriptor")
|
||||||
|
|||||||
+2
-1
@@ -39,6 +39,7 @@ import org.jetbrains.kotlin.ir.types.impl.originalKotlinType
|
|||||||
import org.jetbrains.kotlin.ir.util.SymbolTable
|
import org.jetbrains.kotlin.ir.util.SymbolTable
|
||||||
import org.jetbrains.kotlin.ir.util.TypeTranslator
|
import org.jetbrains.kotlin.ir.util.TypeTranslator
|
||||||
import org.jetbrains.kotlin.ir.util.coerceToUnit
|
import org.jetbrains.kotlin.ir.util.coerceToUnit
|
||||||
|
import org.jetbrains.kotlin.ir.util.render
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
||||||
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
||||||
@@ -341,7 +342,7 @@ internal class InsertImplicitCasts(
|
|||||||
|
|
||||||
val notNullableExpectedType = expectedType.makeNotNullable()
|
val notNullableExpectedType = expectedType.makeNotNullable()
|
||||||
|
|
||||||
val valueType = this.type.originalKotlinType!!
|
val valueType = this.type.originalKotlinType ?: error("Expecting original kotlin type for IrType ${type.render()}")
|
||||||
|
|
||||||
return when {
|
return when {
|
||||||
expectedType.isUnit() ->
|
expectedType.isUnit() ->
|
||||||
|
|||||||
+5
@@ -1271,6 +1271,11 @@ public class IrBoxJsES6TestGenerated extends AbstractIrBoxJsES6Test {
|
|||||||
runTest("js/js.translator/testData/box/delegation/delegationExtensionPropertyDelegated.kt");
|
runTest("js/js.translator/testData/box/delegation/delegationExtensionPropertyDelegated.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("delegationToExternaInterface.kt")
|
||||||
|
public void testDelegationToExternaInterface() throws Exception {
|
||||||
|
runTest("js/js.translator/testData/box/delegation/delegationToExternaInterface.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("jsNamePropertyDelegation.kt")
|
@TestMetadata("jsNamePropertyDelegation.kt")
|
||||||
public void testJsNamePropertyDelegation() throws Exception {
|
public void testJsNamePropertyDelegation() throws Exception {
|
||||||
runTest("js/js.translator/testData/box/delegation/jsNamePropertyDelegation.kt");
|
runTest("js/js.translator/testData/box/delegation/jsNamePropertyDelegation.kt");
|
||||||
|
|||||||
+5
@@ -1271,6 +1271,11 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest {
|
|||||||
runTest("js/js.translator/testData/box/delegation/delegationExtensionPropertyDelegated.kt");
|
runTest("js/js.translator/testData/box/delegation/delegationExtensionPropertyDelegated.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("delegationToExternaInterface.kt")
|
||||||
|
public void testDelegationToExternaInterface() throws Exception {
|
||||||
|
runTest("js/js.translator/testData/box/delegation/delegationToExternaInterface.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("jsNamePropertyDelegation.kt")
|
@TestMetadata("jsNamePropertyDelegation.kt")
|
||||||
public void testJsNamePropertyDelegation() throws Exception {
|
public void testJsNamePropertyDelegation() throws Exception {
|
||||||
runTest("js/js.translator/testData/box/delegation/jsNamePropertyDelegation.kt");
|
runTest("js/js.translator/testData/box/delegation/jsNamePropertyDelegation.kt");
|
||||||
|
|||||||
+5
@@ -1271,6 +1271,11 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest {
|
|||||||
runTest("js/js.translator/testData/box/delegation/delegationExtensionPropertyDelegated.kt");
|
runTest("js/js.translator/testData/box/delegation/delegationExtensionPropertyDelegated.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("delegationToExternaInterface.kt")
|
||||||
|
public void testDelegationToExternaInterface() throws Exception {
|
||||||
|
runTest("js/js.translator/testData/box/delegation/delegationToExternaInterface.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("jsNamePropertyDelegation.kt")
|
@TestMetadata("jsNamePropertyDelegation.kt")
|
||||||
public void testJsNamePropertyDelegation() throws Exception {
|
public void testJsNamePropertyDelegation() throws Exception {
|
||||||
runTest("js/js.translator/testData/box/delegation/jsNamePropertyDelegation.kt");
|
runTest("js/js.translator/testData/box/delegation/jsNamePropertyDelegation.kt");
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
// EXPECTED_REACHABLE_NODES: 1236
|
||||||
|
// KJS_WITH_FULL_RUNTIME
|
||||||
|
// KT-40126
|
||||||
|
@file:Suppress("EXTERNAL_DELEGATION")
|
||||||
|
|
||||||
|
@Suppress("NESTED_CLASS_IN_EXTERNAL_INTERFACE")
|
||||||
|
external interface MySymbol {
|
||||||
|
companion object : MySymbolConstructor by definedExternally
|
||||||
|
}
|
||||||
|
external interface MySymbolConstructor {
|
||||||
|
@nativeInvoke
|
||||||
|
operator fun invoke(description: String = definedExternally): Any
|
||||||
|
}
|
||||||
|
|
||||||
|
fun box() = "OK"
|
||||||
Reference in New Issue
Block a user