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.openapi.project.Project
|
||||||
import com.intellij.psi.search.GlobalSearchScope
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.*
|
||||||
import org.jetbrains.kotlin.fir.NoMutableState
|
|
||||||
import org.jetbrains.kotlin.fir.ThreadSafeMutableState
|
|
||||||
import org.jetbrains.kotlin.fir.builder.RawFirFragmentForLazyBodiesBuilder
|
import org.jetbrains.kotlin.fir.builder.RawFirFragmentForLazyBodiesBuilder
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
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.FirProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.FirProviderInternals
|
import org.jetbrains.kotlin.fir.resolve.providers.FirProviderInternals
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
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.caches.project.ModuleSourceInfo
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.IndexHelper
|
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.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.FirFileBuilder
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache
|
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.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
@@ -103,7 +100,7 @@ internal class FirIdeProvider(
|
|||||||
return RawFirFragmentForLazyBodiesBuilder.build(
|
return RawFirFragmentForLazyBodiesBuilder.build(
|
||||||
session = original.session,
|
session = original.session,
|
||||||
baseScopeProvider = original.session.firIdeProvider.kotlinScopeProvider,
|
baseScopeProvider = original.session.firIdeProvider.kotlinScopeProvider,
|
||||||
designation = original.collectDesignation(),
|
designation = original.collectDesignation().fullDesignation,
|
||||||
declaration = ktNamedFunction
|
declaration = ktNamedFunction
|
||||||
) as FirFunction<*>
|
) as FirFunction<*>
|
||||||
}
|
}
|
||||||
@@ -115,7 +112,7 @@ internal class FirIdeProvider(
|
|||||||
return RawFirFragmentForLazyBodiesBuilder.build(
|
return RawFirFragmentForLazyBodiesBuilder.build(
|
||||||
session = original.session,
|
session = original.session,
|
||||||
baseScopeProvider = original.session.firIdeProvider.kotlinScopeProvider,
|
baseScopeProvider = original.session.firIdeProvider.kotlinScopeProvider,
|
||||||
designation = original.collectDesignation(),
|
designation = original.collectDesignation().fullDesignation,
|
||||||
declaration = ktNamedFunction
|
declaration = ktNamedFunction
|
||||||
) as FirProperty
|
) as FirProperty
|
||||||
}
|
}
|
||||||
|
|||||||
-8
@@ -135,11 +135,3 @@ private fun KtTypeAlias.findFir(firSymbolProvider: FirSymbolProvider): FirTypeAl
|
|||||||
|
|
||||||
val FirDeclaration.isGeneratedDeclaration
|
val FirDeclaration.isGeneratedDeclaration
|
||||||
get() = realPsi == null
|
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 classToRender = classSymbolToRender.fir
|
||||||
val designation = classToRender.collectDesignation()
|
val designation = classToRender.collectDesignation().fullDesignation
|
||||||
|
|
||||||
var typeParametersLeft = type.typeArguments.count()
|
var typeParametersLeft = type.typeArguments.count()
|
||||||
fun needToRenderTypeParameters(index: Int): Boolean {
|
fun needToRenderTypeParameters(index: Int): Boolean {
|
||||||
|
|||||||
Reference in New Issue
Block a user