diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt index ba4cc33213e..699fbc2a145 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt @@ -10,7 +10,6 @@ import org.jetbrains.kotlin.fir.declarations.expandedConeType import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.symbols.* 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.impl.ConeAbbreviatedTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl @@ -42,11 +41,10 @@ fun ConeAbbreviatedType.directExpansionType(useSiteSession: FirSession): ConeCla fun ConeClassifierLookupTag.toSymbol(useSiteSession: FirSession): ConeClassifierSymbol? = when (this) { is ConeClassLikeLookupTag -> toSymbol(useSiteSession) - is FirTypeParameterSymbol -> this.symbol + is ConeTypeParameterSymbol -> this else -> error("sealed") } - fun ConeClassifierSymbol.constructType(typeArguments: Array, isNullable: Boolean): ConeLookupTagBasedType { return when (this) { is ConeTypeParameterSymbol -> { @@ -127,4 +125,4 @@ fun T.withArguments(arguments: Array ConeFunctionTypeImpl(receiverType, parameterTypes, returnType, lookupTag, nullability.isNullable) as T else -> error("Not supported: $this: ${this.render()}") } -} \ No newline at end of file +} diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt index 407cfb4c768..7a29da0bed8 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ScopeUtils.kt @@ -8,9 +8,11 @@ package org.jetbrains.kotlin.fir.resolve import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirRegularClass 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.scopes.FirScope 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.impl.ConeClassTypeImpl import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl @@ -21,11 +23,15 @@ fun ConeKotlinType.scope(useSiteSession: FirSession): FirScope? { is ConeClassErrorType -> null is ConeAbbreviatedType -> directExpansionType(useSiteSession)?.scope(useSiteSession) is ConeClassLikeType -> { - val fir = this.lookupTag.toSymbol(useSiteSession)?.firUnsafe() ?: 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() ?: return null fir.buildUseSiteScope(useSiteSession) } is ConeTypeParameterType -> { - val fir = this.lookupTag.toSymbol(useSiteSession)?.firUnsafe() ?: 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() FirCompositeScope(fir.bounds.mapNotNullTo(mutableListOf()) { it.coneTypeUnsafe().scope(useSiteSession) }) } is ConeFlexibleType -> lowerBound.scope(useSiteSession) @@ -47,4 +53,4 @@ fun FirRegularClass.defaultType(): ConeClassTypeImpl { }.toTypedArray(), isNullable = false ) -} \ No newline at end of file +} 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 50ddd672d84..d2acbaa30cd 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 @@ -544,6 +544,11 @@ inline fun ConeSymbol.firUnsafe(): T { return fir } +inline fun ConeSymbol.firSafeNullable(): T? { + if (this !is FirBasedSymbol<*>) return null + return fir as? T +} + interface ReturnTypeCalculator { fun tryCalculateReturnType(declaration: FirTypedDeclaration): FirResolvedTypeRef