[FIR IDE] Commonize FirCallableSymbol.computeImportableName function

This commit is contained in:
Roman Golyshev
2021-08-31 18:00:17 +03:00
committed by Space
parent 0dfddb8bf2
commit d284ed1c79
3 changed files with 34 additions and 48 deletions
@@ -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
@@ -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 {
@@ -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
}