diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt index 5d47ccc928d..67959f980a5 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.resolve.firProvider import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.symbols.Fir2IrClassSymbol import org.jetbrains.kotlin.fir.symbols.Fir2IrEnumEntrySymbol +import org.jetbrains.kotlin.fir.symbols.Fir2IrTypeAliasSymbol import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol @@ -19,6 +20,7 @@ import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl import org.jetbrains.kotlin.ir.declarations.impl.IrEnumEntryImpl +import org.jetbrains.kotlin.ir.declarations.impl.IrTypeAliasImpl import org.jetbrains.kotlin.ir.declarations.impl.IrTypeParameterImpl import org.jetbrains.kotlin.ir.descriptors.* import org.jetbrains.kotlin.ir.expressions.impl.IrEnumConstructorCallImpl @@ -167,6 +169,28 @@ class Fir2IrClassifierStorage( return irClass } + fun registerTypeAlias( + typeAlias: FirTypeAlias, + parent: IrFile + ): IrTypeAlias { + val signature = signatureComposer.composeSignature(typeAlias)!! + preCacheTypeParameters(typeAlias) + return typeAlias.convertWithOffsets { startOffset, endOffset -> + symbolTable.declareTypeAlias(signature, { Fir2IrTypeAliasSymbol(signature) }) { symbol -> + IrTypeAliasImpl( + startOffset, endOffset, symbol, + typeAlias.name, typeAlias.visibility, + typeAlias.expandedTypeRef.toIrType(), + typeAlias.isActual, IrDeclarationOrigin.DEFINED + ).apply { + this.parent = parent + setTypeParameters(typeAlias) + parent.declarations += this + } + } + } + } + private fun declareIrClass(signature: IdSignature?, factory: (IrClassSymbol) -> IrClass): IrClass { if (signature == null) { val descriptor = WrappedClassDescriptor() diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt index 8f5a4d8479c..fc93dbe0848 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt @@ -61,8 +61,9 @@ class Fir2IrConverter( fun processClassHeaders(file: FirFile) { file.declarations.forEach { - if (it is FirRegularClass) { - processClassAndNestedClassHeaders(it) + when (it) { + is FirRegularClass -> processClassAndNestedClassHeaders(it) + is FirTypeAlias -> classifierStorage.registerTypeAlias(it, declarationStorage.getIrFile(file)) } } } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt index 9c7e3570446..d34ff8cc0d0 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/signaturer/FirBasedSignatureComposer.kt @@ -35,6 +35,10 @@ class FirBasedSignatureComposer(private val mangler: FirMangler) : Fir2IrSignatu //platformSpecificClass(descriptor) } + override fun visitTypeAlias(typeAlias: FirTypeAlias) { + setExpected(typeAlias.isExpect) + } + override fun visitConstructor(constructor: FirConstructor) { hashId = mangler.run { constructor.signatureMangle } setExpected(constructor.isExpect) @@ -68,6 +72,10 @@ class FirBasedSignatureComposer(private val mangler: FirMangler) : Fir2IrSignatu val classId = declaration.classId IdSignature.PublicSignature(classId.packageFqName, classId.relativeClassName, builder.hashId, builder.mask) } + declaration is FirTypeAlias -> { + val classId = declaration.symbol.classId + IdSignature.PublicSignature(classId.packageFqName, classId.relativeClassName, builder.hashId, builder.mask) + } declaration is FirCallableMemberDeclaration<*> -> { val callableId = declaration.symbol.callableId IdSignature.PublicSignature(callableId.packageName, callableId.relativeCallableName, builder.hashId, builder.mask) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/symbols/Fir2IrBindableSymbol.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/symbols/Fir2IrBindableSymbol.kt index e5dfd2846c3..30bab56a5c5 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/symbols/Fir2IrBindableSymbol.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/symbols/Fir2IrBindableSymbol.kt @@ -60,6 +60,7 @@ abstract class Fir2IrBindableSymbol WrappedFieldDescriptor().apply { bind(owner) } + is IrTypeAlias -> WrappedTypeAliasDescriptor().apply { bind(owner) } else -> throw IllegalStateException("Unsupported owner in Fir2IrBindableSymbol: $owner") } as D } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/symbols/Fir2IrSymbols.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/symbols/Fir2IrSymbols.kt index 773d6ae831f..4215000a081 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/symbols/Fir2IrSymbols.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/symbols/Fir2IrSymbols.kt @@ -15,6 +15,10 @@ class Fir2IrClassSymbol(signature: IdSignature) : Fir2IrBindableSymbol(signature), IrClassSymbol +class Fir2IrTypeAliasSymbol(signature: IdSignature) : + Fir2IrBindableSymbol(signature), + IrTypeAliasSymbol + class Fir2IrEnumEntrySymbol(signature: IdSignature) : Fir2IrBindableSymbol(signature), IrEnumEntrySymbol diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt index 20740e9986d..bd1c8f735ab 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt @@ -722,6 +722,14 @@ open class SymbolTable( fun declareTypeAlias(descriptor: TypeAliasDescriptor, factory: (IrTypeAliasSymbol) -> IrTypeAlias): IrTypeAlias = typeAliasSymbolTable.declare(descriptor, { createTypeAliasSymbol(descriptor) }, factory) + fun declareTypeAlias( + sig: IdSignature, + symbolFactory: () -> IrTypeAliasSymbol, + factory: (IrTypeAliasSymbol) -> IrTypeAlias + ): IrTypeAlias { + return typeAliasSymbolTable.declare(sig, symbolFactory, factory) + } + fun declareTypeAliasIfNotExists(descriptor: TypeAliasDescriptor, factory: (IrTypeAliasSymbol) -> IrTypeAlias): IrTypeAlias = typeAliasSymbolTable.declareIfNotExists(descriptor, { createTypeAliasSymbol(descriptor) }, factory) diff --git a/compiler/testData/ir/irText/classes/delegatingConstructorCallToTypeAliasConstructor.fir.txt b/compiler/testData/ir/irText/classes/delegatingConstructorCallToTypeAliasConstructor.fir.txt index 12845632d59..a84fdb5cc71 100644 --- a/compiler/testData/ir/irText/classes/delegatingConstructorCallToTypeAliasConstructor.fir.txt +++ b/compiler/testData/ir/irText/classes/delegatingConstructorCallToTypeAliasConstructor.fir.txt @@ -1,4 +1,7 @@ FILE fqName: fileName:/delegatingConstructorCallToTypeAliasConstructor.kt + TYPEALIAS name:CT visibility:public expandedType:.Cell.CT> + TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?] + TYPEALIAS name:CStr visibility:public expandedType:.Cell CLASS CLASS name:Cell modality:OPEN visibility:public superTypes:[kotlin.Any] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.Cell.Cell> TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?] diff --git a/compiler/testData/ir/irText/declarations/annotations/typeAliasesWithAnnotations.fir.txt b/compiler/testData/ir/irText/declarations/annotations/typeAliasesWithAnnotations.fir.txt index 6abb70b0474..3739f1650de 100644 --- a/compiler/testData/ir/irText/declarations/annotations/typeAliasesWithAnnotations.fir.txt +++ b/compiler/testData/ir/irText/declarations/annotations/typeAliasesWithAnnotations.fir.txt @@ -1,4 +1,5 @@ FILE fqName: fileName:/typeAliasesWithAnnotations.kt + TYPEALIAS name:TestTypeAlias visibility:public expandedType:kotlin.String CLASS ANNOTATION_CLASS name:TestAnn modality:FINAL visibility:public superTypes:[kotlin.Annotation] annotations: Target(allowedTargets = GET_ENUM 'ENUM_ENTRY IR_EXTERNAL_DECLARATION_STUB name:TYPEALIAS' type=kotlin.annotation.AnnotationTarget) diff --git a/compiler/testData/ir/irText/declarations/fileWithTypeAliasesOnly.fir.txt b/compiler/testData/ir/irText/declarations/fileWithTypeAliasesOnly.fir.txt deleted file mode 100644 index 8b10fc32485..00000000000 --- a/compiler/testData/ir/irText/declarations/fileWithTypeAliasesOnly.fir.txt +++ /dev/null @@ -1 +0,0 @@ -FILE fqName: fileName:/fileWithTypeAliasesOnly.kt diff --git a/compiler/testData/ir/irText/declarations/fileWithTypeAliasesOnly.kt b/compiler/testData/ir/irText/declarations/fileWithTypeAliasesOnly.kt index cb118c6fc94..5cd4dcb1c42 100644 --- a/compiler/testData/ir/irText/declarations/fileWithTypeAliasesOnly.kt +++ b/compiler/testData/ir/irText/declarations/fileWithTypeAliasesOnly.kt @@ -1 +1,2 @@ +// FIR_IDENTICAL typealias Bar = (T) -> String \ No newline at end of file diff --git a/compiler/testData/ir/irText/declarations/typeAlias.fir.txt b/compiler/testData/ir/irText/declarations/typeAlias.fir.txt index 181f37c9777..8113a116a1d 100644 --- a/compiler/testData/ir/irText/declarations/typeAlias.fir.txt +++ b/compiler/testData/ir/irText/declarations/typeAlias.fir.txt @@ -1,4 +1,5 @@ FILE fqName: fileName:/typeAlias.kt + TYPEALIAS name:Test1 visibility:public expandedType:kotlin.String FUN name:foo visibility:public modality:FINAL <> () returnType:kotlin.Unit BLOCK_BODY BLOCK type=kotlin.Unit origin=null diff --git a/compiler/testData/ir/irText/expressions/kt16905.fir.txt b/compiler/testData/ir/irText/expressions/kt16905.fir.txt index 38b871d7e4c..80f57083ee6 100644 --- a/compiler/testData/ir/irText/expressions/kt16905.fir.txt +++ b/compiler/testData/ir/irText/expressions/kt16905.fir.txt @@ -1,4 +1,5 @@ FILE fqName: fileName:/kt16905.kt + TYPEALIAS name:OI visibility:public expandedType:.Outer.Inner CLASS CLASS name:Outer modality:FINAL visibility:public superTypes:[kotlin.Any] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.Outer CONSTRUCTOR visibility:public <> () returnType:.Outer [primary] diff --git a/compiler/testData/ir/irText/expressions/specializedTypeAliasConstructorCall.fir.txt b/compiler/testData/ir/irText/expressions/specializedTypeAliasConstructorCall.fir.txt index 1f54e62f617..adff1df82bd 100644 --- a/compiler/testData/ir/irText/expressions/specializedTypeAliasConstructorCall.fir.txt +++ b/compiler/testData/ir/irText/expressions/specializedTypeAliasConstructorCall.fir.txt @@ -1,4 +1,5 @@ FILE fqName: fileName:/specializedTypeAliasConstructorCall.kt + TYPEALIAS name:IntAlias visibility:public expandedType:.Cell CLASS CLASS name:Cell modality:FINAL visibility:public superTypes:[kotlin.Any] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.Cell.Cell> TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?] diff --git a/compiler/testData/ir/irText/expressions/typeAliasConstructorReference.fir.txt b/compiler/testData/ir/irText/expressions/typeAliasConstructorReference.fir.txt index 107fa580e3f..b1ea75aea86 100644 --- a/compiler/testData/ir/irText/expressions/typeAliasConstructorReference.fir.txt +++ b/compiler/testData/ir/irText/expressions/typeAliasConstructorReference.fir.txt @@ -1,4 +1,6 @@ FILE fqName: fileName:/typeAliasConstructorReference.kt + TYPEALIAS name:CA visibility:public expandedType:.C + TYPEALIAS name:NA visibility:public expandedType:.Host.Nested CLASS CLASS name:C modality:FINAL visibility:public superTypes:[kotlin.Any] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.C CONSTRUCTOR visibility:public <> (x:kotlin.Int) returnType:.C [primary] diff --git a/compiler/testData/ir/irText/regressions/integerCoercionToT.fir.txt b/compiler/testData/ir/irText/regressions/integerCoercionToT.fir.txt index a0cc133be32..df80b80a788 100644 --- a/compiler/testData/ir/irText/regressions/integerCoercionToT.fir.txt +++ b/compiler/testData/ir/irText/regressions/integerCoercionToT.fir.txt @@ -1,4 +1,5 @@ FILE fqName: fileName:/integerCoercionToT.kt + TYPEALIAS name:CInt32Var visibility:public expandedType:.CInt32VarX CLASS INTERFACE name:CPointed modality:ABSTRACT visibility:public superTypes:[kotlin.Any] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.CPointed FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] diff --git a/compiler/testData/ir/irText/regressions/typeAliasCtorForGenericClass.fir.txt b/compiler/testData/ir/irText/regressions/typeAliasCtorForGenericClass.fir.txt index 9d9c94e0e80..427c3e68e1a 100644 --- a/compiler/testData/ir/irText/regressions/typeAliasCtorForGenericClass.fir.txt +++ b/compiler/testData/ir/irText/regressions/typeAliasCtorForGenericClass.fir.txt @@ -1,4 +1,8 @@ FILE fqName: fileName:/typeAliasCtorForGenericClass.kt + TYPEALIAS name:B visibility:public expandedType:.A.B> + TYPE_PARAMETER name:X index:0 variance: superTypes:[kotlin.Any?] + TYPEALIAS name:B2 visibility:public expandedType:.A<.A.B2>> + TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?] CLASS CLASS name:A modality:FINAL visibility:public superTypes:[kotlin.Any] $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.A.A> TYPE_PARAMETER name:Q index:0 variance: superTypes:[kotlin.Any?] diff --git a/compiler/testData/ir/irText/types/abbreviatedTypes.fir.txt b/compiler/testData/ir/irText/types/abbreviatedTypes.fir.txt index 7aba9e0bd4f..b2b04051e9d 100644 --- a/compiler/testData/ir/irText/types/abbreviatedTypes.fir.txt +++ b/compiler/testData/ir/irText/types/abbreviatedTypes.fir.txt @@ -1,4 +1,7 @@ FILE fqName: fileName:/abbreviatedTypes.kt + TYPEALIAS name:I visibility:public expandedType:kotlin.Int + TYPEALIAS name:L visibility:public expandedType:kotlin.collections.List.L> + TYPE_PARAMETER name:T index:0 variance: superTypes:[kotlin.Any?] FUN name:test1 visibility:public modality:FINAL <> (x:kotlin.collections.List) returnType:kotlin.collections.List VALUE_PARAMETER name:x index:0 type:kotlin.collections.List BLOCK_BODY