K2 IC: fix classifiers lookups

in particular nested classifiers and companions.

#KTIJ-24833 fixed
#KTIJ-24830 fixed
#KT-55195 fixed
This commit is contained in:
Ilya Chernikov
2024-02-27 16:28:08 +01:00
committed by Space Team
parent a823bfd600
commit 39b05a0a1c
61 changed files with 560 additions and 341 deletions
@@ -40,20 +40,22 @@ fun FirLookupTrackerComponent.recordCallLookup(callInfo: AbstractCallInfo, inSco
recordNameLookup(callInfo.name, inScopes, callInfo.callSite.source, callInfo.containingFile.source)
}
fun FirLookupTrackerComponent.recordTypeLookup(typeRef: FirTypeRef, inScopes: Iterable<String>, fileSource: KtSourceElement?) {
if (typeRef is FirUserTypeRef) recordNameLookup(typeRef.qualifier.first().name, inScopes, typeRef.source, fileSource)
}
fun FirLookupTrackerComponent.recordClassLikeLookup(classId: ClassId, source: KtSourceElement?, fileSource: KtSourceElement?) {
if (!classId.isLocal && classId !in StandardClassIds.allBuiltinTypes) {
recordLookup(classId.relativeClassName.asString(), classId.packageFqName.asString(), source, fileSource)
if (classId.shortClassName == DEFAULT_NAME_FOR_COMPANION_OBJECT) {
recordLookup(
classId.outerClassId!!.relativeClassName.asString(),
classId.outerClassId!!.packageFqName.asString(),
source, fileSource
)
}
val classFqName = classId.asSingleFqName()
recordLookup(classFqName.shortName().asString(), classFqName.parent().asString(), source, fileSource)
}
}
fun FirLookupTrackerComponent.recordCompanionLookup(classId: ClassId, source: KtSourceElement?, fileSource: KtSourceElement?) {
if (!classId.isLocal && classId !in StandardClassIds.allBuiltinTypes) {
val classFqName = classId.asSingleFqName()
recordLookup(classFqName.shortName().asString(), classFqName.parent().asString(), source, fileSource)
recordLookup(
classFqName.parent().shortName().asString(),
classFqName.parent().parent().asString(),
source, fileSource
)
}
}
@@ -82,6 +84,15 @@ fun FirLookupTrackerComponent.recordTypeResolveAsLookup(typeRef: FirTypeRef, sou
recordTypeResolveAsLookup(typeRef.type, source, fileSource)
}
fun FirLookupTrackerComponent.recordUserTypeRefLookup(typeRef: FirUserTypeRef, inScopes: Iterable<String>, fileSource: KtSourceElement?) {
inScopes.forEach { scope ->
typeRef.qualifier.fold(FqName(scope)) { result, suffix ->
recordLookup(suffix.name.asString(), result.asString(), typeRef.source, fileSource)
result.child(suffix.name)
}
}
}
// TODO: review all places that record resolved type as lookup and consider minimize the number of them; see #KT-66366
fun FirLookupTrackerComponent.recordTypeResolveAsLookup(type: ConeKotlinType?, source: KtSourceElement?, fileSource: KtSourceElement?) {
if (type == null) return