[FIR] Initialize outer type parameters for local classes

This commit is contained in:
Ivan Kochurkin
2021-09-15 19:28:02 +03:00
committed by TeamCityServer
parent 38820d3e41
commit e52a410599
39 changed files with 293 additions and 193 deletions
@@ -32,31 +32,38 @@ fun FirClassLikeDeclaration.getContainingDeclaration(session: FirSession): FirCl
return null
}
fun isValidTypeParameterFromOuterClass(
fun isValidTypeParameterFromOuterDeclaration(
typeParameterSymbol: FirTypeParameterSymbol,
classDeclaration: FirRegularClass?,
declaration: FirDeclaration?,
session: FirSession
): Boolean {
if (classDeclaration == null) {
if (declaration == null) {
return true // Extra check is required because of classDeclaration will be resolved later
}
fun containsTypeParameter(currentClassDeclaration: FirRegularClass): Boolean {
if (currentClassDeclaration.typeParameters.any { it.symbol == typeParameterSymbol }) {
return true
}
for (superTypeRef in currentClassDeclaration.superTypeRefs) {
val superClassFir = superTypeRef.firClassLike(session)
if (superClassFir == null || superClassFir is FirRegularClass && containsTypeParameter(superClassFir)) {
fun containsTypeParameter(currentDeclaration: FirDeclaration?): Boolean {
if (currentDeclaration is FirTypeParameterRefsOwner) {
if (currentDeclaration.typeParameters.any { it.symbol == typeParameterSymbol }) {
return true
}
if (currentDeclaration is FirCallableDeclaration) {
val containingClassId = currentDeclaration.symbol.callableId.classId ?: return true
return containsTypeParameter(session.symbolProvider.getClassLikeSymbolByClassId(containingClassId)?.fir)
} else if (currentDeclaration is FirClass) {
for (superTypeRef in currentDeclaration.superTypeRefs) {
val superClassFir = superTypeRef.firClassLike(session)
if (superClassFir == null || superClassFir is FirRegularClass && containsTypeParameter(superClassFir)) {
return true
}
}
}
}
return false
}
return containsTypeParameter(classDeclaration)
return containsTypeParameter(declaration)
}
fun FirTypeRef.firClassLike(session: FirSession): FirClassLikeDeclaration? {