From d284ed1c79faacedf0d401bbb929c02cdb028177 Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Tue, 31 Aug 2021 18:00:17 +0300 Subject: [PATCH] [FIR IDE] Commonize `FirCallableSymbol.computeImportableName` function --- .../fir/components/KtFirImportOptimizer.kt | 29 ++----------------- .../fir/components/KtFirReferenceShortener.kt | 24 ++------------- .../idea/frontend/api/fir/utils/firUtils.kt | 29 +++++++++++++++++++ 3 files changed, 34 insertions(+), 48 deletions(-) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirImportOptimizer.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirImportOptimizer.kt index d99db920ea9..c737c27a221 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirImportOptimizer.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirImportOptimizer.kt @@ -5,12 +5,8 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.components -import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.analysis.checkers.classKind -import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol -import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.declarations.utils.isOperator @@ -19,7 +15,6 @@ import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.references.FirResolvedCallableReference import org.jetbrains.kotlin.fir.symbols.ensureResolved import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol -import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.classId import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid @@ -29,6 +24,7 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFirFile import org.jetbrains.kotlin.idea.frontend.api.assertIsValidAndAccessible import org.jetbrains.kotlin.idea.frontend.api.components.KtImportOptimizer import org.jetbrains.kotlin.idea.frontend.api.components.KtImportOptimizerResult +import org.jetbrains.kotlin.idea.frontend.api.fir.utils.computeImportableName import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.FqName @@ -184,7 +180,7 @@ internal class KtFirImportOptimizer( } private fun saveCallable(resolvedSymbol: FirCallableSymbol<*>, referencedByName: Name) { - val importableName = resolvedSymbol.computeImportableName() ?: return + val importableName = resolvedSymbol.computeImportableName(firSession) ?: return saveReferencedItem(importableName, referencedByName) } @@ -196,27 +192,6 @@ internal class KtFirImportOptimizer( return usedImports } - - // DUP in KtFirReferenceShortener - private fun FirCallableSymbol<*>.computeImportableName(): FqName? { - // if classId == null, callable is topLevel - val classId = callableId.classId - ?: return callableId.packageName.child(callableId.callableName) - - if (this is FirConstructorSymbol) return classId.asSingleFqName() - - val containingClass = getContainingClassSymbol(firSession) ?: return null - - // Java static members, enums, and object members can be imported - return if (containingClass.origin == FirDeclarationOrigin.Java || - containingClass.classKind == ClassKind.ENUM_CLASS || - containingClass.classKind == ClassKind.OBJECT - ) { - classId.asSingleFqName() - } else { - null - } - } } private val FirQualifiedAccessExpression.isFullyQualified: Boolean diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirReferenceShortener.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirReferenceShortener.kt index 472d5e28119..8d722ce8622 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirReferenceShortener.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirReferenceShortener.kt @@ -10,11 +10,8 @@ import com.intellij.openapi.util.TextRange import com.intellij.psi.SmartPsiElementPointer import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.* -import org.jetbrains.kotlin.fir.analysis.checkers.classKind -import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol import org.jetbrains.kotlin.fir.declarations.FirDeclaration -import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirResolvedImport import org.jetbrains.kotlin.fir.declarations.builder.buildImport @@ -53,6 +50,7 @@ import org.jetbrains.kotlin.idea.frontend.api.components.ShortenCommand import org.jetbrains.kotlin.idea.frontend.api.components.ShortenOption import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.utils.addImportToFile +import org.jetbrains.kotlin.idea.frontend.api.fir.utils.computeImportableName import org.jetbrains.kotlin.idea.frontend.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassLikeSymbol import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken @@ -253,24 +251,8 @@ private class FirShorteningContext(val firResolveState: FirModuleResolveState) { fun toClassSymbol(classId: ClassId) = firSession.symbolProvider.getClassLikeSymbolByFqName(classId) - fun convertToImportableName(callableSymbol: FirCallableSymbol<*>): FqName? { - val callableId = callableSymbol.callableId - - // if classId == null, callable is topLevel - val classId = callableId.classId - ?: return callableId.asSingleFqName() - - if (callableSymbol is FirConstructorSymbol) return classId.asSingleFqName() - - val containingClass = callableSymbol.getContainingClassSymbol(firSession) ?: return null - - // Java static members, enums, and object members can be imported - val canBeImported = containingClass.origin == FirDeclarationOrigin.Java || - containingClass.classKind == ClassKind.ENUM_CLASS || - containingClass.classKind == ClassKind.OBJECT - - return if (canBeImported) callableId.asSingleFqName() else null - } + fun convertToImportableName(callableSymbol: FirCallableSymbol<*>): FqName? = + callableSymbol.computeImportableName(firSession) } private sealed class ElementToShorten { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/firUtils.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/firUtils.kt index 36d3fdc62d9..6f09694f2e5 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/firUtils.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/utils/firUtils.kt @@ -5,8 +5,12 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.utils import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.fir.analysis.checkers.classKind +import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration +import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.utils.primaryConstructor import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall @@ -18,6 +22,8 @@ import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedNameError import org.jetbrains.kotlin.fir.resolve.toSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState import org.jetbrains.kotlin.idea.fir.low.level.api.api.withFirDeclaration @@ -28,6 +34,7 @@ import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtSimpleConstantVa import org.jetbrains.kotlin.idea.frontend.api.symbols.markers.KtUnsupportedConstantValue import org.jetbrains.kotlin.idea.frontend.api.types.KtTypeNullability import org.jetbrains.kotlin.idea.references.FirReferenceResolveHelper +import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.* internal fun PsiElement.unwrap(): PsiElement { @@ -104,3 +111,25 @@ internal fun KtTypeNullability.toConeNullability() = when (this) { KtTypeNullability.NON_NULLABLE -> ConeNullability.NOT_NULL KtTypeNullability.UNKNOWN -> ConeNullability.UNKNOWN } + +/** + * @receiver A symbol that needs to be imported + * @param useSiteSession A use-site fir session. + * @return An [FqName] by which this symbol can be imported (if it is possible) + */ +internal fun FirCallableSymbol<*>.computeImportableName(useSiteSession: FirSession): FqName? { + // if classId == null, callable is topLevel + val containingClassId = callableId.classId + ?: return callableId.asSingleFqName() + + if (this is FirConstructorSymbol) return containingClassId.asSingleFqName() + + val containingClass = getContainingClassSymbol(useSiteSession) ?: return null + + // Java static members, enums, and object members can be imported + val canBeImported = containingClass.origin == FirDeclarationOrigin.Java || + containingClass.classKind == ClassKind.ENUM_CLASS || + containingClass.classKind == ClassKind.OBJECT + + return if (canBeImported) callableId.asSingleFqName() else null +}