[FIR] Fixed supertypes resolve for invalid code with class without ClassId

This commit is contained in:
Igor Yakovlev
2021-05-03 18:56:50 +02:00
committed by TeamCityServer
parent 2e7eedd3f2
commit 37ccab4e23
2 changed files with 10 additions and 8 deletions
@@ -44,7 +44,7 @@ class FirSupertypeResolverProcessor(session: FirSession, scopeSession: ScopeSess
* Interceptor needed by IDE to resolve in-air created declarations. * Interceptor needed by IDE to resolve in-air created declarations.
*/ */
interface FirProviderInterceptorForSupertypeResolver { interface FirProviderInterceptorForSupertypeResolver {
fun getFirClassifierContainerFile(symbol: FirClassLikeSymbol<*>): FirFile fun getFirClassifierContainerFileIfAny(symbol: FirClassLikeSymbol<*>): FirFile?
fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>?
} }
@@ -193,8 +193,9 @@ class FirSupertypeResolverVisitor(
) : FirDefaultVisitor<Unit, Any?>() { ) : FirDefaultVisitor<Unit, Any?>() {
private val supertypeGenerationExtensions = session.extensionService.supertypeGenerators private val supertypeGenerationExtensions = session.extensionService.supertypeGenerators
private fun getFirClassifierContainerFile(symbol: FirClassLikeSymbol<*>): FirFile = private fun getFirClassifierContainerFileIfAny(symbol: FirClassLikeSymbol<*>): FirFile? =
firProviderInterceptor?.getFirClassifierContainerFile(symbol) ?: session.firProvider.getFirClassifierContainerFile(symbol.classId) if (firProviderInterceptor != null) firProviderInterceptor.getFirClassifierContainerFileIfAny(symbol)
else session.firProvider.getFirClassifierContainerFileIfAny(symbol.classId)
private fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? = private fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? =
if (firProviderInterceptor != null) firProviderInterceptor.getFirClassifierByFqName(classId) if (firProviderInterceptor != null) firProviderInterceptor.getFirClassifierByFqName(classId)
@@ -259,7 +260,7 @@ class FirSupertypeResolverVisitor(
val outerClassFir = classId.outerClassId?.let(::getFirClassifierByFqName) as? FirRegularClass val outerClassFir = classId.outerClassId?.let(::getFirClassifierByFqName) as? FirRegularClass
prepareScopeForNestedClasses(outerClassFir ?: return persistentListOf()) prepareScopeForNestedClasses(outerClassFir ?: return persistentListOf())
} }
else -> prepareFileScopes(getFirClassifierContainerFile(classLikeDeclaration.symbol)) else -> getFirClassifierContainerFileIfAny(classLikeDeclaration.symbol)?.let(::prepareFileScopes) ?: persistentListOf()
} }
return result.pushIfNotNull(classLikeDeclaration.typeParametersScope()) return result.pushIfNotNull(classLikeDeclaration.typeParametersScope())
@@ -303,7 +304,7 @@ class FirSupertypeResolverVisitor(
return resolveSpecificClassLikeSupertypes(classLikeDeclaration) { transformer, scope -> return resolveSpecificClassLikeSupertypes(classLikeDeclaration) { transformer, scope ->
if (!classLikeDeclaration.isLocalClassOrAnonymousObject()) { if (!classLikeDeclaration.isLocalClassOrAnonymousObject()) {
session.lookupTracker?.let { session.lookupTracker?.let {
val fileSource = getFirClassifierContainerFile(classLikeDeclaration.symbol).source val fileSource = getFirClassifierContainerFileIfAny(classLikeDeclaration.symbol)?.source
for (supertypeRef in supertypeRefs) { for (supertypeRef in supertypeRefs) {
it.recordTypeLookup(supertypeRef, scope.scopeOwnerLookupNames, fileSource) it.recordTypeLookup(supertypeRef, scope.scopeOwnerLookupNames, fileSource)
} }
@@ -19,10 +19,11 @@ internal class FirProviderInterceptorForIDE private constructor(
private val firFile: FirFile, private val firFile: FirFile,
private val session: FirSession, private val session: FirSession,
private val symbolSet: Set<FirClassLikeSymbol<*>>, private val symbolSet: Set<FirClassLikeSymbol<*>>,
private val classIdToElementMap: Map<ClassId, FirClassLikeDeclaration<*>>): FirProviderInterceptorForSupertypeResolver { private val classIdToElementMap: Map<ClassId, FirClassLikeDeclaration<*>>
) : FirProviderInterceptorForSupertypeResolver {
override fun getFirClassifierContainerFile(symbol: FirClassLikeSymbol<*>): FirFile = override fun getFirClassifierContainerFileIfAny(symbol: FirClassLikeSymbol<*>): FirFile? =
if (symbolSet.contains(symbol)) firFile else session.firProvider.getFirClassifierContainerFile(symbol) if (symbolSet.contains(symbol)) firFile else session.firProvider.getFirClassifierContainerFileIfAny(symbol)
override fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? = override fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? =
classIdToElementMap[classId] ?: session.firProvider.getFirClassifierByFqName(classId) classIdToElementMap[classId] ?: session.firProvider.getFirClassifierByFqName(classId)