From 198599f3c73627835f1cd6506bff11efe536bc70 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Thu, 22 Aug 2019 11:36:35 +0300 Subject: [PATCH] [FIR] Add builtins types to FirSession --- .../jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt | 8 ++++---- .../kotlin/fir/builder/BaseFirBuilder.kt | 12 +++++++----- .../kotlin/fir/builder/ConversionUtils.kt | 3 +-- .../resolve/impl/FirLibrarySymbolProviderImpl.kt | 11 +++++++---- .../transformers/FirBodyResolveTransformer.kt | 8 ++++---- .../src/org/jetbrains/kotlin/fir/FirSession.kt | 15 +++++++++++++++ .../fir/declarations/impl/FirEnumEntryImpl.kt | 3 +-- .../fir/declarations/impl/FirTypeParameterImpl.kt | 3 +-- .../fir/types/impl/FirImplicitBuiltinTypeRef.kt | 5 ++++- 9 files changed, 44 insertions(+), 24 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt index 3a155e1cbb5..738b1c9e77d 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrVisitor.kt @@ -75,13 +75,13 @@ internal class Fir2IrVisitor( private val declarationStorage = Fir2IrDeclarationStorage(session, symbolTable, moduleDescriptor) - private val nothingType = FirImplicitNothingTypeRef(null).toIrType(session, declarationStorage) + private val nothingType = session.builtinTypes.nothingType.toIrType(session, declarationStorage) - private val unitType = FirImplicitUnitTypeRef(null).toIrType(session, declarationStorage) + private val unitType = session.builtinTypes.unitType.toIrType(session, declarationStorage) - private val booleanType = FirImplicitBooleanTypeRef(null).toIrType(session, declarationStorage) + private val booleanType = session.builtinTypes.booleanType.toIrType(session, declarationStorage) - private val stringType = FirImplicitStringTypeRef(null).toIrType(session, declarationStorage) + private val stringType = session.builtinTypes.stringType.toIrType(session, declarationStorage) private fun ModuleDescriptor.findPackageFragmentForFile(file: FirFile): PackageFragmentDescriptor = getPackage(file.packageFqName).fragments.first() diff --git a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt index 10545319595..1c36cc22c98 100644 --- a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt +++ b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt @@ -31,7 +31,9 @@ import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeTypeParameterType import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.coneTypeSafe -import org.jetbrains.kotlin.fir.types.impl.* +import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl +import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl +import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl import org.jetbrains.kotlin.ir.expressions.IrConstKind import org.jetbrains.kotlin.lexer.KtTokens.CLOSING_QUOTE import org.jetbrains.kotlin.lexer.KtTokens.OPEN_QUOTE @@ -47,10 +49,10 @@ import org.jetbrains.kotlin.util.OperatorNameConventions //T can be either PsiElement, or LighterASTNode abstract class BaseFirBuilder(val session: FirSession, val context: Context = Context()) { - protected val implicitUnitType = FirImplicitUnitTypeRef(null) - protected val implicitAnyType = FirImplicitAnyTypeRef(null) - protected val implicitEnumType = FirImplicitEnumTypeRef(null) - protected val implicitAnnotationType = FirImplicitAnnotationTypeRef(null) + protected val implicitUnitType = session.builtinTypes.unitType + protected val implicitAnyType = session.builtinTypes.anyType + protected val implicitEnumType = session.builtinTypes.enumType + protected val implicitAnnotationType = session.builtinTypes.annotationType abstract val T.elementType: IElementType abstract val T.asText: String diff --git a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt index 030d2dc01da..7892179ed29 100644 --- a/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt +++ b/compiler/fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/ConversionUtils.kt @@ -27,7 +27,6 @@ import org.jetbrains.kotlin.fir.types.ConeStarProjection import org.jetbrains.kotlin.fir.types.FirTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitKPropertyTypeRef import org.jetbrains.kotlin.fir.types.impl.FirImplicitTypeRefImpl -import org.jetbrains.kotlin.fir.types.impl.FirImplicitUnitTypeRef import org.jetbrains.kotlin.ir.expressions.IrConstKind import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.Name @@ -335,7 +334,7 @@ fun FirModifiableAccessorsOwner.generateAccessorsByDelegate(session: FirSession, ) } setter = (setter as? FirPropertyAccessorImpl) - ?: FirPropertyAccessorImpl(session, null, false, Visibilities.UNKNOWN, FirImplicitUnitTypeRef(null), FirPropertyAccessorSymbol()).apply { + ?: FirPropertyAccessorImpl(session, null, false, Visibilities.UNKNOWN, session.builtinTypes.unitType, FirPropertyAccessorSymbol()).apply { val parameter = FirValueParameterImpl( session, null, DELEGATED_SETTER_PARAM, FirImplicitTypeRefImpl(null), diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt index aa3fb010bab..e48e7b11a85 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/impl/FirLibrarySymbolProviderImpl.kt @@ -20,16 +20,19 @@ import org.jetbrains.kotlin.fir.declarations.impl.* import org.jetbrains.kotlin.fir.deserialization.FirBuiltinAnnotationDeserializer import org.jetbrains.kotlin.fir.deserialization.FirDeserializationContext import org.jetbrains.kotlin.fir.deserialization.deserializeClassToSymbol -import org.jetbrains.kotlin.fir.resolve.* +import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider +import org.jetbrains.kotlin.fir.resolve.ScopeSession +import org.jetbrains.kotlin.fir.resolve.buildDefaultUseSiteScope +import org.jetbrains.kotlin.fir.resolve.getOrPut import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScope -import org.jetbrains.kotlin.fir.symbols.* +import org.jetbrains.kotlin.fir.symbols.CallableId +import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl -import org.jetbrains.kotlin.fir.types.impl.FirImplicitAnyTypeRef import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl import org.jetbrains.kotlin.metadata.ProtoBuf import org.jetbrains.kotlin.metadata.builtins.BuiltInsBinaryVersion @@ -249,7 +252,7 @@ class FirLibrarySymbolProviderImpl(val session: FirSession) : FirSymbolProvider( } } ) - replaceSupertypes(listOf(FirImplicitAnyTypeRef(null))) + replaceSupertypes(listOf(session.builtinTypes.anyType)) } } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt index 36fd6c685cb..a58a20d6758 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirBodyResolveTransformer.kt @@ -48,7 +48,7 @@ open class FirBodyResolveTransformer( final override val returnTypeCalculator: ReturnTypeCalculator = ReturnTypeCalculatorWithJump(session, scopeSession) final override val noExpectedType = FirImplicitTypeRefImpl(null) - private val booleanType = FirImplicitBooleanTypeRef(null) + private inline val builtinTypes: BuiltinTypes get() = session.builtinTypes final override val symbolProvider = session.service() @@ -755,15 +755,15 @@ open class FirBodyResolveTransformer( binaryLogicExpression: FirBinaryLogicExpression, data: Any? ): CompositeTransformResult { - return super.transformBinaryLogicExpression(binaryLogicExpression, booleanType).also { - (it.single as FirBinaryLogicExpression).resultType = booleanType + return super.transformBinaryLogicExpression(binaryLogicExpression, builtinTypes.booleanType).also { + (it.single as FirBinaryLogicExpression).resultType = builtinTypes.booleanType } } override fun transformOperatorCall(operatorCall: FirOperatorCall, data: Any?): CompositeTransformResult { if (operatorCall.operation in FirOperation.BOOLEANS) { return (operatorCall.transformChildren(this, noExpectedType) as FirOperatorCall).also { - it.resultType = booleanType + it.resultType = builtinTypes.booleanType }.compose() } return super.transformOperatorCall(operatorCall, data) diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSession.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSession.kt index eb54ec2c753..0fc81764214 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSession.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/FirSession.kt @@ -6,6 +6,8 @@ package org.jetbrains.kotlin.fir import org.jetbrains.kotlin.analyzer.ModuleInfo +import org.jetbrains.kotlin.fir.types.FirTypeRef +import org.jetbrains.kotlin.fir.types.impl.* import org.jetbrains.kotlin.utils.Jsr305State import kotlin.properties.ReadOnlyProperty import kotlin.reflect.KClass @@ -16,6 +18,7 @@ abstract class FirSession(val sessionProvider: FirSessionProvider?) { val jsr305State: Jsr305State? get() = null + val builtinTypes: BuiltinTypes = BuiltinTypes() val components: MutableMap, Any> = mutableMapOf() @@ -37,6 +40,18 @@ abstract class FirSession(val sessionProvider: FirSessionProvider?) { } } +class BuiltinTypes { + val unitType: FirTypeRef = FirImplicitUnitTypeRef(null) + val anyType: FirTypeRef = FirImplicitAnyTypeRef(null) + val nullableAnyType: FirTypeRef = FirImplicitNullableAnyTypeRef(null) + val enumType: FirTypeRef = FirImplicitEnumTypeRef(null) + val annotationType: FirTypeRef = FirImplicitAnnotationTypeRef(null) + val booleanType: FirTypeRef = FirImplicitBooleanTypeRef(null) + val nothingType: FirTypeRef = FirImplicitNothingTypeRef(null) + val nullableNothingType: FirTypeRef = FirImplicitNullableNothingTypeRef(null) + val stringType: FirTypeRef = FirImplicitStringTypeRef(null) +} + interface FirSessionProvider { fun getSession(moduleInfo: ModuleInfo): FirSession? } diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirEnumEntryImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirEnumEntryImpl.kt index a3a7c34e830..27a6a541de8 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirEnumEntryImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirEnumEntryImpl.kt @@ -17,7 +17,6 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol import org.jetbrains.kotlin.fir.transformInplace import org.jetbrains.kotlin.fir.transformSingle import org.jetbrains.kotlin.fir.types.FirTypeRef -import org.jetbrains.kotlin.fir.types.impl.FirImplicitEnumTypeRef import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull @@ -46,7 +45,7 @@ class FirEnumEntryImpl( override val companionObject: FirRegularClass? get() = null - override var typeRef: FirTypeRef = FirImplicitEnumTypeRef(null) + override var typeRef: FirTypeRef = session.builtinTypes.enumType override val arguments = mutableListOf() diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirTypeParameterImpl.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirTypeParameterImpl.kt index f23bd5f7b24..a3f5ac7fb54 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirTypeParameterImpl.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/impl/FirTypeParameterImpl.kt @@ -12,7 +12,6 @@ import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol import org.jetbrains.kotlin.fir.transformInplace import org.jetbrains.kotlin.fir.types.FirTypeRef -import org.jetbrains.kotlin.fir.types.impl.FirImplicitNullableAnyTypeRef import org.jetbrains.kotlin.fir.visitors.FirTransformer import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.types.Variance @@ -45,6 +44,6 @@ class FirTypeParameterImpl( fun FirTypeParameterImpl.addDefaultBoundIfNecessary() { if (bounds.isEmpty()) { - bounds += FirImplicitNullableAnyTypeRef(null) + bounds += session.builtinTypes.nullableAnyType } } \ No newline at end of file diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinTypeRef.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinTypeRef.kt index b529fde5896..e560c6a2694 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinTypeRef.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/types/impl/FirImplicitBuiltinTypeRef.kt @@ -11,7 +11,6 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTagImpl import org.jetbrains.kotlin.fir.symbols.StandardClassIds import org.jetbrains.kotlin.fir.types.ConeClassLikeType -import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinTypeProjection import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.name.ClassId @@ -56,6 +55,10 @@ class FirImplicitNothingTypeRef( psi: PsiElement? ) : FirImplicitBuiltinTypeRef(psi, StandardClassIds.Nothing) +class FirImplicitNullableNothingTypeRef( + psi: PsiElement? +) : FirImplicitBuiltinTypeRef(psi, StandardClassIds.Nothing, isNullable = true) + class FirImplicitStringTypeRef( psi: PsiElement? ) : FirImplicitBuiltinTypeRef(psi, StandardClassIds.String)