[IR] Call IR declaration constructors with named parameters

When those classes become auto-generated, the order of constructor
parameters will differ.
This commit ensures they will still be resolved correctly.

^KT-65773 In Progress
This commit is contained in:
Wojciech Litewka
2024-02-14 17:52:39 +01:00
committed by Space Team
parent a005f2e75d
commit 92ff782815
4 changed files with 173 additions and 31 deletions
@@ -296,9 +296,16 @@ class Fir2IrDeclarationStorage(
name: Name,
source: SourceElement,
) : IrClassImpl(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, IrClassSymbolImpl(), name,
ClassKind.CLASS, DescriptorVisibilities.PUBLIC, Modality.FINAL,
source, IrFactoryImpl,
startOffset = UNDEFINED_OFFSET,
endOffset = UNDEFINED_OFFSET,
origin = origin,
symbol = IrClassSymbolImpl(),
name = name,
kind = ClassKind.CLASS,
visibility = DescriptorVisibilities.PUBLIC,
modality = Modality.FINAL,
source = source,
factory = IrFactoryImpl,
)
private class NonCachedSourceFacadeContainerSource(
@@ -23,9 +23,16 @@ class JvmFileFacadeClass(
source: SourceElement,
private val deserializeIr: (IrClass) -> Boolean,
) : IrClassImpl(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin,
IrClassSymbolImpl(), name, ClassKind.CLASS, DescriptorVisibilities.PUBLIC, Modality.FINAL,
source, IrFactoryImpl
startOffset = UNDEFINED_OFFSET,
endOffset = UNDEFINED_OFFSET,
origin = origin,
symbol = IrClassSymbolImpl(),
name = name,
kind = ClassKind.CLASS,
visibility = DescriptorVisibilities.PUBLIC,
modality = Modality.FINAL,
source = source,
factory = IrFactoryImpl
), DeserializableClass {
private var irLoaded: Boolean? = null
@@ -34,7 +34,14 @@ abstract class AbstractIrFactoryImpl : IrFactory {
symbol: IrAnonymousInitializerSymbol,
isStatic: Boolean,
): IrAnonymousInitializer =
IrAnonymousInitializerImpl(startOffset, endOffset, origin, symbol, isStatic, factory = this)
IrAnonymousInitializerImpl(
startOffset = startOffset,
endOffset = endOffset,
origin = origin,
symbol = symbol,
isStatic = isStatic,
factory = this
)
override fun createClass(
startOffset: Int,
@@ -56,7 +63,15 @@ abstract class AbstractIrFactoryImpl : IrFactory {
source: SourceElement,
): IrClass =
IrClassImpl(
startOffset, endOffset, origin, symbol, name, kind, visibility, modality, source,
startOffset = startOffset,
endOffset = endOffset,
origin = origin,
symbol = symbol,
name = name,
kind = kind,
visibility = visibility,
modality = modality,
source = source,
factory = this
).apply {
this.isCompanion = isCompanion
@@ -84,8 +99,18 @@ abstract class AbstractIrFactoryImpl : IrFactory {
containerSource: DeserializedContainerSource?,
): IrConstructor =
IrConstructorImpl(
startOffset, endOffset, origin, symbol, name, visibility, isInline, isExternal, isPrimary, isExpect,
containerSource, factory = this
startOffset = startOffset,
endOffset = endOffset,
origin = origin,
symbol = symbol,
name = name,
visibility = visibility,
isInline = isInline,
isExternal = isExternal,
isPrimary = isPrimary,
isExpect = isExpect,
containerSource = containerSource,
factory = this
).apply {
if (returnType != IrUninitializedType) {
this.returnType = returnType
@@ -99,14 +124,26 @@ abstract class AbstractIrFactoryImpl : IrFactory {
name: Name,
symbol: IrEnumEntrySymbol,
): IrEnumEntry =
IrEnumEntryImpl(startOffset, endOffset, origin, symbol, name, factory = this)
IrEnumEntryImpl(
startOffset = startOffset,
endOffset = endOffset,
origin = origin,
symbol = symbol,
name = name,
factory = this
)
override fun createErrorDeclaration(
startOffset: Int,
endOffset: Int,
descriptor: DeclarationDescriptor?,
): IrErrorDeclaration =
IrErrorDeclarationImpl(startOffset, endOffset, descriptor, factory = this)
IrErrorDeclarationImpl(
startOffset = startOffset,
endOffset = endOffset,
_descriptor = descriptor,
factory = this
)
override fun createField(
startOffset: Int,
@@ -120,7 +157,19 @@ abstract class AbstractIrFactoryImpl : IrFactory {
isStatic: Boolean,
isExternal: Boolean,
): IrField =
IrFieldImpl(startOffset, endOffset, origin, symbol, name, type, visibility, isFinal, isExternal, isStatic, factory = this)
IrFieldImpl(
startOffset = startOffset,
endOffset = endOffset,
origin = origin,
symbol = symbol,
name = name,
type = type,
visibility = visibility,
isFinal = isFinal,
isExternal = isExternal,
isStatic = isStatic,
factory = this
)
override fun createSimpleFunction(
startOffset: Int,
@@ -142,9 +191,23 @@ abstract class AbstractIrFactoryImpl : IrFactory {
isFakeOverride: Boolean,
): IrSimpleFunction =
IrFunctionImpl(
startOffset, endOffset, origin, symbol, name, visibility, modality,
isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect, isFakeOverride,
containerSource, factory = this
startOffset = startOffset,
endOffset = endOffset,
origin = origin,
symbol = symbol,
name = name,
visibility = visibility,
modality = modality,
isInline = isInline,
isExternal = isExternal,
isTailrec = isTailrec,
isSuspend = isSuspend,
isOperator = isOperator,
isInfix = isInfix,
isExpect = isExpect,
isFakeOverride = isFakeOverride,
containerSource = containerSource,
factory = this
).apply {
if (returnType != IrUninitializedType) {
this.returnType = returnType
@@ -199,7 +262,16 @@ abstract class AbstractIrFactoryImpl : IrFactory {
type: IrType,
isVar: Boolean,
): IrLocalDelegatedProperty =
IrLocalDelegatedPropertyImpl(startOffset, endOffset, origin, symbol, name, type, isVar, factory = this)
IrLocalDelegatedPropertyImpl(
startOffset = startOffset,
endOffset = endOffset,
origin = origin,
symbol = symbol,
name = name,
type = type,
isVar = isVar,
factory = this
)
override fun createProperty(
startOffset: Int,
@@ -219,9 +291,22 @@ abstract class AbstractIrFactoryImpl : IrFactory {
isFakeOverride: Boolean,
): IrProperty =
IrPropertyImpl(
startOffset, endOffset, origin, symbol, name, visibility, modality,
isVar, isConst, isLateinit, isDelegated, isExternal, isExpect, isFakeOverride,
containerSource, factory = this
startOffset = startOffset,
endOffset = endOffset,
origin = origin,
symbol = symbol,
name = name,
visibility = visibility,
modality = modality,
isVar = isVar,
isConst = isConst,
isLateinit = isLateinit,
isDelegated = isDelegated,
isExternal = isExternal,
isExpect = isExpect,
isFakeOverride = isFakeOverride,
containerSource = containerSource,
factory = this
)
override fun createPropertyWithLateBinding(
@@ -266,7 +351,17 @@ abstract class AbstractIrFactoryImpl : IrFactory {
isActual: Boolean,
expandedType: IrType,
): IrTypeAlias =
IrTypeAliasImpl(startOffset, endOffset, symbol, name, visibility, expandedType, isActual, origin, factory = this)
IrTypeAliasImpl(
startOffset = startOffset,
endOffset = endOffset,
symbol = symbol,
name = name,
visibility = visibility,
expandedType = expandedType,
isActual = isActual,
origin = origin,
factory = this
)
override fun createTypeParameter(
startOffset: Int,
@@ -278,7 +373,17 @@ abstract class AbstractIrFactoryImpl : IrFactory {
index: Int,
isReified: Boolean,
): IrTypeParameter =
IrTypeParameterImpl(startOffset, endOffset, origin, symbol, name, index, isReified, variance, factory = this)
IrTypeParameterImpl(
startOffset = startOffset,
endOffset = endOffset,
origin = origin,
symbol = symbol,
name = name,
index = index,
isReified = isReified,
variance = variance,
factory = this
)
override fun createValueParameter(
startOffset: Int,
@@ -295,8 +400,19 @@ abstract class AbstractIrFactoryImpl : IrFactory {
isHidden: Boolean,
): IrValueParameter =
IrValueParameterImpl(
startOffset, endOffset, origin, symbol, name, index, type, varargElementType,
isCrossinline, isNoinline, isHidden, isAssignable, factory = this
startOffset = startOffset,
endOffset = endOffset,
origin = origin,
symbol = symbol,
name = name,
index = index,
type = type,
varargElementType = varargElementType,
isCrossinline = isCrossinline,
isNoinline = isNoinline,
isHidden = isHidden,
isAssignable = isAssignable,
factory = this
)
override fun createExpressionBody(
@@ -304,11 +420,18 @@ abstract class AbstractIrFactoryImpl : IrFactory {
endOffset: Int,
expression: IrExpression,
): IrExpressionBody =
IrExpressionBodyImpl(startOffset, endOffset, expression)
IrExpressionBodyImpl(
startOffset = startOffset,
endOffset = endOffset,
expression = expression
)
override fun createBlockBody(
startOffset: Int,
endOffset: Int,
): IrBlockBody =
IrBlockBodyImpl(startOffset, endOffset)
IrBlockBodyImpl(
startOffset = startOffset,
endOffset = endOffset
)
}
@@ -21,11 +21,16 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.utils.addToStdlib.shouldNotBeCalled
@OptIn(IrImplementationDetail::class)
val IrErrorClassImpl = IrClassImpl(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, IrDeclarationOrigin.ERROR_CLASS, IrClassSymbolImpl(),
Name.special("<error>"), ClassKind.CLASS, DescriptorVisibilities.DEFAULT_VISIBILITY, Modality.FINAL,
SourceElement.NO_SOURCE, IrFactoryImpl
val IrErrorClassImpl: IrClass = IrFactoryImpl.createClass(
startOffset = UNDEFINED_OFFSET,
endOffset = UNDEFINED_OFFSET,
origin = IrDeclarationOrigin.ERROR_CLASS,
symbol = IrClassSymbolImpl(),
name = Name.special("<error>"),
kind = ClassKind.CLASS,
visibility = DescriptorVisibilities.DEFAULT_VISIBILITY,
modality = Modality.FINAL,
source = SourceElement.NO_SOURCE,
).apply {
parent = ErrorFile
}