[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.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,
@@ -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,
@@ -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(
@@ -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(
@@ -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) {
@@ -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<FunctionCarrier>(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)
}
@@ -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,
@@ -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,
@@ -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,
@@ -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)
}
@@ -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)