From 37ccab4e2304f7e77dde5c8f832d35a7c8ac9da1 Mon Sep 17 00:00:00 2001 From: Igor Yakovlev Date: Mon, 3 May 2021 18:56:50 +0200 Subject: [PATCH] [FIR] Fixed supertypes resolve for invalid code with class without ClassId --- .../resolve/transformers/FirSupertypesResolution.kt | 11 ++++++----- .../api/trasformers/FirProviderInterceptorForIDE.kt | 7 ++++--- 2 files changed, 10 insertions(+), 8 deletions(-) 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 469eb086315..e11c75d589e 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 @@ -44,7 +44,7 @@ class FirSupertypeResolverProcessor(session: FirSession, scopeSession: ScopeSess * Interceptor needed by IDE to resolve in-air created declarations. */ interface FirProviderInterceptorForSupertypeResolver { - fun getFirClassifierContainerFile(symbol: FirClassLikeSymbol<*>): FirFile + fun getFirClassifierContainerFileIfAny(symbol: FirClassLikeSymbol<*>): FirFile? fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? } @@ -193,8 +193,9 @@ class FirSupertypeResolverVisitor( ) : FirDefaultVisitor() { private val supertypeGenerationExtensions = session.extensionService.supertypeGenerators - private fun getFirClassifierContainerFile(symbol: FirClassLikeSymbol<*>): FirFile = - firProviderInterceptor?.getFirClassifierContainerFile(symbol) ?: session.firProvider.getFirClassifierContainerFile(symbol.classId) + private fun getFirClassifierContainerFileIfAny(symbol: FirClassLikeSymbol<*>): FirFile? = + if (firProviderInterceptor != null) firProviderInterceptor.getFirClassifierContainerFileIfAny(symbol) + else session.firProvider.getFirClassifierContainerFileIfAny(symbol.classId) private fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? = if (firProviderInterceptor != null) firProviderInterceptor.getFirClassifierByFqName(classId) @@ -259,7 +260,7 @@ class FirSupertypeResolverVisitor( val outerClassFir = classId.outerClassId?.let(::getFirClassifierByFqName) as? FirRegularClass prepareScopeForNestedClasses(outerClassFir ?: return persistentListOf()) } - else -> prepareFileScopes(getFirClassifierContainerFile(classLikeDeclaration.symbol)) + else -> getFirClassifierContainerFileIfAny(classLikeDeclaration.symbol)?.let(::prepareFileScopes) ?: persistentListOf() } return result.pushIfNotNull(classLikeDeclaration.typeParametersScope()) @@ -303,7 +304,7 @@ class FirSupertypeResolverVisitor( return resolveSpecificClassLikeSupertypes(classLikeDeclaration) { transformer, scope -> if (!classLikeDeclaration.isLocalClassOrAnonymousObject()) { session.lookupTracker?.let { - val fileSource = getFirClassifierContainerFile(classLikeDeclaration.symbol).source + val fileSource = getFirClassifierContainerFileIfAny(classLikeDeclaration.symbol)?.source for (supertypeRef in supertypeRefs) { it.recordTypeLookup(supertypeRef, scope.scopeOwnerLookupNames, fileSource) } diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/trasformers/FirProviderInterceptorForIDE.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/trasformers/FirProviderInterceptorForIDE.kt index 1aa8a42d36d..66ee06004a8 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/trasformers/FirProviderInterceptorForIDE.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/trasformers/FirProviderInterceptorForIDE.kt @@ -19,10 +19,11 @@ internal class FirProviderInterceptorForIDE private constructor( private val firFile: FirFile, private val session: FirSession, private val symbolSet: Set>, - private val classIdToElementMap: Map>): FirProviderInterceptorForSupertypeResolver { + private val classIdToElementMap: Map> +) : FirProviderInterceptorForSupertypeResolver { - override fun getFirClassifierContainerFile(symbol: FirClassLikeSymbol<*>): FirFile = - if (symbolSet.contains(symbol)) firFile else session.firProvider.getFirClassifierContainerFile(symbol) + override fun getFirClassifierContainerFileIfAny(symbol: FirClassLikeSymbol<*>): FirFile? = + if (symbolSet.contains(symbol)) firFile else session.firProvider.getFirClassifierContainerFileIfAny(symbol) override fun getFirClassifierByFqName(classId: ClassId): FirClassLikeDeclaration<*>? = classIdToElementMap[classId] ?: session.firProvider.getFirClassifierByFqName(classId)