From ebdbcbb7b6d7fc107649eba8de3f649197d9082f Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 9 Apr 2021 11:46:27 +0200 Subject: [PATCH] FIR IDE: encapsulate designation into class --- .../api/api/FirDeclarationDesignation.kt | 83 +++++++++++++++++++ .../low/level/api/api/designationCollector.kt | 44 ---------- .../low/level/api/providers/FirIdeProvider.kt | 11 +-- .../low/level/api/util/declarationUtils.kt | 8 -- .../api/fir/renderer/ConeTypeIdeRenderer.kt | 2 +- 5 files changed, 88 insertions(+), 60 deletions(-) create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/FirDeclarationDesignation.kt delete mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/designationCollector.kt diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/FirDeclarationDesignation.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/FirDeclarationDesignation.kt new file mode 100644 index 00000000000..99cf6570348 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/FirDeclarationDesignation.kt @@ -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, + 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> { + require(!isLocal) + val firProvider = session.firProvider + var containingClassId = classId.outerClassId + val designation = mutableListOf>(this) + while (containingClassId != null) { + val currentClass = firProvider.getFirClassifierByFqName(containingClassId) ?: break + designation.add(currentClass) + containingClassId = containingClassId.outerClassId + } + return designation + } + + private fun FirRegularClass.collectForLocal(): List> { + require(isLocal) + var containingClassLookUp = containingClassForLocal() + val designation = mutableListOf>(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) \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/designationCollector.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/designationCollector.kt deleted file mode 100644 index 9d43da34278..00000000000 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/api/designationCollector.kt +++ /dev/null @@ -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> { - val designation = mutableListOf>() - 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 -} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeProvider.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeProvider.kt index a1a714e8543..c14c19dfff5 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeProvider.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeProvider.kt @@ -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 } diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/util/declarationUtils.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/util/declarationUtils.kt index e3d54ab5624..a3767f9196f 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/util/declarationUtils.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/util/declarationUtils.kt @@ -135,11 +135,3 @@ private fun KtTypeAlias.findFir(firSymbolProvider: FirSymbolProvider): FirTypeAl val FirDeclaration.isGeneratedDeclaration get() = realPsi == null - -internal fun FirCallableDeclaration<*>.collectDesignation(): List> { - return containingClass() - ?.toFirRegularClass(session) - ?.collectDesignation() - ?: return emptyList() -} - diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/renderer/ConeTypeIdeRenderer.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/renderer/ConeTypeIdeRenderer.kt index 9ce3dead008..4608944f934 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/renderer/ConeTypeIdeRenderer.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/renderer/ConeTypeIdeRenderer.kt @@ -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 {