diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index b87222cb843..66966251dcb 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -18,7 +18,6 @@ import org.jetbrains.kotlin.fir.descriptors.FirPackageFragmentDescriptor import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionStub -import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope @@ -41,8 +40,6 @@ import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.psi.psiUtil.endOffset -import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments class Fir2IrDeclarationStorage( private val components: Fir2IrComponents, @@ -459,7 +456,7 @@ class Fir2IrDeclarationStorage( else simpleFunction?.isSuspend == true val created = function.convertWithOffsets { startOffset, endOffset -> enterScope(descriptor) - val result = symbolTable.declareSimpleFunction(startOffset, endOffset, origin, descriptor) { symbol -> + val result = symbolTable.declareSimpleFunction(descriptor) { symbol -> IrFunctionImpl( startOffset, endOffset, updatedOrigin, symbol, name, visibility, @@ -562,11 +559,7 @@ class Fir2IrDeclarationStorage( WrappedPropertyGetterDescriptor(Annotations.EMPTY, SourceElement.NO_SOURCE) } val prefix = if (isSetter) "set" else "get" - return symbolTable.declareSimpleFunction( - propertyAccessor?.psi?.startOffsetSkippingComments ?: startOffset, - propertyAccessor?.psi?.endOffset ?: endOffset, - origin, descriptor - ) { symbol -> + return symbolTable.declareSimpleFunction(descriptor) { symbol -> val accessorReturnType = if (isSetter) irBuiltIns.unitType else propertyType IrFunctionImpl( startOffset, endOffset, origin, symbol, diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DataClassMembersGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DataClassMembersGenerator.kt index 7ad78c47c5e..22f11f47c18 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DataClassMembersGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/DataClassMembersGenerator.kt @@ -215,7 +215,7 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) { ): IrFunction { val functionDescriptor = WrappedSimpleFunctionDescriptor() val thisReceiverDescriptor = WrappedValueParameterDescriptor() - return components.symbolTable.declareSimpleFunction(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, functionDescriptor) { symbol -> + return components.symbolTable.declareSimpleFunction(functionDescriptor) { symbol -> IrFunctionImpl( UNDEFINED_OFFSET, UNDEFINED_OFFSET, diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt index 71238198674..46441cef330 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ArgumentsGenerationUtils.kt @@ -387,8 +387,6 @@ private fun StatementGenerator.createFunctionForSuspendConversion( val adapterFunctionDescriptor = WrappedSimpleFunctionDescriptor() val irAdapterFun = context.symbolTable.declareSimpleFunction( - startOffset, endOffset, - IrDeclarationOrigin.ADAPTER_FOR_SUSPEND_CONVERSION, adapterFunctionDescriptor ) { irAdapterSymbol -> IrFunctionImpl( diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt index 0ccfa334519..b3fb1486c3f 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ReflectionReferencesGenerator.kt @@ -340,8 +340,6 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St callableReferenceType.isKSuspendFunctionType return context.symbolTable.declareSimpleFunction( - startOffset, endOffset, - IrDeclarationOrigin.ADAPTER_FOR_CALLABLE_REFERENCE, adapterFunctionDescriptor ) { irAdapterSymbol -> IrFunctionImpl( diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StandaloneDeclarationGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StandaloneDeclarationGenerator.kt index 94e616dd9d9..fce09fc1a99 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StandaloneDeclarationGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StandaloneDeclarationGenerator.kt @@ -171,7 +171,7 @@ class StandaloneDeclarationGenerator(private val context: GeneratorContext) { startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, descriptor: FunctionDescriptor, symbol: IrSimpleFunctionSymbol, defaultArgumentFactory: IrFunction.(ValueParameterDescriptor) -> IrExpressionBody? = { null } ): IrSimpleFunction { - val irFunction = IrFunctionImpl(startOffset, endOffset, origin, symbol, IrUninitializedType) + val irFunction = IrFunctionImpl(startOffset, endOffset, origin, symbol, IrUninitializedType, descriptor) irFunction.metadata = MetadataSource.Function(descriptor) symbolTable.withScope(descriptor) { diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt index 3d2b08be0f8..bbd042b9bc9 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt @@ -23,43 +23,79 @@ class IrFunctionImpl( endOffset: Int, origin: IrDeclarationOrigin, override val symbol: IrSimpleFunctionSymbol, - name: Name = symbol.descriptor.name, - visibility: Visibility = symbol.descriptor.visibility, - override val modality: Modality = symbol.descriptor.modality, + name: Name, + visibility: Visibility, + override val modality: Modality, returnType: IrType, - isInline: Boolean = symbol.descriptor.isInline, - isExternal: Boolean = symbol.descriptor.isExternal, - override val isTailrec: Boolean = symbol.descriptor.isTailrec, - override val isSuspend: Boolean = symbol.descriptor.isSuspend, - override val isOperator: Boolean = symbol.descriptor.isOperator, - isExpect: Boolean = symbol.descriptor.isExpect, + isInline: Boolean, + isExternal: Boolean, + override val isTailrec: Boolean, + override val isSuspend: Boolean, + override val isOperator: Boolean, + isExpect: Boolean, override val isFakeOverride: Boolean = origin == IrDeclarationOrigin.FAKE_OVERRIDE ) : IrFunctionBase(startOffset, endOffset, origin, name, visibility, isInline, isExternal, isExpect, returnType), IrSimpleFunction, FunctionCarrier { + @Deprecated( + "This constructor is left for native compilation purpose only. " + + "It takes function attributes from symbol.descriptor " + + "Please either provide function attributes or its descriptor explicitly" + ) + constructor( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + symbol: IrSimpleFunctionSymbol, + returnType: IrType + ) : this( + startOffset, endOffset, origin, symbol, + name = symbol.descriptor.name, + visibility = symbol.descriptor.visibility, + modality = symbol.descriptor.modality, + returnType = returnType, + isInline = symbol.descriptor.isInline, + isExternal = symbol.descriptor.isExternal, + isTailrec = symbol.descriptor.isTailrec, + isSuspend = symbol.descriptor.isSuspend, + isOperator = symbol.descriptor.isOperator, + isExpect = symbol.descriptor.isExpect + ) + constructor( startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, symbol: IrSimpleFunctionSymbol, returnType: IrType, - visibility: Visibility = symbol.descriptor.visibility, - modality: Modality = symbol.descriptor.modality + descriptor: FunctionDescriptor, + name: Name = descriptor.name ) : this( startOffset, endOffset, origin, symbol, - symbol.descriptor.name, - visibility, - modality, - returnType, - isInline = symbol.descriptor.isInline, - isExternal = symbol.descriptor.isExternal, - isTailrec = symbol.descriptor.isTailrec, - isSuspend = symbol.descriptor.isSuspend, - isExpect = symbol.descriptor.isExpect, - isFakeOverride = origin == IrDeclarationOrigin.FAKE_OVERRIDE, - isOperator = symbol.descriptor.isOperator + name = name, + visibility = descriptor.visibility, + modality = descriptor.modality, + returnType = returnType, + isInline = descriptor.isInline, + isExternal = descriptor.isExternal, + isTailrec = descriptor.isTailrec, + isSuspend = descriptor.isSuspend, + isOperator = descriptor.isOperator, + isExpect = descriptor.isExpect + ) + + // Used by kotlin-native in InteropLowering.kt and IrUtils2.kt + constructor( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + descriptor: FunctionDescriptor, + returnType: IrType + ) : this( + startOffset, endOffset, origin, + IrSimpleFunctionSymbolImpl(descriptor), returnType, descriptor ) override val descriptor: FunctionDescriptor = symbol.descriptor @@ -94,18 +130,6 @@ class IrFunctionImpl( } } - // Used by kotlin-native in InteropLowering.kt and IrUtils2.kt - constructor( - startOffset: Int, - endOffset: Int, - origin: IrDeclarationOrigin, - descriptor: FunctionDescriptor, - returnType: IrType - ) : this( - startOffset, endOffset, origin, - IrSimpleFunctionSymbolImpl(descriptor), returnType - ) - init { symbol.bind(this) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrFunctionFactory.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrFunctionFactory.kt index c11ef13849d..810d5d0c2da 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrFunctionFactory.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrFunctionFactory.kt @@ -167,7 +167,7 @@ class IrFunctionFactory(private val irBuiltIns: IrBuiltIns, private val symbolTa getContributedFunctions(Name.identifier(name), NoLookupLocation.FROM_BACKEND).first() } } - return symbolTable.declareSimpleFunction(offset, offset, memberOrigin, descriptor, factory).symbol + return symbolTable.declareSimpleFunction(descriptor, factory).symbol } override fun FunctionDescriptor.valueParameterDescriptor(index: Int): ValueParameterDescriptor { @@ -292,7 +292,8 @@ class IrFunctionFactory(private val irBuiltIns: IrBuiltIns, private val symbolTa buildSimpleType() } - IrFunctionImpl(offset, offset, memberOrigin, it, Name.identifier("invoke"), Visibilities.PUBLIC, Modality.ABSTRACT, + IrFunctionImpl( + offset, offset, memberOrigin, it, Name.identifier("invoke"), Visibilities.PUBLIC, Modality.ABSTRACT, returnType, isInline = false, isExternal = false, @@ -369,7 +370,7 @@ class IrFunctionFactory(private val irBuiltIns: IrBuiltIns, private val symbolTa fun createFakeOverrideFunction(descriptor: FunctionDescriptor, property: IrPropertySymbol?): IrSimpleFunction { val returnType = descriptor.returnType?.let { toIrType(it) } ?: error("No return type for $descriptor") - val newFunction = symbolTable.declareSimpleFunction(offset, offset, memberOrigin, descriptor) { + val newFunction = symbolTable.declareSimpleFunction(descriptor) { descriptor.run { IrFunctionImpl( offset, offset, memberOrigin, it, name, visibility, modality, returnType, diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt index 92a983f83f8..c530539fe8f 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/DeclarationStubGenerator.kt @@ -210,11 +210,7 @@ class DeclarationStubGenerator( if (descriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) IrDeclarationOrigin.FAKE_OVERRIDE else computeOrigin(descriptor) - return symbolTable.declareSimpleFunction( - UNDEFINED_OFFSET, UNDEFINED_OFFSET, - origin, - descriptor.original - ) { + return symbolTable.declareSimpleFunction(descriptor.original) { IrLazyFunction( UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, it, descriptor, diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt index 99d9ffb23f2..c96cb55864b 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt @@ -692,19 +692,8 @@ open class SymbolTable( } fun declareSimpleFunction( - startOffset: Int, - endOffset: Int, - origin: IrDeclarationOrigin, descriptor: FunctionDescriptor, - functionFactory: (IrSimpleFunctionSymbol) -> IrSimpleFunction = { - IrFunctionImpl( - startOffset, endOffset, origin, it, - nameProvider.nameForDeclaration(descriptor), - returnType = IrUninitializedType - ).apply { - metadata = MetadataSource.Function(it.descriptor) - } - } + functionFactory: (IrSimpleFunctionSymbol) -> IrSimpleFunction ): IrSimpleFunction { return simpleFunctionSymbolTable.declare( descriptor, diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/overrides.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/overrides.kt index 902a50c5ce9..ced6792cbd1 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/overrides.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/overrides.kt @@ -10,7 +10,10 @@ import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrField import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction +import org.jetbrains.kotlin.ir.declarations.MetadataSource +import org.jetbrains.kotlin.ir.declarations.impl.IrFunctionImpl import org.jetbrains.kotlin.ir.types.IrType +import org.jetbrains.kotlin.ir.types.impl.IrUninitializedType fun SymbolTable.declareSimpleFunctionWithOverrides( startOffset: Int, @@ -18,7 +21,16 @@ fun SymbolTable.declareSimpleFunctionWithOverrides( origin: IrDeclarationOrigin, descriptor: FunctionDescriptor ) = - declareSimpleFunction(startOffset, endOffset, origin, descriptor).also { declaration -> + declareSimpleFunction(descriptor) { + IrFunctionImpl( + startOffset, endOffset, origin, it, + returnType = IrUninitializedType, + descriptor = descriptor, + name = nameProvider.nameForDeclaration(descriptor), + ).apply { + metadata = MetadataSource.Function(descriptor) + } + }.also { declaration -> generateOverriddenFunctionSymbols(declaration, this) } diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt index 872e3fcfa12..c29fb0fbe3d 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt @@ -252,7 +252,8 @@ interface IrBuilderExtension { fieldSymbol.owner.endOffset, SERIALIZABLE_PLUGIN_ORIGIN, symbol, - descriptor.returnType!!.toIrType() + descriptor.returnType!!.toIrType(), + descriptor ).also { f -> generateOverriddenFunctionSymbols(f, compilerContext.symbolTable) f.createParameterDeclarations(receiver = null)