[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
|
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.FirElement
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
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.FirFile
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.isOperator
|
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.references.FirResolvedCallableReference
|
||||||
import org.jetbrains.kotlin.fir.symbols.ensureResolved
|
import org.jetbrains.kotlin.fir.symbols.ensureResolved
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
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.FirResolvedTypeRef
|
||||||
import org.jetbrains.kotlin.fir.types.classId
|
import org.jetbrains.kotlin.fir.types.classId
|
||||||
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
|
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.assertIsValidAndAccessible
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.components.KtImportOptimizer
|
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.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.idea.frontend.api.tokens.ValidityToken
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
@@ -184,7 +180,7 @@ internal class KtFirImportOptimizer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun saveCallable(resolvedSymbol: FirCallableSymbol<*>, referencedByName: Name) {
|
private fun saveCallable(resolvedSymbol: FirCallableSymbol<*>, referencedByName: Name) {
|
||||||
val importableName = resolvedSymbol.computeImportableName() ?: return
|
val importableName = resolvedSymbol.computeImportableName(firSession) ?: return
|
||||||
|
|
||||||
saveReferencedItem(importableName, referencedByName)
|
saveReferencedItem(importableName, referencedByName)
|
||||||
}
|
}
|
||||||
@@ -196,27 +192,6 @@ internal class KtFirImportOptimizer(
|
|||||||
|
|
||||||
return usedImports
|
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
|
private val FirQualifiedAccessExpression.isFullyQualified: Boolean
|
||||||
|
|||||||
+3
-21
@@ -10,11 +10,8 @@ import com.intellij.openapi.util.TextRange
|
|||||||
import com.intellij.psi.SmartPsiElementPointer
|
import com.intellij.psi.SmartPsiElementPointer
|
||||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.fir.*
|
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.analysis.checkers.toRegularClassSymbol
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
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.FirRegularClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirResolvedImport
|
import org.jetbrains.kotlin.fir.declarations.FirResolvedImport
|
||||||
import org.jetbrains.kotlin.fir.declarations.builder.buildImport
|
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.components.ShortenOption
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
|
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.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.KtCallableSymbol
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassLikeSymbol
|
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassLikeSymbol
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken
|
import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityToken
|
||||||
@@ -253,24 +251,8 @@ private class FirShorteningContext(val firResolveState: FirModuleResolveState) {
|
|||||||
fun toClassSymbol(classId: ClassId) =
|
fun toClassSymbol(classId: ClassId) =
|
||||||
firSession.symbolProvider.getClassLikeSymbolByFqName(classId)
|
firSession.symbolProvider.getClassLikeSymbolByFqName(classId)
|
||||||
|
|
||||||
fun convertToImportableName(callableSymbol: FirCallableSymbol<*>): FqName? {
|
fun convertToImportableName(callableSymbol: FirCallableSymbol<*>): FqName? =
|
||||||
val callableId = callableSymbol.callableId
|
callableSymbol.computeImportableName(firSession)
|
||||||
|
|
||||||
// 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
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private sealed class ElementToShorten {
|
private sealed class ElementToShorten {
|
||||||
|
|||||||
+29
@@ -5,8 +5,12 @@
|
|||||||
package org.jetbrains.kotlin.idea.frontend.api.fir.utils
|
package org.jetbrains.kotlin.idea.frontend.api.fir.utils
|
||||||
|
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
|
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
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.FirCallableDeclaration
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.utils.primaryConstructor
|
import org.jetbrains.kotlin.fir.declarations.utils.primaryConstructor
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall
|
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.references.FirResolvedNamedReference
|
||||||
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedNameError
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedNameError
|
||||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
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.fir.types.*
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
|
import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveState
|
||||||
import org.jetbrains.kotlin.idea.fir.low.level.api.api.withFirDeclaration
|
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.symbols.markers.KtUnsupportedConstantValue
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.types.KtTypeNullability
|
import org.jetbrains.kotlin.idea.frontend.api.types.KtTypeNullability
|
||||||
import org.jetbrains.kotlin.idea.references.FirReferenceResolveHelper
|
import org.jetbrains.kotlin.idea.references.FirReferenceResolveHelper
|
||||||
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
|
|
||||||
internal fun PsiElement.unwrap(): PsiElement {
|
internal fun PsiElement.unwrap(): PsiElement {
|
||||||
@@ -104,3 +111,25 @@ internal fun KtTypeNullability.toConeNullability() = when (this) {
|
|||||||
KtTypeNullability.NON_NULLABLE -> ConeNullability.NOT_NULL
|
KtTypeNullability.NON_NULLABLE -> ConeNullability.NOT_NULL
|
||||||
KtTypeNullability.UNKNOWN -> ConeNullability.UNKNOWN
|
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