[FIR] Fixed supertypes resolve for invalid code with class without ClassId
This commit is contained in:
committed by
TeamCityServer
parent
2e7eedd3f2
commit
37ccab4e23
+6
-5
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-3
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user