[IR] Unbind construction methods of IrFunctionImpl from symbol.descriptor

This commit is contained in:
Mikhail Glukhikh
2020-05-18 16:09:20 +03:00
parent a7d514a0a9
commit 262548fd5b
11 changed files with 83 additions and 71 deletions
@@ -18,7 +18,6 @@ import org.jetbrains.kotlin.fir.descriptors.FirPackageFragmentDescriptor
import org.jetbrains.kotlin.fir.expressions.FirConstExpression import org.jetbrains.kotlin.fir.expressions.FirConstExpression
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionStub 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.render
import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope 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.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.psiUtil.endOffset
import org.jetbrains.kotlin.psi.psiUtil.startOffsetSkippingComments
class Fir2IrDeclarationStorage( class Fir2IrDeclarationStorage(
private val components: Fir2IrComponents, private val components: Fir2IrComponents,
@@ -459,7 +456,7 @@ class Fir2IrDeclarationStorage(
else simpleFunction?.isSuspend == true else simpleFunction?.isSuspend == true
val created = function.convertWithOffsets { startOffset, endOffset -> val created = function.convertWithOffsets { startOffset, endOffset ->
enterScope(descriptor) enterScope(descriptor)
val result = symbolTable.declareSimpleFunction(startOffset, endOffset, origin, descriptor) { symbol -> val result = symbolTable.declareSimpleFunction(descriptor) { symbol ->
IrFunctionImpl( IrFunctionImpl(
startOffset, endOffset, updatedOrigin, symbol, startOffset, endOffset, updatedOrigin, symbol,
name, visibility, name, visibility,
@@ -562,11 +559,7 @@ class Fir2IrDeclarationStorage(
WrappedPropertyGetterDescriptor(Annotations.EMPTY, SourceElement.NO_SOURCE) WrappedPropertyGetterDescriptor(Annotations.EMPTY, SourceElement.NO_SOURCE)
} }
val prefix = if (isSetter) "set" else "get" val prefix = if (isSetter) "set" else "get"
return symbolTable.declareSimpleFunction( return symbolTable.declareSimpleFunction(descriptor) { symbol ->
propertyAccessor?.psi?.startOffsetSkippingComments ?: startOffset,
propertyAccessor?.psi?.endOffset ?: endOffset,
origin, descriptor
) { symbol ->
val accessorReturnType = if (isSetter) irBuiltIns.unitType else propertyType val accessorReturnType = if (isSetter) irBuiltIns.unitType else propertyType
IrFunctionImpl( IrFunctionImpl(
startOffset, endOffset, origin, symbol, startOffset, endOffset, origin, symbol,
@@ -215,7 +215,7 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) {
): IrFunction { ): IrFunction {
val functionDescriptor = WrappedSimpleFunctionDescriptor() val functionDescriptor = WrappedSimpleFunctionDescriptor()
val thisReceiverDescriptor = WrappedValueParameterDescriptor() val thisReceiverDescriptor = WrappedValueParameterDescriptor()
return components.symbolTable.declareSimpleFunction(UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, functionDescriptor) { symbol -> return components.symbolTable.declareSimpleFunction(functionDescriptor) { symbol ->
IrFunctionImpl( IrFunctionImpl(
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
@@ -387,8 +387,6 @@ private fun StatementGenerator.createFunctionForSuspendConversion(
val adapterFunctionDescriptor = WrappedSimpleFunctionDescriptor() val adapterFunctionDescriptor = WrappedSimpleFunctionDescriptor()
val irAdapterFun = context.symbolTable.declareSimpleFunction( val irAdapterFun = context.symbolTable.declareSimpleFunction(
startOffset, endOffset,
IrDeclarationOrigin.ADAPTER_FOR_SUSPEND_CONVERSION,
adapterFunctionDescriptor adapterFunctionDescriptor
) { irAdapterSymbol -> ) { irAdapterSymbol ->
IrFunctionImpl( IrFunctionImpl(
@@ -340,8 +340,6 @@ class ReflectionReferencesGenerator(statementGenerator: StatementGenerator) : St
callableReferenceType.isKSuspendFunctionType callableReferenceType.isKSuspendFunctionType
return context.symbolTable.declareSimpleFunction( return context.symbolTable.declareSimpleFunction(
startOffset, endOffset,
IrDeclarationOrigin.ADAPTER_FOR_CALLABLE_REFERENCE,
adapterFunctionDescriptor adapterFunctionDescriptor
) { irAdapterSymbol -> ) { irAdapterSymbol ->
IrFunctionImpl( IrFunctionImpl(
@@ -171,7 +171,7 @@ class StandaloneDeclarationGenerator(private val context: GeneratorContext) {
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.(ValueParameterDescriptor) -> IrExpressionBody? = { null }
): IrSimpleFunction { ): IrSimpleFunction {
val irFunction = IrFunctionImpl(startOffset, endOffset, origin, symbol, IrUninitializedType) val irFunction = IrFunctionImpl(startOffset, endOffset, origin, symbol, IrUninitializedType, descriptor)
irFunction.metadata = MetadataSource.Function(descriptor) irFunction.metadata = MetadataSource.Function(descriptor)
symbolTable.withScope(descriptor) { symbolTable.withScope(descriptor) {
@@ -23,43 +23,79 @@ class IrFunctionImpl(
endOffset: Int, endOffset: Int,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
override val symbol: IrSimpleFunctionSymbol, override val symbol: IrSimpleFunctionSymbol,
name: Name = symbol.descriptor.name, name: Name,
visibility: Visibility = symbol.descriptor.visibility, visibility: Visibility,
override val modality: Modality = symbol.descriptor.modality, override val modality: Modality,
returnType: IrType, returnType: IrType,
isInline: Boolean = symbol.descriptor.isInline, isInline: Boolean,
isExternal: Boolean = symbol.descriptor.isExternal, isExternal: Boolean,
override val isTailrec: Boolean = symbol.descriptor.isTailrec, override val isTailrec: Boolean,
override val isSuspend: Boolean = symbol.descriptor.isSuspend, override val isSuspend: Boolean,
override val isOperator: Boolean = symbol.descriptor.isOperator, override val isOperator: Boolean,
isExpect: Boolean = symbol.descriptor.isExpect, isExpect: Boolean,
override val isFakeOverride: Boolean = origin == IrDeclarationOrigin.FAKE_OVERRIDE override val isFakeOverride: Boolean = origin == IrDeclarationOrigin.FAKE_OVERRIDE
) : ) :
IrFunctionBase<FunctionCarrier>(startOffset, endOffset, origin, name, visibility, isInline, isExternal, isExpect, returnType), IrFunctionBase<FunctionCarrier>(startOffset, endOffset, origin, name, visibility, isInline, isExternal, isExpect, returnType),
IrSimpleFunction, IrSimpleFunction,
FunctionCarrier { 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( constructor(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
symbol: IrSimpleFunctionSymbol, symbol: IrSimpleFunctionSymbol,
returnType: IrType, returnType: IrType,
visibility: Visibility = symbol.descriptor.visibility, descriptor: FunctionDescriptor,
modality: Modality = symbol.descriptor.modality name: Name = descriptor.name
) : this( ) : this(
startOffset, endOffset, origin, symbol, startOffset, endOffset, origin, symbol,
symbol.descriptor.name, name = name,
visibility, visibility = descriptor.visibility,
modality, modality = descriptor.modality,
returnType, returnType = returnType,
isInline = symbol.descriptor.isInline, isInline = descriptor.isInline,
isExternal = symbol.descriptor.isExternal, isExternal = descriptor.isExternal,
isTailrec = symbol.descriptor.isTailrec, isTailrec = descriptor.isTailrec,
isSuspend = symbol.descriptor.isSuspend, isSuspend = descriptor.isSuspend,
isExpect = symbol.descriptor.isExpect, isOperator = descriptor.isOperator,
isFakeOverride = origin == IrDeclarationOrigin.FAKE_OVERRIDE, isExpect = descriptor.isExpect
isOperator = symbol.descriptor.isOperator )
// 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 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 { init {
symbol.bind(this) symbol.bind(this)
} }
@@ -167,7 +167,7 @@ class IrFunctionFactory(private val irBuiltIns: IrBuiltIns, private val symbolTa
getContributedFunctions(Name.identifier(name), NoLookupLocation.FROM_BACKEND).first() 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 { override fun FunctionDescriptor.valueParameterDescriptor(index: Int): ValueParameterDescriptor {
@@ -292,7 +292,8 @@ class IrFunctionFactory(private val irBuiltIns: IrBuiltIns, private val symbolTa
buildSimpleType() 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, returnType,
isInline = false, isInline = false,
isExternal = false, isExternal = false,
@@ -369,7 +370,7 @@ class IrFunctionFactory(private val irBuiltIns: IrBuiltIns, private val symbolTa
fun createFakeOverrideFunction(descriptor: FunctionDescriptor, property: IrPropertySymbol?): IrSimpleFunction { fun createFakeOverrideFunction(descriptor: FunctionDescriptor, property: IrPropertySymbol?): IrSimpleFunction {
val returnType = descriptor.returnType?.let { toIrType(it) } ?: error("No return type for $descriptor") 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 { descriptor.run {
IrFunctionImpl( IrFunctionImpl(
offset, offset, memberOrigin, it, name, visibility, modality, returnType, offset, offset, memberOrigin, it, name, visibility, modality, returnType,
@@ -210,11 +210,7 @@ class DeclarationStubGenerator(
if (descriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) if (descriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE)
IrDeclarationOrigin.FAKE_OVERRIDE IrDeclarationOrigin.FAKE_OVERRIDE
else computeOrigin(descriptor) else computeOrigin(descriptor)
return symbolTable.declareSimpleFunction( return symbolTable.declareSimpleFunction(descriptor.original) {
UNDEFINED_OFFSET, UNDEFINED_OFFSET,
origin,
descriptor.original
) {
IrLazyFunction( IrLazyFunction(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin,
it, descriptor, it, descriptor,
@@ -692,19 +692,8 @@ open class SymbolTable(
} }
fun declareSimpleFunction( fun declareSimpleFunction(
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
descriptor: FunctionDescriptor, descriptor: FunctionDescriptor,
functionFactory: (IrSimpleFunctionSymbol) -> IrSimpleFunction = { functionFactory: (IrSimpleFunctionSymbol) -> IrSimpleFunction
IrFunctionImpl(
startOffset, endOffset, origin, it,
nameProvider.nameForDeclaration(descriptor),
returnType = IrUninitializedType
).apply {
metadata = MetadataSource.Function(it.descriptor)
}
}
): IrSimpleFunction { ): IrSimpleFunction {
return simpleFunctionSymbolTable.declare( return simpleFunctionSymbolTable.declare(
descriptor, descriptor,
@@ -10,7 +10,10 @@ import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrField import org.jetbrains.kotlin.ir.declarations.IrField
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction 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.IrType
import org.jetbrains.kotlin.ir.types.impl.IrUninitializedType
fun SymbolTable.declareSimpleFunctionWithOverrides( fun SymbolTable.declareSimpleFunctionWithOverrides(
startOffset: Int, startOffset: Int,
@@ -18,7 +21,16 @@ fun SymbolTable.declareSimpleFunctionWithOverrides(
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
descriptor: FunctionDescriptor 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) generateOverriddenFunctionSymbols(declaration, this)
} }
@@ -252,7 +252,8 @@ interface IrBuilderExtension {
fieldSymbol.owner.endOffset, fieldSymbol.owner.endOffset,
SERIALIZABLE_PLUGIN_ORIGIN, SERIALIZABLE_PLUGIN_ORIGIN,
symbol, symbol,
descriptor.returnType!!.toIrType() descriptor.returnType!!.toIrType(),
descriptor
).also { f -> ).also { f ->
generateOverriddenFunctionSymbols(f, compilerContext.symbolTable) generateOverriddenFunctionSymbols(f, compilerContext.symbolTable)
f.createParameterDeclarations(receiver = null) f.createParameterDeclarations(receiver = null)