FIR IDE: encapsulate designation into class
This commit is contained in:
+83
@@ -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)
|
||||
-44
@@ -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
|
||||
}
|
||||
+4
-7
@@ -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
|
||||
}
|
||||
|
||||
-8
@@ -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()
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user