[FIR IDE] Commonize FirCallableSymbol.computeImportableName function
This commit is contained in:
+2
-27
@@ -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
|
||||
|
||||
+3
-21
@@ -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 {
|
||||
|
||||
+29
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user