diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt index a583654d320..033e05f3a0d 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirSupertypesResolution.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.expressions.FirStatement import org.jetbrains.kotlin.fir.extensions.extensionService import org.jetbrains.kotlin.fir.extensions.predicateBasedProvider import org.jetbrains.kotlin.fir.extensions.supertypeGenerators +import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.LocalClassesNavigationInfo import org.jetbrains.kotlin.fir.scopes.FirCompositeScope @@ -112,7 +113,7 @@ private class FirApplySupertypesTransformer( return super.transformAnonymousObject(anonymousObject, data) } - private fun getResolvedSupertypeRefs(classLikeDeclaration: FirClassLikeDeclaration<*>): List { + private fun getResolvedSupertypeRefs(classLikeDeclaration: FirClassLikeDeclaration<*>): List { val status = supertypeComputationSession.getSupertypesComputationStatus(classLikeDeclaration) require(status is SupertypeComputationStatus.Computed) { "Unexpected status at FirApplySupertypesTransformer: $status for ${classLikeDeclaration.symbol.classId}" @@ -248,7 +249,7 @@ private class FirSupertypeResolverVisitor( private fun resolveSpecificClassLikeSupertypes( classLikeDeclaration: FirClassLikeDeclaration<*>, - resolveSuperTypeRefs: (FirTransformer, FirScope) -> List + resolveSuperTypeRefs: (FirTransformer, FirScope) -> List ): List { when (val status = supertypeComputationSession.getSupertypesComputationStatus(classLikeDeclaration)) { is SupertypeComputationStatus.Computed -> return status.supertypeRefs @@ -282,23 +283,26 @@ private class FirSupertypeResolverVisitor( supertypeRefs: List ): List { return resolveSpecificClassLikeSupertypes(classLikeDeclaration) { transformer, scope -> - ArrayList(supertypeRefs).mapTo(mutableListOf()) { + supertypeRefs.mapTo(mutableListOf()) { val superTypeRef = transformer.transformTypeRef(it, scope).single - - if (superTypeRef.coneTypeSafe() != null) - createErrorTypeRef( - superTypeRef, - "Type parameter cannot be a super-type: ${superTypeRef.coneTypeUnsafe().render()}" - ) - else - superTypeRef + when { + superTypeRef.coneTypeSafe() != null -> + createErrorTypeRef( + superTypeRef, + "Type parameter cannot be a super-type: ${superTypeRef.coneTypeUnsafe().render()}" + ) + superTypeRef !is FirResolvedTypeRef -> + createErrorTypeRef(superTypeRef, "Unresolved super-type: ${superTypeRef.render()}") + else -> + superTypeRef + } }.also { addSupertypesFromExtensions(classLikeDeclaration, it) } } } - private fun addSupertypesFromExtensions(klass: FirClassLikeDeclaration<*>, supertypeRefs: MutableList) { + private fun addSupertypesFromExtensions(klass: FirClassLikeDeclaration<*>, supertypeRefs: MutableList) { if (supertypeGenerationExtensions.isEmpty()) return val provider = session.predicateBasedProvider for (extension in supertypeGenerationExtensions) { @@ -384,7 +388,7 @@ private class SupertypeComputationSession { supertypeStatusMap[classLikeDeclaration] = SupertypeComputationStatus.Computing } - fun storeSupertypes(classLikeDeclaration: FirClassLikeDeclaration<*>, resolvedTypesRefs: List) { + fun storeSupertypes(classLikeDeclaration: FirClassLikeDeclaration<*>, resolvedTypesRefs: List) { require(supertypeStatusMap[classLikeDeclaration] is SupertypeComputationStatus.Computing) { "Unexpected in storeSupertypes supertype status for $classLikeDeclaration: ${supertypeStatusMap[classLikeDeclaration]}" } @@ -411,7 +415,7 @@ private class SupertypeComputationSession { } val typeRefs = supertypeComputationStatus.supertypeRefs - val resultingTypeRefs = mutableListOf() + val resultingTypeRefs = mutableListOf() var wereChanges = false for (typeRef in typeRefs) { @@ -453,7 +457,7 @@ sealed class SupertypeComputationStatus { object NotComputed : SupertypeComputationStatus() object Computing : SupertypeComputationStatus() - class Computed(val supertypeRefs: List) : SupertypeComputationStatus() + class Computed(val supertypeRefs: List) : SupertypeComputationStatus() } private typealias ScopePersistentList = PersistentList