[FIR] Add builtins types to FirSession

This commit is contained in:
Dmitriy Novozhilov
2019-08-22 11:36:35 +03:00
parent 7d4c635e85
commit 198599f3c7
9 changed files with 44 additions and 24 deletions
@@ -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()
@@ -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<T>(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
@@ -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),
@@ -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))
}
}
}
@@ -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<FirSymbolProvider>()
@@ -755,15 +755,15 @@ open class FirBodyResolveTransformer(
binaryLogicExpression: FirBinaryLogicExpression,
data: Any?
): CompositeTransformResult<FirStatement> {
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<FirStatement> {
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)
@@ -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<KClass<*>, 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?
}
@@ -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<FirExpression>()
@@ -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
}
}
@@ -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)