FIR IDE: encapsulate designation into class

This commit is contained in:
Ilya Kirillov
2021-04-09 11:46:27 +02:00
parent aff1788a4c
commit ebdbcbb7b6
5 changed files with 88 additions and 60 deletions
@@ -0,0 +1,83 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.fir.low.level.api.api
import org.jetbrains.kotlin.fir.containingClass
import org.jetbrains.kotlin.fir.containingClassForLocal
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.renderWithType
import org.jetbrains.kotlin.fir.resolve.firProvider
import org.jetbrains.kotlin.fir.resolve.toFirRegularClass
import org.jetbrains.kotlin.idea.fir.low.level.api.providers.firIdeProvider
class FirDeclarationDesignation(
val path: List<FirDeclaration>,
val declaration: FirDeclaration,
val isLocalDesignation: Boolean,
) {
@OptIn(ExperimentalStdlibApi::class)
val fullDesignation = buildList {
addAll(path)
add(declaration)
}
}
object DeclarationDesignationCollector {
fun collectDesignation(declaration: FirDeclaration): FirDeclarationDesignation {
val firProvider = declaration.session.firProvider
val containingClass = when (declaration) {
is FirCallableDeclaration<*> -> declaration.containingClass()?.toFirRegularClass(declaration.session)
is FirClassLikeDeclaration<*> -> declaration.symbol.classId.outerClassId?.let(firProvider::getFirClassifierByFqName)
else -> error("Invalid declaration ${declaration.renderWithType()}")
} ?: return FirDeclarationDesignation(emptyList(), declaration, isLocalDesignation = false)
require(containingClass is FirRegularClass) {
"FirRegularClass as containing declaration expected but found ${containingClass.renderWithType()}"
}
val path = when {
containingClass.isLocal -> containingClass.collectForLocal()
else -> containingClass.collectForNonLocal()
}
return FirDeclarationDesignation(
path.reversed(),
declaration,
isLocalDesignation = false
)
}
private fun FirRegularClass.collectForNonLocal(): List<FirClassLikeDeclaration<*>> {
require(!isLocal)
val firProvider = session.firProvider
var containingClassId = classId.outerClassId
val designation = mutableListOf<FirClassLikeDeclaration<*>>(this)
while (containingClassId != null) {
val currentClass = firProvider.getFirClassifierByFqName(containingClassId) ?: break
designation.add(currentClass)
containingClassId = containingClassId.outerClassId
}
return designation
}
private fun FirRegularClass.collectForLocal(): List<FirClassLikeDeclaration<*>> {
require(isLocal)
var containingClassLookUp = containingClassForLocal()
val designation = mutableListOf<FirClassLikeDeclaration<*>>(this)
while (containingClassLookUp != null && containingClassLookUp.classId.isLocal) {
val currentClass = containingClassLookUp.toFirRegularClass(session) ?: break
designation.add(currentClass)
containingClassLookUp = currentClass.containingClassForLocal()
}
return designation
}
}
fun FirDeclaration.collectDesignation(): FirDeclarationDesignation =
DeclarationDesignationCollector.collectDesignation(this)
@@ -1,44 +0,0 @@
/*
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.idea.fir.low.level.api.api
import org.jetbrains.kotlin.fir.containingClassForLocal
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.classId
import org.jetbrains.kotlin.fir.declarations.isLocal
import org.jetbrains.kotlin.fir.resolve.firProvider
import org.jetbrains.kotlin.fir.resolve.toFirRegularClass
fun FirRegularClass.collectDesignation(): List<FirClassLikeDeclaration<*>> {
val designation = mutableListOf<FirClassLikeDeclaration<*>>()
designation.add(this)
fun FirRegularClass.collectForNonLocal() {
require(!isLocal)
val firProvider = session.firProvider
var containingClassId = classId.outerClassId
while (containingClassId != null) {
val currentClass = firProvider.getFirClassifierByFqName(containingClassId) ?: break
designation.add(currentClass)
containingClassId = containingClassId.outerClassId
}
}
fun FirRegularClass.collectForLocal() {
require(isLocal)
var containingClassLookUp = containingClassForLocal()
while (containingClassLookUp != null && containingClassLookUp.classId.isLocal) {
val currentClass = containingClassLookUp.toFirRegularClass(session) ?: break
designation.add(currentClass)
containingClassLookUp = currentClass.containingClassForLocal()
}
}
if (isLocal) collectForLocal() else collectForNonLocal()
designation.reverse()
return designation
}
@@ -7,13 +7,10 @@ package org.jetbrains.kotlin.idea.fir.low.level.api.providers
import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.NoMutableState
import org.jetbrains.kotlin.fir.ThreadSafeMutableState
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.builder.RawFirFragmentForLazyBodiesBuilder
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.originalForSubstitutionOverride
import org.jetbrains.kotlin.fir.resolve.providers.FirProvider
import org.jetbrains.kotlin.fir.resolve.providers.FirProviderInternals
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
@@ -23,9 +20,9 @@ import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
import org.jetbrains.kotlin.idea.fir.low.level.api.IndexHelper
import org.jetbrains.kotlin.idea.fir.low.level.api.PackageExistenceCheckerForSingleModule
import org.jetbrains.kotlin.idea.fir.low.level.api.api.collectDesignation
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache
import org.jetbrains.kotlin.idea.fir.low.level.api.util.collectDesignation
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
@@ -103,7 +100,7 @@ internal class FirIdeProvider(
return RawFirFragmentForLazyBodiesBuilder.build(
session = original.session,
baseScopeProvider = original.session.firIdeProvider.kotlinScopeProvider,
designation = original.collectDesignation(),
designation = original.collectDesignation().fullDesignation,
declaration = ktNamedFunction
) as FirFunction<*>
}
@@ -115,7 +112,7 @@ internal class FirIdeProvider(
return RawFirFragmentForLazyBodiesBuilder.build(
session = original.session,
baseScopeProvider = original.session.firIdeProvider.kotlinScopeProvider,
designation = original.collectDesignation(),
designation = original.collectDesignation().fullDesignation,
declaration = ktNamedFunction
) as FirProperty
}
@@ -135,11 +135,3 @@ private fun KtTypeAlias.findFir(firSymbolProvider: FirSymbolProvider): FirTypeAl
val FirDeclaration.isGeneratedDeclaration
get() = realPsi == null
internal fun FirCallableDeclaration<*>.collectDesignation(): List<FirClassLikeDeclaration<*>> {
return containingClass()
?.toFirRegularClass(session)
?.collectDesignation()
?: return emptyList()
}
@@ -196,7 +196,7 @@ internal class ConeTypeIdeRenderer(
}
val classToRender = classSymbolToRender.fir
val designation = classToRender.collectDesignation()
val designation = classToRender.collectDesignation().fullDesignation
var typeParametersLeft = type.typeArguments.count()
fun needToRenderTypeParameters(index: Int): Boolean {