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

This commit is contained in:
Mikhail Glukhikh
2020-05-18 16:53:32 +03:00
parent 262548fd5b
commit 7840adde12
6 changed files with 37 additions and 40 deletions
@@ -519,7 +519,7 @@ class Fir2IrDeclarationStorage(
val isPrimary = constructor.isPrimary
classifierStorage.preCacheTypeParameters(constructor)
val created = constructor.convertWithOffsets { startOffset, endOffset ->
symbolTable.declareConstructor(startOffset, endOffset, origin, descriptor) { symbol ->
symbolTable.declareConstructor(descriptor) { symbol ->
IrConstructorImpl(
startOffset, endOffset, origin, symbol,
Name.special("<init>"), constructor.visibility,
@@ -9,11 +9,13 @@ import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrConstructorImpl
import org.jetbrains.kotlin.ir.expressions.IrBlockBody
import org.jetbrains.kotlin.ir.expressions.IrBody
import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
import org.jetbrains.kotlin.ir.expressions.impl.*
import org.jetbrains.kotlin.ir.types.impl.IrUninitializedType
import org.jetbrains.kotlin.ir.util.declareSimpleFunctionWithOverrides
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.pureEndOffset
@@ -244,17 +246,27 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
ktParametersElement: KtPureElement,
constructorDescriptor: ClassConstructorDescriptor,
generateBody: BodyGenerator.() -> IrBody?
): IrConstructor =
context.symbolTable.declareConstructor(
ktConstructorElement.getStartOffsetOfConstructorDeclarationKeywordOrNull() ?: ktConstructorElement.pureStartOffset,
ktConstructorElement.pureEndOffset,
IrDeclarationOrigin.DEFINED,
): IrConstructor {
val startOffset = ktConstructorElement.getStartOffsetOfConstructorDeclarationKeywordOrNull() ?: ktConstructorElement.pureStartOffset
val endOffset = ktConstructorElement.pureEndOffset
val origin = IrDeclarationOrigin.DEFINED
return context.symbolTable.declareConstructor(
constructorDescriptor
).buildWithScope { irConstructor ->
) {
IrConstructorImpl(
startOffset, endOffset, origin, it,
returnType = IrUninitializedType,
descriptor = constructorDescriptor,
name = context.symbolTable.nameProvider.nameForDeclaration(constructorDescriptor),
).apply {
metadata = MetadataSource.Function(it.descriptor)
}
}.buildWithScope { irConstructor ->
generateValueParameterDeclarations(irConstructor, ktParametersElement, null)
irConstructor.body = createBodyGenerator(irConstructor.symbol).generateBody()
irConstructor.returnType = constructorDescriptor.returnType.toIrType()
}
}
fun generateSyntheticFunctionParameterDeclarations(irFunction: IrFunction) {
val descriptor = irFunction.descriptor
@@ -150,7 +150,7 @@ class StandaloneDeclarationGenerator(private val context: GeneratorContext) {
startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, descriptor: ClassConstructorDescriptor, symbol: IrConstructorSymbol,
defaultArgumentFactory: IrFunction.(ValueParameterDescriptor) -> IrExpressionBody? = { null }
): IrConstructor {
val irConstructor = IrConstructorImpl(startOffset, endOffset, origin, symbol, IrUninitializedType)
val irConstructor = IrConstructorImpl(startOffset, endOffset, origin, symbol, IrUninitializedType, descriptor)
irConstructor.metadata = MetadataSource.Function(descriptor)
symbolTable.withScope(descriptor) {
@@ -20,7 +20,6 @@ import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.carriers.ConstructorCarrier
import org.jetbrains.kotlin.ir.expressions.IrBody
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
@@ -32,13 +31,13 @@ class IrConstructorImpl(
endOffset: Int,
origin: IrDeclarationOrigin,
override val symbol: IrConstructorSymbol,
name: Name = symbol.descriptor.name,
visibility: Visibility = symbol.descriptor.visibility,
name: Name,
visibility: Visibility,
returnType: IrType,
isInline: Boolean = symbol.descriptor.isInline,
isExternal: Boolean = symbol.descriptor.isEffectivelyExternal(),
override val isPrimary: Boolean = symbol.descriptor.isPrimary,
isExpect: Boolean = symbol.descriptor.isExpect
isInline: Boolean,
isExternal: Boolean,
override val isPrimary: Boolean,
isExpect: Boolean
) :
IrFunctionBase<ConstructorCarrier>(
startOffset, endOffset, origin, name,
@@ -55,19 +54,17 @@ class IrConstructorImpl(
origin: IrDeclarationOrigin,
symbol: IrConstructorSymbol,
returnType: IrType,
body: IrBody? = null
descriptor: ClassConstructorDescriptor,
name: Name = descriptor.name
) : this(
startOffset, endOffset, origin, symbol,
symbol.descriptor.name,
symbol.descriptor.visibility,
returnType,
isInline = symbol.descriptor.isInline,
isExternal = symbol.descriptor.isEffectivelyExternal(),
isPrimary = symbol.descriptor.isPrimary,
isExpect = symbol.descriptor.isExpect
) {
this.body = body
}
name = name, visibility = descriptor.visibility,
returnType = returnType,
isInline = descriptor.isInline,
isExternal = descriptor.isEffectivelyExternal(),
isPrimary = descriptor.isPrimary,
isExpect = descriptor.isExpect
)
init {
symbol.bind(this)
@@ -230,7 +230,7 @@ class DeclarationStubGenerator(
val origin = computeOrigin(descriptor)
return symbolTable.declareConstructor(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, descriptor.original
descriptor.original
) {
IrLazyConstructor(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin,
@@ -30,7 +30,6 @@ import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.symbols.impl.*
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.impl.IrUninitializedType
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DescriptorWithContainerSource
interface IrProvider {
@@ -436,19 +435,8 @@ open class SymbolTable(
}
fun declareConstructor(
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
descriptor: ClassConstructorDescriptor,
constructorFactory: (IrConstructorSymbol) -> IrConstructor = {
IrConstructorImpl(
startOffset, endOffset, origin, it,
nameProvider.nameForDeclaration(descriptor),
returnType = IrUninitializedType
).apply {
metadata = MetadataSource.Function(it.descriptor)
}
}
constructorFactory: (IrConstructorSymbol) -> IrConstructor
): IrConstructor =
constructorSymbolTable.declare(
descriptor,