[FIR] Fixed resolving type by FirUserTypeRef if type is parametrized

If a parameterized type ref is passed during the `FirSupertypeGenerationExtension.TypeResolveService#resolveUserType` call, the `WRONG_NUMBER_OF_TYPE_ARGUMENTS` error occurs.
This commit is contained in:
Sergey.Shanshin
2024-01-19 16:43:05 +01:00
committed by Space Team
parent 84ad12be57
commit 7af2aebbe2
@@ -382,7 +382,7 @@ open class FirSupertypeResolverVisitor(
private fun resolveSpecificClassLikeSupertypes( private fun resolveSpecificClassLikeSupertypes(
classLikeDeclaration: FirClassLikeDeclaration, classLikeDeclaration: FirClassLikeDeclaration,
resolveSuperTypeRefs: (FirTransformer<ScopeClassDeclaration>, ScopeClassDeclaration) -> List<FirResolvedTypeRef>, resolveSuperTypeRefs: (FirSpecificTypeResolverTransformer, ScopeClassDeclaration) -> List<FirResolvedTypeRef>,
): List<FirResolvedTypeRef> { ): List<FirResolvedTypeRef> {
when (val status = supertypeComputationSession.getSupertypesComputationStatus(classLikeDeclaration)) { when (val status = supertypeComputationSession.getSupertypesComputationStatus(classLikeDeclaration)) {
is SupertypeComputationStatus.Computed -> return status.supertypeRefs is SupertypeComputationStatus.Computed -> return status.supertypeRefs
@@ -487,7 +487,7 @@ open class FirSupertypeResolverVisitor(
private fun addSupertypesFromExtensions( private fun addSupertypesFromExtensions(
klass: FirClassLikeDeclaration, klass: FirClassLikeDeclaration,
supertypeRefs: MutableList<FirResolvedTypeRef>, supertypeRefs: MutableList<FirResolvedTypeRef>,
typeResolveTransformer: FirTransformer<ScopeClassDeclaration>, typeResolveTransformer: FirSpecificTypeResolverTransformer,
scopeDeclaration: ScopeClassDeclaration, scopeDeclaration: ScopeClassDeclaration,
) { ) {
if (supertypeGenerationExtensions.isEmpty()) return if (supertypeGenerationExtensions.isEmpty()) return
@@ -502,11 +502,13 @@ open class FirSupertypeResolverVisitor(
} }
private class TypeResolveServiceForPlugins( private class TypeResolveServiceForPlugins(
val typeResolveTransformer: FirTransformer<ScopeClassDeclaration>, val typeResolveTransformer: FirSpecificTypeResolverTransformer,
val scopeDeclaration: ScopeClassDeclaration, val scopeDeclaration: ScopeClassDeclaration,
) : FirSupertypeGenerationExtension.TypeResolveService() { ) : FirSupertypeGenerationExtension.TypeResolveService() {
override fun resolveUserType(type: FirUserTypeRef): FirResolvedTypeRef { override fun resolveUserType(type: FirUserTypeRef): FirResolvedTypeRef {
return type.transform(typeResolveTransformer, scopeDeclaration) return typeResolveTransformer.withBareTypes(allowed = true) {
type.transform(typeResolveTransformer, scopeDeclaration)
}
} }
} }
@@ -524,14 +526,7 @@ open class FirSupertypeResolverVisitor(
} }
return resolveSpecificClassLikeSupertypes(typeAlias) { transformer, scope -> return resolveSpecificClassLikeSupertypes(typeAlias) { transformer, scope ->
val resolvedTypeRef = transformer.transformTypeRef(expandedTypeRef, scope) as? FirResolvedTypeRef val resolvedTypeRef = transformer.transformTypeRef(expandedTypeRef, scope)
?: return@resolveSpecificClassLikeSupertypes listOf(
createErrorTypeRef(
expandedTypeRef,
"Unresolved expanded typeRef for ${typeAlias.symbol.classId}",
DiagnosticKind.UnresolvedExpandedType
)
)
if (resolveRecursively) { if (resolveRecursively) {
fun visitNestedTypeAliases(type: TypeArgumentMarker) { fun visitNestedTypeAliases(type: TypeArgumentMarker) {