Introduce Fir2IrBuiltIns & move extension function type inside

This commit is contained in:
Mikhail Glukhikh
2020-08-18 18:15:44 +03:00
parent 97b10b5ab3
commit f7cb165fb9
5 changed files with 46 additions and 20 deletions
@@ -0,0 +1,31 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.backend
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
import org.jetbrains.kotlin.fir.types.CompilerConeAttributes
import org.jetbrains.kotlin.ir.declarations.IrConstructor
import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.types.defaultType
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
class Fir2IrBuiltIns(
private val components: Fir2IrComponents,
session: FirSession
) : Fir2IrComponents by components {
private val extensionFunctionTypeAnnotationSymbol by lazy {
session.firSymbolProvider.getClassLikeSymbolByFqName(CompilerConeAttributes.ExtensionFunctionType.ANNOTATION_CLASS_ID)!!
.toSymbol(session, classifierStorage, ConversionTypeContext.DEFAULT) as IrClassSymbol
}
internal fun extensionFunctionTypeAnnotationConstructorCall() =
IrConstructorCallImpl.fromSymbolOwner(
extensionFunctionTypeAnnotationSymbol.defaultType,
extensionFunctionTypeAnnotationSymbol.owner.declarations.firstIsInstance<IrConstructor>().symbol
)
}
@@ -18,6 +18,7 @@ interface Fir2IrComponents {
val scopeSession: ScopeSession
val symbolTable: SymbolTable
val irBuiltIns: IrBuiltIns
val builtIns: Fir2IrBuiltIns
val irFactory: IrFactory
val classifierStorage: Fir2IrClassifierStorage
val declarationStorage: Fir2IrDeclarationStorage
@@ -28,6 +28,7 @@ class Fir2IrComponentsStorage(
override lateinit var typeConverter: Fir2IrTypeConverter
override lateinit var callGenerator: CallAndReferenceGenerator
override lateinit var fakeOverrideGenerator: FakeOverrideGenerator
override lateinit var builtIns: Fir2IrBuiltIns
override val signatureComposer = FirBasedSignatureComposer(mangler)
}
@@ -215,26 +215,28 @@ class Fir2IrConverter(
)
constantValueGenerator.typeTranslator = typeTranslator
typeTranslator.constantValueGenerator = constantValueGenerator
val builtIns = IrBuiltIns(moduleDescriptor.builtIns, typeTranslator, symbolTable)
FirBuiltinSymbols(builtIns, moduleDescriptor.builtIns, symbolTable)
val irBuiltIns = IrBuiltIns(moduleDescriptor.builtIns, typeTranslator, symbolTable)
FirBuiltinSymbols(irBuiltIns, moduleDescriptor.builtIns, symbolTable)
val sourceManager = PsiSourceManager()
val components = Fir2IrComponentsStorage(session, scopeSession, symbolTable, builtIns, irFactory, mangler)
val components = Fir2IrComponentsStorage(session, scopeSession, symbolTable, irBuiltIns, irFactory, mangler)
val conversionScope = Fir2IrConversionScope()
val classifierStorage = Fir2IrClassifierStorage(components)
val declarationStorage = Fir2IrDeclarationStorage(components, moduleDescriptor)
val typeConverter = Fir2IrTypeConverter(components)
val builtIns = Fir2IrBuiltIns(components, session)
components.declarationStorage = declarationStorage
components.classifierStorage = classifierStorage
components.typeConverter = typeConverter
components.builtIns = builtIns
val irFiles = mutableListOf<IrFile>()
val converter = Fir2IrConverter(moduleDescriptor, sourceManager, components)
for (firFile in firFiles) {
irFiles += converter.registerFileAndClasses(firFile)
}
val irModuleFragment = IrModuleFragmentImpl(moduleDescriptor, builtIns, irFiles)
val irModuleFragment = IrModuleFragmentImpl(moduleDescriptor, irBuiltIns, irFiles)
val irProviders =
generateTypicalIrProviderList(irModuleFragment.descriptor, builtIns, symbolTable, extensions = generatorExtensions)
generateTypicalIrProviderList(irModuleFragment.descriptor, irBuiltIns, symbolTable, extensions = generatorExtensions)
val externalDependenciesGenerator = ExternalDependenciesGenerator(
symbolTable,
irProviders,
@@ -7,24 +7,20 @@ package org.jetbrains.kotlin.fir.backend
import org.jetbrains.kotlin.fir.backend.generators.AnnotationGenerator
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
import org.jetbrains.kotlin.fir.resolve.fullyExpandedType
import org.jetbrains.kotlin.fir.resolve.toSymbol
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.*
import org.jetbrains.kotlin.ir.declarations.IrConstructor
import org.jetbrains.kotlin.ir.expressions.impl.IrConstructorCallImpl
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.IrTypeArgument
import org.jetbrains.kotlin.ir.types.defaultType
import org.jetbrains.kotlin.ir.types.impl.IrSimpleTypeImpl
import org.jetbrains.kotlin.ir.types.impl.IrStarProjectionImpl
import org.jetbrains.kotlin.ir.types.impl.makeTypeProjection
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.types.Variance
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
class Fir2IrTypeConverter(
private val components: Fir2IrComponents
@@ -62,14 +58,6 @@ class Fir2IrTypeConverter(
StandardClassIds.Char to irBuiltIns.charType
)
internal val extensionFunctionTypeAnnotationConstructorCall by lazy {
val symbol =
session.firSymbolProvider.getClassLikeSymbolByFqName(CompilerConeAttributes.ExtensionFunctionType.ANNOTATION_CLASS_ID)!!
.toSymbol(session, classifierStorage, ConversionTypeContext.DEFAULT) as IrClassSymbol
val ctor = symbol.owner.declarations.firstIsInstance<IrConstructor>()
IrConstructorCallImpl(0, 0, symbol.defaultType, ctor.symbol, 0, 0, 0)
}
fun FirTypeRef.toIrType(typeContext: ConversionTypeContext = ConversionTypeContext.DEFAULT): IrType {
return when (this) {
!is FirResolvedTypeRef -> createErrorType()
@@ -98,11 +86,14 @@ class Fir2IrTypeConverter(
val firSymbol = this.lookupTag.toSymbol(session) ?: return createErrorType()
firSymbol.toSymbol(session, classifierStorage, typeContext)
}
val typeAnnotations: MutableList<IrConstructorCall> =
if (attributes.extensionFunctionType == null) mutableListOf()
else mutableListOf(builtIns.extensionFunctionTypeAnnotationConstructorCall())
typeAnnotations += with(annotationGenerator) { annotations.toIrAnnotations() }
IrSimpleTypeImpl(
irSymbol, !typeContext.definitelyNotNull && this.isMarkedNullable,
fullyExpandedType(session).typeArguments.map { it.toIrTypeArgument() },
annotations = with(annotationGenerator) { annotations.toIrAnnotations() } +
listOfNotNull(this.attributes.extensionFunctionType?.let { extensionFunctionTypeAnnotationConstructorCall })
typeAnnotations
)
}
is ConeFlexibleType -> {