FIR: Weaken requirements for all symbols to have correct FIR

Currently, some cases like library type parameters are not supported properly
This commit is contained in:
Denis Zharkov
2019-03-27 17:17:45 +03:00
parent 825218b479
commit 7b97c2a42a
3 changed files with 16 additions and 7 deletions
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.fir.declarations.expandedConeType
import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.symbols.* import org.jetbrains.kotlin.fir.symbols.*
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.ConeAbbreviatedTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeAbbreviatedTypeImpl
import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl
@@ -42,11 +41,10 @@ fun ConeAbbreviatedType.directExpansionType(useSiteSession: FirSession): ConeCla
fun ConeClassifierLookupTag.toSymbol(useSiteSession: FirSession): ConeClassifierSymbol? = fun ConeClassifierLookupTag.toSymbol(useSiteSession: FirSession): ConeClassifierSymbol? =
when (this) { when (this) {
is ConeClassLikeLookupTag -> toSymbol(useSiteSession) is ConeClassLikeLookupTag -> toSymbol(useSiteSession)
is FirTypeParameterSymbol -> this.symbol is ConeTypeParameterSymbol -> this
else -> error("sealed") else -> error("sealed")
} }
fun ConeClassifierSymbol.constructType(typeArguments: Array<ConeKotlinTypeProjection>, isNullable: Boolean): ConeLookupTagBasedType { fun ConeClassifierSymbol.constructType(typeArguments: Array<ConeKotlinTypeProjection>, isNullable: Boolean): ConeLookupTagBasedType {
return when (this) { return when (this) {
is ConeTypeParameterSymbol -> { is ConeTypeParameterSymbol -> {
@@ -8,9 +8,11 @@ package org.jetbrains.kotlin.fir.resolve
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
import org.jetbrains.kotlin.fir.resolve.transformers.firSafeNullable
import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.impl.FirCompositeScope import org.jetbrains.kotlin.fir.scopes.impl.FirCompositeScope
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
@@ -21,11 +23,15 @@ fun ConeKotlinType.scope(useSiteSession: FirSession): FirScope? {
is ConeClassErrorType -> null is ConeClassErrorType -> null
is ConeAbbreviatedType -> directExpansionType(useSiteSession)?.scope(useSiteSession) is ConeAbbreviatedType -> directExpansionType(useSiteSession)?.scope(useSiteSession)
is ConeClassLikeType -> { is ConeClassLikeType -> {
val fir = this.lookupTag.toSymbol(useSiteSession)?.firUnsafe<FirRegularClass>() ?: return null // For ConeClassLikeType they might be a type alias instead of a regular class
// TODO: support that case and switch back to `firUnsafe` instead of `firSafeNullable`
val fir = this.lookupTag.toSymbol(useSiteSession)?.firSafeNullable<FirRegularClass>() ?: return null
fir.buildUseSiteScope(useSiteSession) fir.buildUseSiteScope(useSiteSession)
} }
is ConeTypeParameterType -> { is ConeTypeParameterType -> {
val fir = this.lookupTag.toSymbol(useSiteSession)?.firUnsafe<FirTypeParameter>() ?: return null // TODO: support LibraryTypeParameterSymbol or get rid of it
val toSymbol = this.lookupTag.toSymbol(useSiteSession)?.takeIf { it is FirBasedSymbol<*> } ?: return null
val fir = toSymbol.firUnsafe<FirTypeParameter>()
FirCompositeScope(fir.bounds.mapNotNullTo(mutableListOf()) { it.coneTypeUnsafe().scope(useSiteSession) }) FirCompositeScope(fir.bounds.mapNotNullTo(mutableListOf()) { it.coneTypeUnsafe().scope(useSiteSession) })
} }
is ConeFlexibleType -> lowerBound.scope(useSiteSession) is ConeFlexibleType -> lowerBound.scope(useSiteSession)
@@ -544,6 +544,11 @@ inline fun <reified T : FirElement> ConeSymbol.firUnsafe(): T {
return fir return fir
} }
inline fun <reified T : FirElement> ConeSymbol.firSafeNullable(): T? {
if (this !is FirBasedSymbol<*>) return null
return fir as? T
}
interface ReturnTypeCalculator { interface ReturnTypeCalculator {
fun tryCalculateReturnType(declaration: FirTypedDeclaration): FirResolvedTypeRef fun tryCalculateReturnType(declaration: FirTypedDeclaration): FirResolvedTypeRef