[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 val isPrimary = constructor.isPrimary
classifierStorage.preCacheTypeParameters(constructor) classifierStorage.preCacheTypeParameters(constructor)
val created = constructor.convertWithOffsets { startOffset, endOffset -> val created = constructor.convertWithOffsets { startOffset, endOffset ->
symbolTable.declareConstructor(startOffset, endOffset, origin, descriptor) { symbol -> symbolTable.declareConstructor(descriptor) { symbol ->
IrConstructorImpl( IrConstructorImpl(
startOffset, endOffset, origin, symbol, startOffset, endOffset, origin, symbol,
Name.special("<init>"), constructor.visibility, 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.IrElement
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.declarations.* 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.IrBlockBody
import org.jetbrains.kotlin.ir.expressions.IrBody import org.jetbrains.kotlin.ir.expressions.IrBody
import org.jetbrains.kotlin.ir.expressions.IrExpression import org.jetbrains.kotlin.ir.expressions.IrExpression
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
import org.jetbrains.kotlin.ir.expressions.impl.* 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.ir.util.declareSimpleFunctionWithOverrides
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.pureEndOffset import org.jetbrains.kotlin.psi.psiUtil.pureEndOffset
@@ -244,17 +246,27 @@ class FunctionGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
ktParametersElement: KtPureElement, ktParametersElement: KtPureElement,
constructorDescriptor: ClassConstructorDescriptor, constructorDescriptor: ClassConstructorDescriptor,
generateBody: BodyGenerator.() -> IrBody? generateBody: BodyGenerator.() -> IrBody?
): IrConstructor = ): IrConstructor {
context.symbolTable.declareConstructor( val startOffset = ktConstructorElement.getStartOffsetOfConstructorDeclarationKeywordOrNull() ?: ktConstructorElement.pureStartOffset
ktConstructorElement.getStartOffsetOfConstructorDeclarationKeywordOrNull() ?: ktConstructorElement.pureStartOffset, val endOffset = ktConstructorElement.pureEndOffset
ktConstructorElement.pureEndOffset, val origin = IrDeclarationOrigin.DEFINED
IrDeclarationOrigin.DEFINED, return context.symbolTable.declareConstructor(
constructorDescriptor 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) generateValueParameterDeclarations(irConstructor, ktParametersElement, null)
irConstructor.body = createBodyGenerator(irConstructor.symbol).generateBody() irConstructor.body = createBodyGenerator(irConstructor.symbol).generateBody()
irConstructor.returnType = constructorDescriptor.returnType.toIrType() irConstructor.returnType = constructorDescriptor.returnType.toIrType()
} }
}
fun generateSyntheticFunctionParameterDeclarations(irFunction: IrFunction) { fun generateSyntheticFunctionParameterDeclarations(irFunction: IrFunction) {
val descriptor = irFunction.descriptor val descriptor = irFunction.descriptor
@@ -150,7 +150,7 @@ class StandaloneDeclarationGenerator(private val context: GeneratorContext) {
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.(ValueParameterDescriptor) -> IrExpressionBody? = { null }
): IrConstructor { ): IrConstructor {
val irConstructor = IrConstructorImpl(startOffset, endOffset, origin, symbol, IrUninitializedType) val irConstructor = IrConstructorImpl(startOffset, endOffset, origin, symbol, IrUninitializedType, descriptor)
irConstructor.metadata = MetadataSource.Function(descriptor) irConstructor.metadata = MetadataSource.Function(descriptor)
symbolTable.withScope(descriptor) { symbolTable.withScope(descriptor) {
@@ -20,7 +20,6 @@ import org.jetbrains.kotlin.descriptors.ClassConstructorDescriptor
import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.carriers.ConstructorCarrier 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.symbols.IrConstructorSymbol
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
@@ -32,13 +31,13 @@ class IrConstructorImpl(
endOffset: Int, endOffset: Int,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
override val symbol: IrConstructorSymbol, override val symbol: IrConstructorSymbol,
name: Name = symbol.descriptor.name, name: Name,
visibility: Visibility = symbol.descriptor.visibility, visibility: Visibility,
returnType: IrType, returnType: IrType,
isInline: Boolean = symbol.descriptor.isInline, isInline: Boolean,
isExternal: Boolean = symbol.descriptor.isEffectivelyExternal(), isExternal: Boolean,
override val isPrimary: Boolean = symbol.descriptor.isPrimary, override val isPrimary: Boolean,
isExpect: Boolean = symbol.descriptor.isExpect isExpect: Boolean
) : ) :
IrFunctionBase<ConstructorCarrier>( IrFunctionBase<ConstructorCarrier>(
startOffset, endOffset, origin, name, startOffset, endOffset, origin, name,
@@ -55,19 +54,17 @@ class IrConstructorImpl(
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
symbol: IrConstructorSymbol, symbol: IrConstructorSymbol,
returnType: IrType, returnType: IrType,
body: IrBody? = null descriptor: ClassConstructorDescriptor,
name: Name = descriptor.name
) : this( ) : this(
startOffset, endOffset, origin, symbol, startOffset, endOffset, origin, symbol,
symbol.descriptor.name, name = name, visibility = descriptor.visibility,
symbol.descriptor.visibility, returnType = returnType,
returnType, isInline = descriptor.isInline,
isInline = symbol.descriptor.isInline, isExternal = descriptor.isEffectivelyExternal(),
isExternal = symbol.descriptor.isEffectivelyExternal(), isPrimary = descriptor.isPrimary,
isPrimary = symbol.descriptor.isPrimary, isExpect = descriptor.isExpect
isExpect = symbol.descriptor.isExpect )
) {
this.body = body
}
init { init {
symbol.bind(this) symbol.bind(this)
@@ -230,7 +230,7 @@ class DeclarationStubGenerator(
val origin = computeOrigin(descriptor) val origin = computeOrigin(descriptor)
return symbolTable.declareConstructor( return symbolTable.declareConstructor(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, descriptor.original descriptor.original
) { ) {
IrLazyConstructor( IrLazyConstructor(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, 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.*
import org.jetbrains.kotlin.ir.symbols.impl.* import org.jetbrains.kotlin.ir.symbols.impl.*
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.impl.IrUninitializedType
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DescriptorWithContainerSource import org.jetbrains.kotlin.serialization.deserialization.descriptors.DescriptorWithContainerSource
interface IrProvider { interface IrProvider {
@@ -436,19 +435,8 @@ open class SymbolTable(
} }
fun declareConstructor( fun declareConstructor(
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
descriptor: ClassConstructorDescriptor, descriptor: ClassConstructorDescriptor,
constructorFactory: (IrConstructorSymbol) -> IrConstructor = { constructorFactory: (IrConstructorSymbol) -> IrConstructor
IrConstructorImpl(
startOffset, endOffset, origin, it,
nameProvider.nameForDeclaration(descriptor),
returnType = IrUninitializedType
).apply {
metadata = MetadataSource.Function(it.descriptor)
}
}
): IrConstructor = ): IrConstructor =
constructorSymbolTable.declare( constructorSymbolTable.declare(
descriptor, descriptor,