Analysis API: use FirSymbol in KtFirSymbol's instead of FirDeclaration
^KT-50271 fixed
This commit is contained in:
+16
-16
@@ -189,20 +189,20 @@ private object FirToKtConversionCreator {
|
||||
|
||||
private val typeMapping: Map<KClass<*>, HLFunctionCallConversion> = mapOf(
|
||||
FirBasedSymbol::class to HLFunctionCallConversion(
|
||||
"firSymbolBuilder.buildSymbol({0}.fir)",
|
||||
"firSymbolBuilder.buildSymbol({0})",
|
||||
KtSymbol::class.createType(),
|
||||
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirDeclaration")
|
||||
),
|
||||
FirClass::class to HLFunctionCallConversion(
|
||||
"firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0})",
|
||||
"firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0}.symbol)",
|
||||
KtClassLikeSymbol::class.createType()
|
||||
),
|
||||
FirClassSymbol::class to HLFunctionCallConversion(
|
||||
"firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0}.fir)",
|
||||
"firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0})",
|
||||
KtClassLikeSymbol::class.createType()
|
||||
),
|
||||
FirRegularClass::class to HLFunctionCallConversion(
|
||||
"firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0}) as KtNamedClassOrObjectSymbol",
|
||||
"firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0}.symbol) as KtNamedClassOrObjectSymbol",
|
||||
KtNamedClassOrObjectSymbol::class.createType(),
|
||||
importsToAdd = listOf(
|
||||
"org.jetbrains.kotlin.fir.declarations.FirRegularClass",
|
||||
@@ -226,26 +226,26 @@ private object FirToKtConversionCreator {
|
||||
)
|
||||
),
|
||||
FirValueParameter::class to HLFunctionCallConversion(
|
||||
"firSymbolBuilder.buildSymbol({0})",
|
||||
"firSymbolBuilder.buildSymbol({0}.symbol)",
|
||||
KtSymbol::class.createType(),
|
||||
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirDeclaration")
|
||||
),
|
||||
FirValueParameterSymbol::class to HLFunctionCallConversion(
|
||||
"firSymbolBuilder.buildSymbol({0}.fir)",
|
||||
"firSymbolBuilder.buildSymbol({0})",
|
||||
KtSymbol::class.createType(),
|
||||
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirDeclaration")
|
||||
),
|
||||
FirEnumEntrySymbol::class to HLFunctionCallConversion(
|
||||
"firSymbolBuilder.buildSymbol({0}.fir)",
|
||||
"firSymbolBuilder.buildSymbol({0})",
|
||||
KtSymbol::class.createType(),
|
||||
),
|
||||
FirClassLikeSymbol::class to HLFunctionCallConversion(
|
||||
"firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0}.fir as FirClass)",
|
||||
"firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0})",
|
||||
KtClassLikeSymbol::class.createType(),
|
||||
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirClass")
|
||||
),
|
||||
FirRegularClassSymbol::class to HLFunctionCallConversion(
|
||||
"firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0}.fir)",
|
||||
"firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0})",
|
||||
KtClassLikeSymbol::class.createType(),
|
||||
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirRegularClass")
|
||||
),
|
||||
@@ -260,17 +260,17 @@ private object FirToKtConversionCreator {
|
||||
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration")
|
||||
),
|
||||
FirCallableSymbol::class to HLFunctionCallConversion(
|
||||
"firSymbolBuilder.callableBuilder.buildCallableSymbol({0}.fir)",
|
||||
"firSymbolBuilder.callableBuilder.buildCallableSymbol({0})",
|
||||
KtCallableSymbol::class.createType(),
|
||||
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration")
|
||||
),
|
||||
FirTypeParameterSymbol::class to HLFunctionCallConversion(
|
||||
"firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol({0}.fir)",
|
||||
"firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol({0})",
|
||||
KtTypeParameterSymbol::class.createType(),
|
||||
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirTypeParameter")
|
||||
),
|
||||
FirTypeParameter::class to HLFunctionCallConversion(
|
||||
"firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol({0}.fir)",
|
||||
"firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol({0})",
|
||||
KtTypeParameterSymbol::class.createType(),
|
||||
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirTypeParameter")
|
||||
),
|
||||
@@ -283,17 +283,17 @@ private object FirToKtConversionCreator {
|
||||
KtType::class.createType()
|
||||
),
|
||||
FirPropertySymbol::class to HLFunctionCallConversion(
|
||||
"firSymbolBuilder.variableLikeBuilder.buildVariableSymbol({0}.fir)",
|
||||
"firSymbolBuilder.variableLikeBuilder.buildVariableSymbol({0})",
|
||||
KtVariableSymbol::class.createType(),
|
||||
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirProperty")
|
||||
),
|
||||
FirBackingFieldSymbol::class to HLFunctionCallConversion(
|
||||
"firSymbolBuilder.variableLikeBuilder.buildVariableSymbol({0}.fir.propertySymbol.fir)",
|
||||
"firSymbolBuilder.variableLikeBuilder.buildVariableSymbol({0}.fir.propertySymbol)",
|
||||
KtVariableSymbol::class.createType(),
|
||||
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirProperty")
|
||||
),
|
||||
FirVariableSymbol::class to HLFunctionCallConversion(
|
||||
"firSymbolBuilder.variableLikeBuilder.buildVariableLikeSymbol({0}.fir)",
|
||||
"firSymbolBuilder.variableLikeBuilder.buildVariableLikeSymbol({0})",
|
||||
KtVariableLikeSymbol::class.createType(),
|
||||
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirVariable")
|
||||
),
|
||||
@@ -308,7 +308,7 @@ private object FirToKtConversionCreator {
|
||||
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirSimpleFunction")
|
||||
),
|
||||
FirNamedFunctionSymbol::class to HLFunctionCallConversion(
|
||||
"firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol({0}.fir)",
|
||||
"firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol({0})",
|
||||
KtFunctionLikeSymbol::class.createType(),
|
||||
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirSimpleFunction")
|
||||
),
|
||||
|
||||
+5
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.FirIdeSession
|
||||
import org.jetbrains.kotlin.analysis.providers.createDeclarationProvider
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -157,6 +158,10 @@ private fun FirElement.getAllowedPsi() = when (val source = source) {
|
||||
fun FirElement.findPsi(project: Project): PsiElement? =
|
||||
getAllowedPsi() ?: FirIdeDeserializedDeclarationSourceProvider.findPsi(this, project)
|
||||
|
||||
|
||||
fun FirBasedSymbol<*>.findPsi(): PsiElement? =
|
||||
fir.findPsi(fir.moduleData.session)
|
||||
|
||||
fun FirElement.findPsi(session: FirSession): PsiElement? =
|
||||
findPsi((session as FirIdeSession).project)
|
||||
|
||||
|
||||
+6
-2
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.api.fir
|
||||
import com.intellij.openapi.project.Project
|
||||
import org.jetbrains.kotlin.analysis.api.InvalidWayOfUsingAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirBackingFieldSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.CachingKtAnalysisSessionProvider
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
@@ -23,8 +24,11 @@ class KtFirAnalysisSessionProvider(project: Project) : CachingKtAnalysisSessionP
|
||||
}
|
||||
|
||||
override fun getResolveState(contextSymbol: KtSymbol): FirModuleResolveState {
|
||||
require(contextSymbol is KtFirSymbol<*>)
|
||||
return contextSymbol.firRef.resolveState
|
||||
return when (contextSymbol) {
|
||||
is KtFirSymbol<*> -> contextSymbol.resolveState
|
||||
is KtFirBackingFieldSymbol -> contextSymbol.resolveState
|
||||
else -> error("Invalid symbol ${contextSymbol::class}")
|
||||
}
|
||||
}
|
||||
|
||||
override fun createAnalysisSession(
|
||||
|
||||
+162
-155
@@ -27,7 +27,6 @@ import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirFieldImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirOuterClassTypeParameterRef
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.java.declarations.FirJavaField
|
||||
import org.jetbrains.kotlin.fir.resolve.getContainingClass
|
||||
import org.jetbrains.kotlin.fir.resolve.getSymbolByLookupTag
|
||||
@@ -37,9 +36,9 @@ import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterLookupTag
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ensureResolved
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
||||
import org.jetbrains.kotlin.fir.visitors.FirVisitorVoid
|
||||
@@ -58,10 +57,10 @@ internal class KtSymbolByFirBuilder private constructor(
|
||||
resolveState: FirModuleResolveState,
|
||||
override val token: ValidityToken,
|
||||
val withReadOnlyCaching: Boolean,
|
||||
private val symbolsCache: BuilderCache<FirDeclaration, KtSymbol>,
|
||||
private val extensionReceiverSymbolsCache: BuilderCache<FirCallableDeclaration, KtSymbol>,
|
||||
private val filesCache: BuilderCache<FirFile, KtFileSymbol>,
|
||||
private val backingFieldCache: BuilderCache<FirBackingField, KtBackingFieldSymbol>,
|
||||
private val symbolsCache: BuilderCache<FirBasedSymbol<*>, KtSymbol>,
|
||||
private val extensionReceiverSymbolsCache: BuilderCache<FirCallableSymbol<*>, KtSymbol>,
|
||||
private val filesCache: BuilderCache<FirFileSymbol, KtFileSymbol>,
|
||||
private val backingFieldCache: BuilderCache<FirBackingFieldSymbol, KtBackingFieldSymbol>,
|
||||
private val typesCache: BuilderCache<ConeKotlinType, KtType>,
|
||||
) : ValidityTokenOwner {
|
||||
private val resolveState by weakRef(resolveState)
|
||||
@@ -107,18 +106,22 @@ internal class KtSymbolByFirBuilder private constructor(
|
||||
)
|
||||
}
|
||||
|
||||
fun buildSymbol(fir: FirDeclaration): KtSymbol {
|
||||
return when (fir) {
|
||||
is FirClassLikeDeclaration -> classifierBuilder.buildClassLikeSymbol(fir)
|
||||
is FirTypeParameter -> classifierBuilder.buildTypeParameterSymbol(fir)
|
||||
is FirCallableDeclaration -> callableBuilder.buildCallableSymbol(fir)
|
||||
else -> throwUnexpectedElementError(fir)
|
||||
fun buildSymbol(fir: FirDeclaration): KtSymbol =
|
||||
buildSymbol(fir.symbol)
|
||||
|
||||
fun buildSymbol(firSymbol: FirBasedSymbol<*>): KtSymbol {
|
||||
return when (firSymbol) {
|
||||
is FirClassLikeSymbol<*> -> classifierBuilder.buildClassLikeSymbol(firSymbol)
|
||||
is FirTypeParameterSymbol -> classifierBuilder.buildTypeParameterSymbol(firSymbol)
|
||||
is FirCallableSymbol<*> -> callableBuilder.buildCallableSymbol(firSymbol)
|
||||
else -> throwUnexpectedElementError(firSymbol)
|
||||
}
|
||||
}
|
||||
|
||||
fun buildEnumEntrySymbol(fir: FirEnumEntry) = symbolsCache.cache(fir) { KtFirEnumEntrySymbol(fir, resolveState, token, this) }
|
||||
fun buildEnumEntrySymbol(firSymbol: FirEnumEntrySymbol) =
|
||||
symbolsCache.cache(firSymbol) { KtFirEnumEntrySymbol(firSymbol, resolveState, token, this) }
|
||||
|
||||
fun buildFileSymbol(fir: FirFile) = filesCache.cache(fir) { KtFirFileSymbol(fir, resolveState, token) }
|
||||
fun buildFileSymbol(firSymbol: FirFileSymbol) = filesCache.cache(firSymbol) { KtFirFileSymbol(firSymbol, resolveState, token) }
|
||||
|
||||
private val packageProvider = project.createPackageProvider(GlobalSearchScope.allScope(project))//todo scope
|
||||
|
||||
@@ -138,105 +141,105 @@ internal class KtSymbolByFirBuilder private constructor(
|
||||
|
||||
inner class ClassifierSymbolBuilder {
|
||||
fun buildClassifierSymbol(firSymbol: FirClassifierSymbol<*>): KtClassifierSymbol {
|
||||
return when (val fir = firSymbol.fir) {
|
||||
is FirClassLikeDeclaration -> classifierBuilder.buildClassLikeSymbol(fir)
|
||||
is FirTypeParameter -> buildTypeParameterSymbol(fir)
|
||||
else -> throwUnexpectedElementError(fir)
|
||||
return when (firSymbol) {
|
||||
is FirClassLikeSymbol<*> -> classifierBuilder.buildClassLikeSymbol(firSymbol)
|
||||
is FirTypeParameterSymbol -> buildTypeParameterSymbol(firSymbol)
|
||||
else -> throwUnexpectedElementError(firSymbol)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fun buildClassLikeSymbol(fir: FirClassLikeDeclaration): KtClassLikeSymbol {
|
||||
return when (fir) {
|
||||
is FirClass -> buildClassOrObjectSymbol(fir)
|
||||
is FirTypeAlias -> buildTypeAliasSymbol(fir)
|
||||
else -> throwUnexpectedElementError(fir)
|
||||
fun buildClassLikeSymbol(firSymbol: FirClassLikeSymbol<*>): KtClassLikeSymbol {
|
||||
return when (firSymbol) {
|
||||
is FirClassSymbol<*> -> buildClassOrObjectSymbol(firSymbol)
|
||||
is FirTypeAliasSymbol -> buildTypeAliasSymbol(firSymbol)
|
||||
else -> throwUnexpectedElementError(firSymbol)
|
||||
}
|
||||
}
|
||||
|
||||
fun buildClassOrObjectSymbol(fir: FirClass): KtClassOrObjectSymbol {
|
||||
return when (fir) {
|
||||
is FirAnonymousObject -> buildAnonymousObjectSymbol(fir)
|
||||
is FirRegularClass -> buildNamedClassOrObjectSymbol(fir)
|
||||
else -> throwUnexpectedElementError(fir)
|
||||
fun buildClassOrObjectSymbol(firSymbol: FirClassSymbol<*>): KtClassOrObjectSymbol {
|
||||
return when (firSymbol) {
|
||||
is FirAnonymousObjectSymbol -> buildAnonymousObjectSymbol(firSymbol)
|
||||
is FirRegularClassSymbol -> buildNamedClassOrObjectSymbol(firSymbol)
|
||||
else -> throwUnexpectedElementError(firSymbol)
|
||||
}
|
||||
}
|
||||
|
||||
fun buildNamedClassOrObjectSymbol(fir: FirRegularClass): KtFirNamedClassOrObjectSymbol {
|
||||
return symbolsCache.cache(fir) { KtFirNamedClassOrObjectSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||
fun buildNamedClassOrObjectSymbol(symbol: FirRegularClassSymbol): KtFirNamedClassOrObjectSymbol {
|
||||
return symbolsCache.cache(symbol) { KtFirNamedClassOrObjectSymbol(symbol, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||
}
|
||||
|
||||
fun buildAnonymousObjectSymbol(fir: FirAnonymousObject): KtAnonymousObjectSymbol {
|
||||
return symbolsCache.cache(fir) { KtFirAnonymousObjectSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||
fun buildAnonymousObjectSymbol(symbol: FirAnonymousObjectSymbol): KtAnonymousObjectSymbol {
|
||||
return symbolsCache.cache(symbol) { KtFirAnonymousObjectSymbol(symbol, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||
}
|
||||
|
||||
fun buildTypeAliasSymbol(fir: FirTypeAlias): KtFirTypeAliasSymbol {
|
||||
return symbolsCache.cache(fir) { KtFirTypeAliasSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||
fun buildTypeAliasSymbol(symbol: FirTypeAliasSymbol): KtFirTypeAliasSymbol {
|
||||
return symbolsCache.cache(symbol) { KtFirTypeAliasSymbol(symbol, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||
}
|
||||
|
||||
fun buildTypeParameterSymbol(fir: FirTypeParameter): KtFirTypeParameterSymbol {
|
||||
return symbolsCache.cache(fir) { KtFirTypeParameterSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||
fun buildTypeParameterSymbol(firSymbol: FirTypeParameterSymbol): KtFirTypeParameterSymbol {
|
||||
return symbolsCache.cache(firSymbol) { KtFirTypeParameterSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||
}
|
||||
|
||||
fun buildTypeParameterSymbolByLookupTag(lookupTag: ConeTypeParameterLookupTag): KtTypeParameterSymbol? {
|
||||
val firTypeParameterSymbol = firProvider.getSymbolByLookupTag(lookupTag) as? FirTypeParameterSymbol ?: return null
|
||||
return buildTypeParameterSymbol(firTypeParameterSymbol.fir)
|
||||
return buildTypeParameterSymbol(firTypeParameterSymbol)
|
||||
}
|
||||
|
||||
fun buildClassLikeSymbolByClassId(classId: ClassId): KtClassLikeSymbol? {
|
||||
val firClassLikeSymbol = firProvider.getClassLikeSymbolByClassId(classId) ?: return null
|
||||
return buildClassLikeSymbol(firClassLikeSymbol.fir)
|
||||
return buildClassLikeSymbol(firClassLikeSymbol)
|
||||
}
|
||||
|
||||
fun buildClassLikeSymbolByLookupTag(lookupTag: ConeClassLikeLookupTag): KtClassLikeSymbol? {
|
||||
val firClassLikeSymbol = firProvider.getSymbolByLookupTag(lookupTag) ?: return null
|
||||
return buildClassLikeSymbol(firClassLikeSymbol.fir)
|
||||
return buildClassLikeSymbol(firClassLikeSymbol)
|
||||
}
|
||||
}
|
||||
|
||||
inner class FunctionLikeSymbolBuilder {
|
||||
fun buildFunctionLikeSymbol(fir: FirFunction): KtFunctionLikeSymbol {
|
||||
return when (fir) {
|
||||
is FirSimpleFunction -> {
|
||||
if (fir.origin == FirDeclarationOrigin.SamConstructor) {
|
||||
buildSamConstructorSymbol(fir)
|
||||
fun buildFunctionLikeSymbol(firSymbol: FirFunctionSymbol<*>): KtFunctionLikeSymbol {
|
||||
return when (firSymbol) {
|
||||
is FirNamedFunctionSymbol -> {
|
||||
if (firSymbol.origin == FirDeclarationOrigin.SamConstructor) {
|
||||
buildSamConstructorSymbol(firSymbol)
|
||||
} else {
|
||||
buildFunctionSymbol(fir)
|
||||
buildFunctionSymbol(firSymbol)
|
||||
}
|
||||
}
|
||||
is FirConstructor -> buildConstructorSymbol(fir)
|
||||
is FirAnonymousFunction -> buildAnonymousFunctionSymbol(fir)
|
||||
is FirPropertyAccessor -> buildPropertyAccessorSymbol(fir)
|
||||
else -> throwUnexpectedElementError(fir)
|
||||
is FirConstructorSymbol -> buildConstructorSymbol(firSymbol)
|
||||
is FirAnonymousFunctionSymbol -> buildAnonymousFunctionSymbol(firSymbol)
|
||||
is FirPropertyAccessorSymbol -> buildPropertyAccessorSymbol(firSymbol)
|
||||
else -> throwUnexpectedElementError(firSymbol)
|
||||
}
|
||||
}
|
||||
|
||||
fun buildFunctionLikeSignature(fir: FirFunction): KtFunctionLikeSignature<KtFunctionLikeSymbol> {
|
||||
if (fir is FirSimpleFunction && fir.origin != FirDeclarationOrigin.SamConstructor)
|
||||
fun buildFunctionLikeSignature(fir: FirFunctionSymbol<*>): KtFunctionLikeSignature<KtFunctionLikeSymbol> {
|
||||
if (fir is FirNamedFunctionSymbol && fir.origin != FirDeclarationOrigin.SamConstructor)
|
||||
return buildFunctionSignature(fir)
|
||||
return buildFunctionLikeSymbol(fir).toSignature()
|
||||
}
|
||||
|
||||
fun buildFunctionSymbol(fir: FirSimpleFunction): KtFirFunctionSymbol {
|
||||
fir.unwrapSubstitutionOverrideIfNeeded()?.let {
|
||||
return buildFunctionSymbol(it)
|
||||
fun buildFunctionSymbol(firSymbol: FirNamedFunctionSymbol): KtFirFunctionSymbol {
|
||||
firSymbol.fir.unwrapSubstitutionOverrideIfNeeded()?.let {
|
||||
return buildFunctionSymbol(it.symbol)
|
||||
}
|
||||
if (fir.dispatchReceiverType?.contains { it is ConeStubType } == true) {
|
||||
return buildFunctionSymbol(fir.originalIfFakeOverride() ?: error("Stub type in real declaration"))
|
||||
if (firSymbol.dispatchReceiverType?.contains { it is ConeStubType } == true) {
|
||||
return buildFunctionSymbol(firSymbol.originalIfFakeOverride() ?: error("Stub type in real declaration"))
|
||||
}
|
||||
|
||||
check(fir.origin != FirDeclarationOrigin.SamConstructor)
|
||||
return symbolsCache.cache(fir) { KtFirFunctionSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||
check(firSymbol.origin != FirDeclarationOrigin.SamConstructor)
|
||||
return symbolsCache.cache(firSymbol) { KtFirFunctionSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||
}
|
||||
|
||||
fun buildFunctionSignature(fir: FirSimpleFunction): KtFunctionLikeSignature<KtFirFunctionSymbol> {
|
||||
fir.symbol.ensureResolved(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE)
|
||||
val functionSymbol = buildFunctionSymbol(fir)
|
||||
fun buildFunctionSignature(firSymbol: FirNamedFunctionSymbol): KtFunctionLikeSignature<KtFirFunctionSymbol> {
|
||||
firSymbol.ensureResolved(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE)
|
||||
val functionSymbol = buildFunctionSymbol(firSymbol)
|
||||
return KtFunctionLikeSignature(
|
||||
functionSymbol,
|
||||
typeBuilder.buildKtType(fir.returnTypeRef),
|
||||
fir.receiverTypeRef?.let { typeBuilder.buildKtType(it) },
|
||||
functionSymbol.valueParameters.zip(fir.valueParameters).map { (ktSymbol, fir) ->
|
||||
typeBuilder.buildKtType(firSymbol.resolvedReturnType),
|
||||
firSymbol.resolvedReceiverTypeRef?.let { typeBuilder.buildKtType(it) },
|
||||
functionSymbol.valueParameters.zip(firSymbol.fir.valueParameters).map { (ktSymbol, fir) ->
|
||||
var type = fir.returnTypeRef.coneType
|
||||
if (fir.isVararg) {
|
||||
type = type.arrayElementType() ?: type
|
||||
@@ -246,114 +249,118 @@ internal class KtSymbolByFirBuilder private constructor(
|
||||
)
|
||||
}
|
||||
|
||||
fun buildAnonymousFunctionSymbol(fir: FirAnonymousFunction): KtFirAnonymousFunctionSymbol {
|
||||
return symbolsCache.cache(fir) { KtFirAnonymousFunctionSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||
fun buildAnonymousFunctionSymbol(firSymbol: FirAnonymousFunctionSymbol): KtFirAnonymousFunctionSymbol {
|
||||
return symbolsCache.cache(firSymbol) { KtFirAnonymousFunctionSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||
}
|
||||
|
||||
fun buildConstructorSymbol(fir: FirConstructor): KtFirConstructorSymbol {
|
||||
val originalFir = fir.originalConstructorIfTypeAlias ?: fir
|
||||
return symbolsCache.cache(originalFir) {
|
||||
KtFirConstructorSymbol(originalFir, resolveState, token, this@KtSymbolByFirBuilder)
|
||||
fun buildConstructorSymbol(firSymbol: FirConstructorSymbol): KtFirConstructorSymbol {
|
||||
val originalFirSymbol = firSymbol.fir.originalConstructorIfTypeAlias?.symbol ?: firSymbol
|
||||
return symbolsCache.cache(originalFirSymbol) {
|
||||
KtFirConstructorSymbol(originalFirSymbol, resolveState, token, this@KtSymbolByFirBuilder)
|
||||
}
|
||||
}
|
||||
|
||||
fun buildSamConstructorSymbol(fir: FirSimpleFunction): KtFirSamConstructorSymbol {
|
||||
check(fir.origin == FirDeclarationOrigin.SamConstructor)
|
||||
return symbolsCache.cache(fir) { KtFirSamConstructorSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||
fun buildSamConstructorSymbol(firSymbol: FirNamedFunctionSymbol): KtFirSamConstructorSymbol {
|
||||
check(firSymbol.origin == FirDeclarationOrigin.SamConstructor)
|
||||
return symbolsCache.cache(firSymbol) { KtFirSamConstructorSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||
}
|
||||
|
||||
fun buildPropertyAccessorSymbol(fir: FirPropertyAccessor): KtFunctionLikeSymbol {
|
||||
return symbolsCache.cache(fir) {
|
||||
if (fir.isGetter) {
|
||||
KtFirPropertyGetterSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder)
|
||||
fun buildPropertyAccessorSymbol(firSymbol: FirPropertyAccessorSymbol): KtFunctionLikeSymbol {
|
||||
return symbolsCache.cache(firSymbol) {
|
||||
if (firSymbol.isGetter) {
|
||||
KtFirPropertyGetterSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder)
|
||||
} else {
|
||||
KtFirPropertySetterSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder)
|
||||
KtFirPropertySetterSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inner class VariableLikeSymbolBuilder {
|
||||
fun buildVariableLikeSymbol(fir: FirVariable): KtVariableLikeSymbol {
|
||||
return when (fir) {
|
||||
is FirProperty -> buildVariableSymbol(fir)
|
||||
is FirValueParameter -> buildValueParameterSymbol(fir)
|
||||
is FirField -> buildFieldSymbol(fir)
|
||||
is FirEnumEntry -> buildEnumEntrySymbol(fir) // TODO enum entry should not be callable
|
||||
is FirBackingField -> buildBackingFieldSymbol(fir)
|
||||
fun buildVariableLikeSymbol(firSymbol: FirVariableSymbol<*>): KtVariableLikeSymbol {
|
||||
return when (firSymbol) {
|
||||
is FirPropertySymbol -> buildVariableSymbol(firSymbol)
|
||||
is FirValueParameterSymbol -> buildValueParameterSymbol(firSymbol)
|
||||
is FirFieldSymbol -> buildFieldSymbol(firSymbol)
|
||||
is FirEnumEntrySymbol -> buildEnumEntrySymbol(firSymbol) // TODO enum entry should not be callable
|
||||
is FirBackingFieldSymbol -> buildBackingFieldSymbol(firSymbol)
|
||||
|
||||
is FirErrorProperty -> throwUnexpectedElementError(fir)
|
||||
is FirErrorPropertySymbol -> throwUnexpectedElementError(firSymbol)
|
||||
is FirDelegateFieldSymbol -> throwUnexpectedElementError(firSymbol)
|
||||
}
|
||||
}
|
||||
|
||||
fun buildVariableLikeSignature(fir: FirVariable): KtVariableLikeSignature<KtVariableLikeSymbol> {
|
||||
if (fir is FirProperty && !fir.isLocal && fir !is FirSyntheticProperty) return buildPropertySignature(fir)
|
||||
return buildVariableLikeSymbol(fir).toSignature()
|
||||
fun buildVariableLikeSignature(firSymbol: FirVariableSymbol<*>): KtVariableLikeSignature<KtVariableLikeSymbol> {
|
||||
if (firSymbol is FirPropertySymbol && !firSymbol.isLocal && firSymbol !is FirSyntheticPropertySymbol) {
|
||||
return buildPropertySignature(firSymbol)
|
||||
}
|
||||
return buildVariableLikeSymbol(firSymbol).toSignature()
|
||||
}
|
||||
|
||||
fun buildVariableSymbol(fir: FirProperty): KtVariableSymbol {
|
||||
fun buildVariableSymbol(firSymbol: FirPropertySymbol): KtVariableSymbol {
|
||||
return when {
|
||||
fir.isLocal -> buildLocalVariableSymbol(fir)
|
||||
fir is FirSyntheticProperty -> buildSyntheticJavaPropertySymbol(fir)
|
||||
else -> buildPropertySymbol(fir)
|
||||
firSymbol.isLocal -> buildLocalVariableSymbol(firSymbol)
|
||||
firSymbol is FirSyntheticPropertySymbol -> buildSyntheticJavaPropertySymbol(firSymbol)
|
||||
else -> buildPropertySymbol(firSymbol)
|
||||
}
|
||||
}
|
||||
|
||||
fun buildPropertySymbol(fir: FirProperty): KtVariableSymbol {
|
||||
checkRequirementForBuildingSymbol<KtKotlinPropertySymbol>(fir, !fir.isLocal)
|
||||
checkRequirementForBuildingSymbol<KtKotlinPropertySymbol>(fir, fir !is FirSyntheticProperty)
|
||||
fun buildPropertySymbol(firSymbol: FirPropertySymbol): KtVariableSymbol {
|
||||
checkRequirementForBuildingSymbol<KtKotlinPropertySymbol>(firSymbol, !firSymbol.isLocal)
|
||||
checkRequirementForBuildingSymbol<KtKotlinPropertySymbol>(firSymbol, firSymbol !is FirSyntheticPropertySymbol)
|
||||
checkRequirementForBuildingSymbol<KtKotlinPropertySymbol>(firSymbol, firSymbol !is FirSyntheticPropertySymbol)
|
||||
|
||||
fir.unwrapSubstitutionOverrideIfNeeded()?.let {
|
||||
return buildVariableSymbol(it)
|
||||
firSymbol.fir.unwrapSubstitutionOverrideIfNeeded()?.let {
|
||||
return buildVariableSymbol(it.symbol)
|
||||
}
|
||||
|
||||
return symbolsCache.cache(fir) {
|
||||
KtFirKotlinPropertySymbol(fir, resolveState, token, this@KtSymbolByFirBuilder)
|
||||
return symbolsCache.cache(firSymbol) {
|
||||
KtFirKotlinPropertySymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder)
|
||||
}
|
||||
}
|
||||
|
||||
fun buildPropertySignature(fir: FirProperty): KtVariableLikeSignature<KtVariableSymbol> {
|
||||
fir.symbol.ensureResolved(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE)
|
||||
fun buildPropertySignature(firSymbol: FirPropertySymbol): KtVariableLikeSignature<KtVariableSymbol> {
|
||||
firSymbol.ensureResolved(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE)
|
||||
return KtVariableLikeSignature(
|
||||
buildPropertySymbol(fir),
|
||||
typeBuilder.buildKtType(fir.returnTypeRef),
|
||||
fir.receiverTypeRef?.let { typeBuilder.buildKtType(it) }
|
||||
buildPropertySymbol(firSymbol),
|
||||
typeBuilder.buildKtType(firSymbol.fir.returnTypeRef),
|
||||
firSymbol.resolvedReceiverTypeRef?.let { typeBuilder.buildKtType(it) }
|
||||
)
|
||||
}
|
||||
|
||||
fun buildLocalVariableSymbol(fir: FirProperty): KtFirLocalVariableSymbol {
|
||||
checkRequirementForBuildingSymbol<KtFirLocalVariableSymbol>(fir, fir.isLocal)
|
||||
return symbolsCache.cache(fir) {
|
||||
KtFirLocalVariableSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder)
|
||||
fun buildLocalVariableSymbol(firSymbol: FirPropertySymbol): KtFirLocalVariableSymbol {
|
||||
checkRequirementForBuildingSymbol<KtFirLocalVariableSymbol>(firSymbol, firSymbol.isLocal)
|
||||
return symbolsCache.cache(firSymbol) {
|
||||
KtFirLocalVariableSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder)
|
||||
}
|
||||
}
|
||||
|
||||
fun buildSyntheticJavaPropertySymbol(fir: FirSyntheticProperty): KtFirSyntheticJavaPropertySymbol {
|
||||
return symbolsCache.cache(fir) {
|
||||
KtFirSyntheticJavaPropertySymbol(fir, resolveState, token, this@KtSymbolByFirBuilder)
|
||||
fun buildSyntheticJavaPropertySymbol(firSymbol: FirSyntheticPropertySymbol): KtFirSyntheticJavaPropertySymbol {
|
||||
return symbolsCache.cache(firSymbol) {
|
||||
KtFirSyntheticJavaPropertySymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder)
|
||||
}
|
||||
}
|
||||
|
||||
fun buildValueParameterSymbol(fir: FirValueParameter): KtValueParameterSymbol {
|
||||
return symbolsCache.cache(fir) {
|
||||
KtFirValueParameterSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder)
|
||||
fun buildValueParameterSymbol(firSymbol: FirValueParameterSymbol): KtValueParameterSymbol {
|
||||
return symbolsCache.cache(firSymbol) {
|
||||
KtFirValueParameterSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fun buildFieldSymbol(fir: FirField): KtFirJavaFieldSymbol {
|
||||
checkRequirementForBuildingSymbol<KtFirJavaFieldSymbol>(fir, fir.isJavaFieldOrSubstitutionOverrideOfJavaField())
|
||||
return symbolsCache.cache(fir) { KtFirJavaFieldSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||
fun buildFieldSymbol(firSymbol: FirFieldSymbol): KtFirJavaFieldSymbol {
|
||||
checkRequirementForBuildingSymbol<KtFirJavaFieldSymbol>(firSymbol, firSymbol.fir.isJavaFieldOrSubstitutionOverrideOfJavaField())
|
||||
return symbolsCache.cache(firSymbol) { KtFirJavaFieldSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||
}
|
||||
|
||||
fun buildBackingFieldSymbol(fir: FirBackingField): KtFirBackingFieldSymbol {
|
||||
return backingFieldCache.cache(fir) {
|
||||
KtFirBackingFieldSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder)
|
||||
fun buildBackingFieldSymbol(firSymbol: FirBackingFieldSymbol): KtFirBackingFieldSymbol {
|
||||
return backingFieldCache.cache(firSymbol) {
|
||||
KtFirBackingFieldSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder)
|
||||
}
|
||||
}
|
||||
|
||||
fun buildBackingFieldSymbolByProperty(fir: FirProperty): KtFirBackingFieldSymbol {
|
||||
val backingFieldSymbol = fir.backingField
|
||||
fun buildBackingFieldSymbolByProperty(firSymbol: FirPropertySymbol): KtFirBackingFieldSymbol {
|
||||
val backingFieldSymbol = firSymbol.backingFieldSymbol
|
||||
?: error("FirProperty backingField is null")
|
||||
return buildBackingFieldSymbol(backingFieldSymbol)
|
||||
}
|
||||
@@ -366,53 +373,53 @@ internal class KtSymbolByFirBuilder private constructor(
|
||||
}
|
||||
|
||||
inner class CallableSymbolBuilder {
|
||||
fun buildCallableSymbol(fir: FirCallableDeclaration): KtCallableSymbol {
|
||||
return when (fir) {
|
||||
is FirPropertyAccessor -> buildPropertyAccessorSymbol(fir)
|
||||
is FirFunction -> functionLikeBuilder.buildFunctionLikeSymbol(fir)
|
||||
is FirVariable -> variableLikeBuilder.buildVariableLikeSymbol(fir)
|
||||
else -> throwUnexpectedElementError(fir)
|
||||
fun buildCallableSymbol(firSymbol: FirCallableSymbol<*>): KtCallableSymbol {
|
||||
return when (firSymbol) {
|
||||
is FirPropertyAccessorSymbol -> buildPropertyAccessorSymbol(firSymbol)
|
||||
is FirFunctionSymbol<*> -> functionLikeBuilder.buildFunctionLikeSymbol(firSymbol)
|
||||
is FirVariableSymbol<*> -> variableLikeBuilder.buildVariableLikeSymbol(firSymbol)
|
||||
else -> throwUnexpectedElementError(firSymbol)
|
||||
}
|
||||
}
|
||||
|
||||
fun buildCallableSignature(fir: FirCallableDeclaration): KtSignature<KtCallableSymbol> {
|
||||
return when (fir) {
|
||||
is FirPropertyAccessor -> buildPropertyAccessorSymbol(fir).toSignature()
|
||||
is FirFunction -> functionLikeBuilder.buildFunctionLikeSignature(fir)
|
||||
is FirVariable -> variableLikeBuilder.buildVariableLikeSignature(fir)
|
||||
else -> throwUnexpectedElementError(fir)
|
||||
fun buildCallableSignature(firSymbol: FirCallableSymbol<*>): KtSignature<KtCallableSymbol> {
|
||||
return when (firSymbol) {
|
||||
is FirPropertyAccessorSymbol -> buildPropertyAccessorSymbol(firSymbol).toSignature()
|
||||
is FirFunctionSymbol<*> -> functionLikeBuilder.buildFunctionLikeSignature(firSymbol)
|
||||
is FirVariableSymbol<*> -> variableLikeBuilder.buildVariableLikeSignature(firSymbol)
|
||||
else -> throwUnexpectedElementError(firSymbol)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fun buildPropertyAccessorSymbol(fir: FirPropertyAccessor): KtPropertyAccessorSymbol {
|
||||
fun buildPropertyAccessorSymbol(firSymbol: FirPropertyAccessorSymbol): KtPropertyAccessorSymbol {
|
||||
return when {
|
||||
fir.isGetter -> buildGetterSymbol(fir)
|
||||
else -> buildSetterSymbol(fir)
|
||||
firSymbol.isGetter -> buildGetterSymbol(firSymbol)
|
||||
else -> buildSetterSymbol(firSymbol)
|
||||
}
|
||||
}
|
||||
|
||||
fun buildGetterSymbol(fir: FirPropertyAccessor): KtFirPropertyGetterSymbol {
|
||||
checkRequirementForBuildingSymbol<KtFirPropertyGetterSymbol>(fir, fir.isGetter)
|
||||
return symbolsCache.cache(fir) { KtFirPropertyGetterSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||
fun buildGetterSymbol(firSymbol: FirPropertyAccessorSymbol): KtFirPropertyGetterSymbol {
|
||||
checkRequirementForBuildingSymbol<KtFirPropertyGetterSymbol>(firSymbol, firSymbol.isGetter)
|
||||
return symbolsCache.cache(firSymbol) { KtFirPropertyGetterSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||
}
|
||||
|
||||
fun buildSetterSymbol(fir: FirPropertyAccessor): KtFirPropertySetterSymbol {
|
||||
checkRequirementForBuildingSymbol<KtFirPropertySetterSymbol>(fir, fir.isSetter)
|
||||
return symbolsCache.cache(fir) { KtFirPropertySetterSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||
fun buildSetterSymbol(firSymbol: FirPropertyAccessorSymbol): KtFirPropertySetterSymbol {
|
||||
checkRequirementForBuildingSymbol<KtFirPropertySetterSymbol>(firSymbol, firSymbol.isSetter)
|
||||
return symbolsCache.cache(firSymbol) { KtFirPropertySetterSymbol(firSymbol, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||
}
|
||||
|
||||
fun buildExtensionReceiverSymbol(fir: FirCallableDeclaration): KtReceiverParameterSymbol? {
|
||||
if (fir.receiverTypeRef == null) return null
|
||||
return extensionReceiverSymbolsCache.cache(fir) {
|
||||
KtFirReceiverParameterSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder)
|
||||
fun buildExtensionReceiverSymbol(firCallableSymbol: FirCallableSymbol<*>): KtReceiverParameterSymbol? {
|
||||
if (firCallableSymbol.fir.receiverTypeRef == null) return null
|
||||
return extensionReceiverSymbolsCache.cache(firCallableSymbol) {
|
||||
KtFirReceiverParameterSymbol(firCallableSymbol, resolveState, token, this@KtSymbolByFirBuilder)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inner class AnonymousInitializerBuilder {
|
||||
fun buildClassInitializer(fir: FirAnonymousInitializer): KtClassInitializerSymbol {
|
||||
return symbolsCache.cache(fir) { KtFirClassInitializerSymbol(fir, resolveState, token) }
|
||||
fun buildClassInitializer(firSymbol: FirAnonymousInitializerSymbol): KtClassInitializerSymbol {
|
||||
return symbolsCache.cache(firSymbol) { KtFirClassInitializerSymbol(firSymbol, resolveState, token) }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -516,14 +523,14 @@ internal class KtSymbolByFirBuilder private constructor(
|
||||
|
||||
@OptIn(ExperimentalContracts::class)
|
||||
private inline fun <reified S : KtSymbol> checkRequirementForBuildingSymbol(
|
||||
fir: FirElement,
|
||||
firSymbol: FirBasedSymbol<*>,
|
||||
requirement: Boolean,
|
||||
) {
|
||||
contract {
|
||||
returns() implies requirement
|
||||
}
|
||||
require(requirement) {
|
||||
"Cannot build ${S::class.simpleName} for ${fir.renderWithType(FirRenderer.RenderMode.WithResolvePhases)}"
|
||||
"Cannot build ${S::class.simpleName} for ${firSymbol.fir.renderWithType(FirRenderer.RenderMode.WithResolvePhases)}"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -551,10 +558,10 @@ private class BuilderCache<From, To : Any> private constructor(
|
||||
}
|
||||
|
||||
internal fun FirElement.buildSymbol(builder: KtSymbolByFirBuilder) =
|
||||
(this as? FirDeclaration)?.let(builder::buildSymbol)
|
||||
(this as? FirDeclaration)?.symbol?.let(builder::buildSymbol)
|
||||
|
||||
internal fun FirDeclaration.buildSymbol(builder: KtSymbolByFirBuilder) =
|
||||
builder.buildSymbol(this)
|
||||
builder.buildSymbol(symbol)
|
||||
|
||||
private fun collectReferencedTypeParameters(declaration: FirCallableDeclaration): Set<ConeTypeParameterLookupTag> {
|
||||
val allUsedTypeParameters = mutableSetOf<ConeTypeParameterLookupTag>()
|
||||
|
||||
+20
-24
@@ -8,56 +8,52 @@ package org.jetbrains.kotlin.analysis.api.fir.annotations
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList
|
||||
import org.jetbrains.kotlin.analysis.api.fir.toKtAnnotationApplication
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.FirRefWithValidityCheck
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
|
||||
internal class KtFirAnnotationListForDeclaration private constructor(
|
||||
val firRef: FirRefWithValidityCheck<*>,
|
||||
val firSymbol: FirBasedSymbol<*>,
|
||||
private val useSiteSession: FirSession,
|
||||
override val token: ValidityToken,
|
||||
) : KtAnnotationsList() {
|
||||
override val annotations: List<KtAnnotationApplication>
|
||||
get() = firRef.withFir(FirResolvePhase.ARGUMENTS_OF_ANNOTATIONS) { fir ->
|
||||
fir.annotations.map { annotation ->
|
||||
annotation.toKtAnnotationApplication(useSiteSession)
|
||||
}
|
||||
get() = withValidityAssertion {
|
||||
firSymbol.resolvedAnnotationsWithArguments
|
||||
.map { annotation ->
|
||||
annotation.toKtAnnotationApplication(useSiteSession)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
override fun containsAnnotation(classId: ClassId): Boolean {
|
||||
return firRef.withFirByType(ResolveType.AnnotationType) { fir ->
|
||||
fir.annotations.any { it.fullyExpandedClassId(useSiteSession) == classId }
|
||||
override fun containsAnnotation(classId: ClassId): Boolean = withValidityAssertion {
|
||||
firSymbol.resolvedAnnotationClassIds.contains(classId)
|
||||
}
|
||||
|
||||
override fun annotationsByClassId(classId: ClassId): List<KtAnnotationApplication> = withValidityAssertion {
|
||||
firSymbol.resolvedAnnotationsWithArguments.mapNotNull { annotation ->
|
||||
if (annotation.fullyExpandedClassId(useSiteSession) != classId) return@mapNotNull null
|
||||
annotation.toKtAnnotationApplication(useSiteSession)
|
||||
}
|
||||
}
|
||||
|
||||
override fun annotationsByClassId(classId: ClassId): List<KtAnnotationApplication> =
|
||||
firRef.withFir(FirResolvePhase.ARGUMENTS_OF_ANNOTATIONS) { fir ->
|
||||
fir.annotations.mapNotNull { annotation ->
|
||||
if (annotation.fullyExpandedClassId(useSiteSession) != classId) return@mapNotNull null
|
||||
annotation.toKtAnnotationApplication(useSiteSession)
|
||||
}
|
||||
}
|
||||
|
||||
override val annotationClassIds: Collection<ClassId>
|
||||
get() = firRef.withFirByType(ResolveType.AnnotationType) { fir ->
|
||||
fir.annotations.mapNotNull { it.fullyExpandedClassId(useSiteSession) }
|
||||
}
|
||||
get() = withValidityAssertion { firSymbol.resolvedAnnotationClassIds }
|
||||
|
||||
companion object {
|
||||
fun create(
|
||||
firRef: FirRefWithValidityCheck<*>,
|
||||
firSymbol: FirBasedSymbol<*>,
|
||||
useSiteSession: FirSession,
|
||||
token: ValidityToken,
|
||||
): KtAnnotationsList {
|
||||
return if (firRef.withFir { it.annotations.isEmpty() }) {
|
||||
return if (firSymbol.annotations.isEmpty()) {
|
||||
KtEmptyAnnotationsList(token)
|
||||
} else {
|
||||
KtFirAnnotationListForDeclaration(firRef, useSiteSession, token)
|
||||
KtFirAnnotationListForDeclaration(firSymbol, useSiteSession, token)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+15
-16
@@ -592,7 +592,7 @@ internal class KtFirCallResolver(
|
||||
if (psi == null) {
|
||||
val implicitPartiallyAppliedSymbol = when (val partiallyAppliedSymbol = calleeReference.boundSymbol) {
|
||||
is FirClassSymbol<*> -> partiallyAppliedSymbol.toKtSymbol()
|
||||
is FirCallableSymbol<*> -> firSymbolBuilder.callableBuilder.buildExtensionReceiverSymbol(partiallyAppliedSymbol.fir)
|
||||
is FirCallableSymbol<*> -> firSymbolBuilder.callableBuilder.buildExtensionReceiverSymbol(partiallyAppliedSymbol)
|
||||
?: return null
|
||||
else -> return null
|
||||
}
|
||||
@@ -611,22 +611,22 @@ internal class KtFirCallResolver(
|
||||
|
||||
@OptIn(SymbolInternals::class)
|
||||
private fun FirCallableSymbol<*>.toKtSignature(): KtSignature<KtCallableSymbol> =
|
||||
firSymbolBuilder.callableBuilder.buildCallableSignature(fir)
|
||||
firSymbolBuilder.callableBuilder.buildCallableSignature(this)
|
||||
|
||||
@OptIn(SymbolInternals::class)
|
||||
private fun FirClassLikeSymbol<*>.toKtSymbol(): KtClassLikeSymbol = firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(fir)
|
||||
private fun FirClassLikeSymbol<*>.toKtSymbol(): KtClassLikeSymbol = firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(this)
|
||||
|
||||
@OptIn(SymbolInternals::class)
|
||||
private fun FirNamedFunctionSymbol.toKtSignature(): KtFunctionLikeSignature<KtFunctionSymbol> =
|
||||
firSymbolBuilder.functionLikeBuilder.buildFunctionSignature(fir)
|
||||
firSymbolBuilder.functionLikeBuilder.buildFunctionSignature(this)
|
||||
|
||||
@OptIn(SymbolInternals::class)
|
||||
private fun FirVariableSymbol<*>.toKtSignature(): KtVariableLikeSignature<KtVariableLikeSymbol> =
|
||||
firSymbolBuilder.variableLikeBuilder.buildVariableLikeSignature(fir)
|
||||
firSymbolBuilder.variableLikeBuilder.buildVariableLikeSignature(this)
|
||||
|
||||
@OptIn(SymbolInternals::class)
|
||||
private fun FirValueParameterSymbol.toKtSymbol(): KtValueParameterSymbol =
|
||||
firSymbolBuilder.variableLikeBuilder.buildValueParameterSymbol(fir)
|
||||
firSymbolBuilder.variableLikeBuilder.buildValueParameterSymbol(this)
|
||||
|
||||
private fun FirArrayOfCall.toKtCallInfo(): KtCallInfo? {
|
||||
val arrayOfSymbol = with(analysisSession) {
|
||||
@@ -668,15 +668,15 @@ internal class KtFirCallResolver(
|
||||
}
|
||||
|
||||
private fun FirArrayOfCall.createSubstitutorFromTypeArguments(arrayOfSymbol: KtFirFunctionSymbol): KtSubstitutor {
|
||||
return arrayOfSymbol.firRef.withFir {
|
||||
// No type parameter means this is an arrayOf call of primitives, in which case there is no type arguments
|
||||
val typeParameter = it.typeParameters.singleOrNull() ?: return@withFir null
|
||||
val elementType = typeRef.coneTypeSafe<ConeClassLikeType>()?.arrayElementType() ?: return@withFir null
|
||||
val coneSubstitutor = substitutorByMap(mapOf(typeParameter.symbol to elementType), rootModuleSession)
|
||||
firSymbolBuilder.typeBuilder.buildSubstitutor(coneSubstitutor)
|
||||
} ?: KtSubstitutor.Empty(token)
|
||||
val firSymbol = arrayOfSymbol.firSymbol
|
||||
// No type parameter means this is an arrayOf call of primitives, in which case there is no type arguments
|
||||
val typeParameter = firSymbol.fir.typeParameters.singleOrNull() ?: return KtSubstitutor.Empty(token)
|
||||
val elementType = typeRef.coneTypeSafe<ConeClassLikeType>()?.arrayElementType() ?: return KtSubstitutor.Empty(token)
|
||||
val coneSubstitutor = substitutorByMap(mapOf(typeParameter.symbol to elementType), rootModuleSession)
|
||||
return firSymbolBuilder.typeBuilder.buildSubstitutor(coneSubstitutor)
|
||||
}
|
||||
|
||||
|
||||
private fun FirEqualityOperatorCall.toKtCallInfo(psi: KtElement): KtCallInfo? {
|
||||
val binaryExpression = deparenthesize(psi as? KtExpression) as? KtBinaryExpression ?: return null
|
||||
val leftPsi = binaryExpression.left ?: return null
|
||||
@@ -748,9 +748,8 @@ internal class KtFirCallResolver(
|
||||
substitutor: KtSubstitutor,
|
||||
): LinkedHashMap<KtExpression, KtVariableLikeSignature<KtValueParameterSymbol>> {
|
||||
val ktArgumentMapping = LinkedHashMap<KtExpression, KtVariableLikeSignature<KtValueParameterSymbol>>()
|
||||
val parameterSymbol = arrayOfCallSymbol.firRef.withFir {
|
||||
it.valueParameters.single().symbol.toKtSymbol()
|
||||
}
|
||||
val parameterSymbol = arrayOfCallSymbol.firSymbol.fir.valueParameters.single().symbol.toKtSymbol()
|
||||
|
||||
for (firExpression in argumentList.arguments) {
|
||||
mapArgumentExpressionToParameter(firExpression, parameterSymbol.toSignature(substitutor), ktArgumentMapping)
|
||||
}
|
||||
|
||||
+6
-7
@@ -26,8 +26,9 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirVariable
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.ImplicitReceiverValue
|
||||
import org.jetbrains.kotlin.fir.types.receiverType
|
||||
import org.jetbrains.kotlin.fir.symbols.ensureResolved
|
||||
import org.jetbrains.kotlin.fir.types.coneType
|
||||
import org.jetbrains.kotlin.fir.types.receiverType
|
||||
import org.jetbrains.kotlin.psi.KtExpression
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
|
||||
@@ -45,12 +46,10 @@ internal class KtFirCompletionCandidateChecker(
|
||||
possibleExplicitReceiver: KtExpression?,
|
||||
): KtExtensionApplicabilityResult = withValidityAssertion {
|
||||
require(firSymbolForCandidate is KtFirSymbol<*>)
|
||||
return firSymbolForCandidate.firRef.withFir(
|
||||
phase = FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE
|
||||
) { declaration ->
|
||||
check(declaration is FirCallableDeclaration)
|
||||
checkExtension(declaration, originalFile, nameExpression, possibleExplicitReceiver)
|
||||
}
|
||||
firSymbolForCandidate.firSymbol.ensureResolved(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE)
|
||||
val declaration = firSymbolForCandidate.firSymbol.fir as FirCallableDeclaration
|
||||
checkExtension(declaration, originalFile, nameExpression, possibleExplicitReceiver)
|
||||
|
||||
}
|
||||
|
||||
private fun checkExtension(
|
||||
|
||||
+6
-6
@@ -5,16 +5,16 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.fir.components
|
||||
|
||||
import org.jetbrains.kotlin.diagnostics.WhenMissingCase
|
||||
import org.jetbrains.kotlin.fir.expressions.FirReturnExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirWhenExpression
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.FirWhenExhaustivenessTransformer
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtExpressionInfoProvider
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe
|
||||
import org.jetbrains.kotlin.diagnostics.WhenMissingCase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirErrorFunction
|
||||
import org.jetbrains.kotlin.fir.expressions.FirReturnExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirWhenExpression
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.FirWhenExhaustivenessTransformer
|
||||
import org.jetbrains.kotlin.psi.KtReturnExpression
|
||||
import org.jetbrains.kotlin.psi.KtWhenExpression
|
||||
|
||||
@@ -26,7 +26,7 @@ internal class KtFirExpressionInfoProvider(
|
||||
val fir = returnExpression.getOrBuildFirSafe<FirReturnExpression>(firResolveState) ?: return null
|
||||
val firTargetSymbol = fir.target.labeledElement
|
||||
if (firTargetSymbol is FirErrorFunction) return null
|
||||
return firSymbolBuilder.callableBuilder.buildCallableSymbol(firTargetSymbol)
|
||||
return firSymbolBuilder.callableBuilder.buildCallableSymbol(firTargetSymbol.symbol)
|
||||
}
|
||||
|
||||
override fun getWhenMissingCases(whenExpression: KtWhenExpression): List<WhenMissingCase> {
|
||||
|
||||
+3
-5
@@ -5,8 +5,6 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.fir.components
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.fir.declarations.getSealedClassInheritors
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtInheritorsProvider
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirNamedClassOrObjectSymbol
|
||||
@@ -15,6 +13,8 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.fir.declarations.getSealedClassInheritors
|
||||
|
||||
internal class KtFirInheritorsProvider(
|
||||
override val analysisSession: KtFirAnalysisSession,
|
||||
@@ -26,9 +26,7 @@ internal class KtFirInheritorsProvider(
|
||||
require(classSymbol.modality == Modality.SEALED)
|
||||
require(classSymbol is KtFirNamedClassOrObjectSymbol)
|
||||
|
||||
val inheritorClassIds = classSymbol.firRef.withFir { fir ->
|
||||
fir.getSealedClassInheritors(analysisSession.rootModuleSession)
|
||||
}
|
||||
val inheritorClassIds = classSymbol.firSymbol.fir.getSealedClassInheritors(analysisSession.rootModuleSession)
|
||||
|
||||
with(analysisSession) {
|
||||
inheritorClassIds.mapNotNull { it.getCorrespondingToplevelClassOrObjectSymbol() as? KtNamedClassOrObjectSymbol }
|
||||
|
||||
+2
-2
@@ -88,8 +88,8 @@ internal class KtFirReferenceShortener(
|
||||
context,
|
||||
towerContext,
|
||||
selection,
|
||||
classShortenOption = { classShortenOption(analysisSession.firSymbolBuilder.buildSymbol(it.fir) as KtClassLikeSymbol) },
|
||||
callableShortenOption = { callableShortenOption(analysisSession.firSymbolBuilder.buildSymbol(it.fir) as KtCallableSymbol) },
|
||||
classShortenOption = { classShortenOption(analysisSession.firSymbolBuilder.buildSymbol(it) as KtClassLikeSymbol) },
|
||||
callableShortenOption = { callableShortenOption(analysisSession.firSymbolBuilder.buildSymbol(it) as KtCallableSymbol) },
|
||||
firResolveState,
|
||||
)
|
||||
firDeclaration.accept(collector)
|
||||
|
||||
+7
-7
@@ -5,6 +5,12 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.fir.components
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtSamResolver
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.getClassLikeSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSamConstructorSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
@@ -13,12 +19,6 @@ import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirAbstractBodyResolveTransformer
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirBodyResolveTransformer
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtSamResolver
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.getClassLikeSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSamConstructorSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
|
||||
internal class KtFirSamResolver(
|
||||
override val analysisSession: KtFirAnalysisSession,
|
||||
@@ -30,7 +30,7 @@ internal class KtFirSamResolver(
|
||||
val owner = analysisSession.getClassLikeSymbol(classId) as? FirRegularClass ?: return null
|
||||
val resolver = LocalSamResolver(analysisSession.rootModuleSession)
|
||||
return resolver.getSamConstructor(owner)?.let {
|
||||
analysisSession.firSymbolBuilder.functionLikeBuilder.buildSamConstructorSymbol(it)
|
||||
analysisSession.firSymbolBuilder.functionLikeBuilder.buildSamConstructorSymbol(it.symbol)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+36
-23
@@ -7,18 +7,6 @@ package org.jetbrains.kotlin.analysis.api.fir.components
|
||||
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.psi.search.GlobalSearchScope
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnonymousObjectExpression
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertiesScope
|
||||
import org.jetbrains.kotlin.fir.resolve.scope
|
||||
import org.jetbrains.kotlin.fir.scopes.*
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.*
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LowLevelFirApiFacadeForResolveOnAir.getTowerContextProvider
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getElementTextInContext
|
||||
import org.jetbrains.kotlin.analysis.api.ValidityTokenOwner
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtImplicitReceiver
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtScopeContext
|
||||
@@ -26,19 +14,35 @@ import org.jetbrains.kotlin.analysis.api.components.KtScopeProvider
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.scopes.*
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.*
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirAnonymousObjectSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirEnumEntrySymbol
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirFileSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirNamedClassOrObjectSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.fir.types.KtFirType
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.weakRef
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.scopes.KtEmptyScope
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.scopes.KtCompositeScope
|
||||
import org.jetbrains.kotlin.analysis.api.scopes.*
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.scopes.KtEmptyScope
|
||||
import org.jetbrains.kotlin.analysis.api.scopes.KtScope
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithMembers
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.LowLevelFirApiFacadeForResolveOnAir.getTowerContextProvider
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getElementTextInContext
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.delegateFields
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnonymousObjectExpression
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertiesScope
|
||||
import org.jetbrains.kotlin.fir.resolve.scope
|
||||
import org.jetbrains.kotlin.fir.scopes.*
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.*
|
||||
import org.jetbrains.kotlin.fir.symbols.ensureResolved
|
||||
import org.jetbrains.kotlin.psi.KtElement
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
import java.util.*
|
||||
@@ -60,15 +64,24 @@ internal class KtFirScopeProvider(
|
||||
private val fileScopeCache = IdentityHashMap<KtFileSymbol, KtScope>()
|
||||
private val packageMemberScopeCache = IdentityHashMap<KtPackageSymbol, KtScope>()
|
||||
|
||||
private inline fun <T> KtSymbolWithMembers.withFirForScope(crossinline body: (FirClass) -> T): T? = when (this) {
|
||||
is KtFirNamedClassOrObjectSymbol -> firRef.withFir(FirResolvePhase.TYPES, body)
|
||||
is KtFirAnonymousObjectSymbol -> firRef.withFir(FirResolvePhase.TYPES, body)
|
||||
is KtFirEnumEntrySymbol -> firRef.withFir(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) {
|
||||
val initializer = it.initializer
|
||||
check(initializer is FirAnonymousObjectExpression) { "Unexpected enum entry initializer: ${initializer?.javaClass}" }
|
||||
body(initializer.anonymousObject)
|
||||
private inline fun <T> KtSymbolWithMembers.withFirForScope(crossinline body: (FirClass) -> T): T? {
|
||||
when (this) {
|
||||
is KtFirNamedClassOrObjectSymbol -> {
|
||||
firSymbol.ensureResolved(FirResolvePhase.TYPES)
|
||||
return body(firSymbol.fir)
|
||||
}
|
||||
is KtFirAnonymousObjectSymbol -> {
|
||||
firSymbol.ensureResolved(FirResolvePhase.TYPES)
|
||||
return body(firSymbol.fir)
|
||||
}
|
||||
is KtFirEnumEntrySymbol -> {
|
||||
firSymbol.ensureResolved(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE)
|
||||
val initializer = firSymbol.fir.initializer
|
||||
check(initializer is FirAnonymousObjectExpression) { "Unexpected enum entry initializer: ${initializer?.javaClass}" }
|
||||
return body(initializer.anonymousObject)
|
||||
}
|
||||
else -> error { "Unknown KtSymbolWithDeclarations implementation ${this::class.qualifiedName}" }
|
||||
}
|
||||
else -> error { "Unknown KtSymbolWithDeclarations implementation ${this::class.qualifiedName}" }
|
||||
}
|
||||
|
||||
override fun getMemberScope(classSymbol: KtSymbolWithMembers): KtScope = withValidityAssertion {
|
||||
|
||||
+7
-14
@@ -19,13 +19,8 @@ import org.jetbrains.kotlin.analysis.api.symbols.*
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithKind
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.psi
|
||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||
import org.jetbrains.kotlin.psi.KtDestructuringDeclaration
|
||||
import org.jetbrains.kotlin.psi.KtFunctionLiteral
|
||||
import org.jetbrains.kotlin.psi.KtPrimaryConstructor
|
||||
import org.jetbrains.kotlin.psi.KtProperty
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
|
||||
internal class KtFirSymbolContainingDeclarationProvider(
|
||||
override val analysisSession: KtFirAnalysisSession,
|
||||
@@ -35,10 +30,9 @@ internal class KtFirSymbolContainingDeclarationProvider(
|
||||
assertIsValidAndAccessible()
|
||||
|
||||
if (symbol is KtReceiverParameterSymbol) {
|
||||
return (symbol as KtFirReceiverParameterSymbol).firRef.withFir {
|
||||
firSymbolBuilder.buildSymbol(it) as KtSymbolWithKind
|
||||
}
|
||||
return firSymbolBuilder.buildSymbol((symbol as KtFirReceiverParameterSymbol).firSymbol) as KtSymbolWithKind
|
||||
}
|
||||
|
||||
if (symbol is KtPackageSymbol) return null
|
||||
if (symbol is KtSymbolWithKind && symbol.symbolKind == KtSymbolKind.TOP_LEVEL) return null
|
||||
if (symbol is KtCallableSymbol) {
|
||||
@@ -51,11 +45,10 @@ internal class KtFirSymbolContainingDeclarationProvider(
|
||||
}
|
||||
return when (symbol) {
|
||||
is KtFirTypeParameterSymbol -> {
|
||||
symbol.firRef.withFir { fir ->
|
||||
fir.containingDeclarationSymbol?.fir?.let { containingDeclaration ->
|
||||
firSymbolBuilder.buildSymbol(containingDeclaration) as KtSymbolWithKind
|
||||
}
|
||||
symbol.firSymbol.containingDeclarationSymbol?.let { containingDeclaration ->
|
||||
firSymbolBuilder.buildSymbol(containingDeclaration) as KtSymbolWithKind
|
||||
}
|
||||
|
||||
}
|
||||
is KtSymbolWithKind -> when (symbol.origin) {
|
||||
KtSymbolOrigin.SOURCE, KtSymbolOrigin.SOURCE_MEMBER_GENERATED ->
|
||||
@@ -90,7 +83,7 @@ internal class KtFirSymbolContainingDeclarationProvider(
|
||||
}
|
||||
|
||||
private fun getContainingPsi(symbol: KtFirSymbol<*>): KtDeclaration {
|
||||
val source = symbol.firRef.withFir(action = FirDeclaration::source)
|
||||
val source = symbol.firSymbol.source
|
||||
val thisSource = when (source?.kind) {
|
||||
null -> error("PSI should present for declaration built by Kotlin code")
|
||||
KtFakeSourceElementKind.ImplicitConstructor ->
|
||||
|
||||
+27
-27
@@ -16,7 +16,6 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType
|
||||
import org.jetbrains.kotlin.fir.analysis.checkers.toRegularClassSymbol
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.superConeTypes
|
||||
@@ -25,6 +24,7 @@ import org.jetbrains.kotlin.fir.scopes.*
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ensureResolved
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirIntersectionOverrideFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirIntersectionOverridePropertySymbol
|
||||
|
||||
@@ -43,7 +43,7 @@ internal class KtFirSymbolDeclarationOverridesProvider(
|
||||
overriddenDeclaration.symbol.collectIntersectionOverridesSymbolsTo(overriddenElement)
|
||||
}
|
||||
}
|
||||
return overriddenElement.map { analysisSession.firSymbolBuilder.callableBuilder.buildCallableSymbol(it.fir) }
|
||||
return overriddenElement.map { analysisSession.firSymbolBuilder.callableBuilder.buildCallableSymbol(it) }
|
||||
}
|
||||
|
||||
override fun <T : KtSymbol> getDirectlyOverriddenSymbols(callableSymbol: T): List<KtCallableSymbol> {
|
||||
@@ -54,7 +54,7 @@ internal class KtFirSymbolDeclarationOverridesProvider(
|
||||
overriddenDeclaration.symbol.collectIntersectionOverridesSymbolsTo(overriddenElement)
|
||||
}
|
||||
}
|
||||
return overriddenElement.map { analysisSession.firSymbolBuilder.callableBuilder.buildCallableSymbol(it.fir) }
|
||||
return overriddenElement.map { analysisSession.firSymbolBuilder.callableBuilder.buildCallableSymbol(it) }
|
||||
}
|
||||
|
||||
private fun FirTypeScope.processCallableByName(declaration: FirDeclaration) = when (declaration) {
|
||||
@@ -109,21 +109,21 @@ internal class KtFirSymbolDeclarationOverridesProvider(
|
||||
}
|
||||
|
||||
private inline fun processOverrides(
|
||||
containingDeclaration: KtFirSymbol<FirClass>,
|
||||
containingDeclaration: KtFirSymbol<FirClassSymbol<*>>,
|
||||
callableSymbol: KtFirSymbol<*>,
|
||||
crossinline process: (FirTypeScope, FirDeclaration) -> Unit
|
||||
) {
|
||||
containingDeclaration.firRef.withFir(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE) { firContainer ->
|
||||
callableSymbol.firRef.withFirUnsafe { firCallableDeclaration ->
|
||||
val firTypeScope = firContainer.unsubstitutedScope(
|
||||
firContainer.moduleData.session,
|
||||
ScopeSession(),
|
||||
withForcedTypeCalculator = false
|
||||
)
|
||||
firTypeScope.processCallableByName(firCallableDeclaration)
|
||||
process(firTypeScope, firCallableDeclaration)
|
||||
}
|
||||
}
|
||||
containingDeclaration.firSymbol.ensureResolved(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE)
|
||||
val firContainer = containingDeclaration.firSymbol.fir
|
||||
val firCallableDeclaration = callableSymbol.firSymbol.fir
|
||||
|
||||
val firTypeScope = firContainer.unsubstitutedScope(
|
||||
firContainer.moduleData.session,
|
||||
ScopeSession(),
|
||||
withForcedTypeCalculator = false
|
||||
)
|
||||
firTypeScope.processCallableByName(firCallableDeclaration)
|
||||
process(firTypeScope, firCallableDeclaration)
|
||||
}
|
||||
|
||||
private fun FirCallableSymbol<*>.collectIntersectionOverridesSymbolsTo(to: MutableCollection<FirCallableSymbol<*>>) {
|
||||
@@ -153,13 +153,14 @@ internal class KtFirSymbolDeclarationOverridesProvider(
|
||||
require(superClass is KtFirSymbol<*>)
|
||||
|
||||
if (subClass == superClass) return false
|
||||
return subClass.firRef.withFirByType(ResolveType.ClassSuperTypes) { subClassFir ->
|
||||
check(subClassFir is FirClass)
|
||||
superClass.firRef.withFir { superClassFir ->
|
||||
check(superClassFir is FirClass)
|
||||
isSubClassOf(subClassFir, superClassFir, checkDeep)
|
||||
}
|
||||
}
|
||||
subClass.firSymbol.ensureResolved(FirResolvePhase.SUPER_TYPES)
|
||||
return isSubClassOf(
|
||||
subClass = subClass.firSymbol.fir as FirClass,
|
||||
superClass = superClass.firSymbol.fir as FirClass,
|
||||
checkDeep
|
||||
)
|
||||
|
||||
|
||||
}
|
||||
|
||||
private fun isSubClassOf(subClass: FirClass, superClass: FirClass, checkDeep: Boolean): Boolean {
|
||||
@@ -176,11 +177,10 @@ internal class KtFirSymbolDeclarationOverridesProvider(
|
||||
override fun getIntersectionOverriddenSymbols(symbol: KtCallableSymbol): Collection<KtCallableSymbol> {
|
||||
require(symbol is KtFirSymbol<*>)
|
||||
if (symbol.origin != KtSymbolOrigin.INTERSECTION_OVERRIDE) return emptyList()
|
||||
return symbol.firRef.withFir { fir ->
|
||||
val firSymbol = fir.symbol
|
||||
firSymbol.getIntersectionOverriddenSymbols()
|
||||
.map { analysisSession.firSymbolBuilder.callableBuilder.buildCallableSymbol(it.fir) }
|
||||
}
|
||||
return symbol.firSymbol
|
||||
.getIntersectionOverriddenSymbols()
|
||||
.map { analysisSession.firSymbolBuilder.callableBuilder.buildCallableSymbol(it) }
|
||||
|
||||
}
|
||||
|
||||
private fun FirBasedSymbol<*>.getIntersectionOverriddenSymbols(): Collection<FirCallableSymbol<*>> {
|
||||
|
||||
+3
-3
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtDeclarationSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.symbols.ensureResolved
|
||||
|
||||
internal class KtFirSymbolDeclarationRendererProvider(
|
||||
override val analysisSession: KtFirAnalysisSession,
|
||||
@@ -30,8 +31,7 @@ internal class KtFirSymbolDeclarationRendererProvider(
|
||||
|
||||
override fun renderDeclaration(symbol: KtDeclarationSymbol, options: KtDeclarationRendererOptions): String {
|
||||
require(symbol is KtFirSymbol<*>)
|
||||
return symbol.firRef.withFir(FirResolvePhase.BODY_RESOLVE) { fir ->
|
||||
FirIdeRenderer.render(fir, options, fir.moduleData.session)
|
||||
}
|
||||
symbol.firSymbol.ensureResolved(FirResolvePhase.BODY_RESOLVE)
|
||||
return FirIdeRenderer.render(symbol.firSymbol.fir, options, symbol.firSymbol.fir.moduleData.session)
|
||||
}
|
||||
}
|
||||
|
||||
+26
-29
@@ -5,12 +5,6 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.fir.components
|
||||
|
||||
import org.jetbrains.kotlin.resolve.deprecation.DeprecationInfo
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.getDeprecationForCallSite
|
||||
import org.jetbrains.kotlin.fir.declarations.getJvmNameFromAnnotation
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtSymbolInfoProvider
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirBackingFieldSymbol
|
||||
@@ -20,8 +14,14 @@ import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSyntheticJavaPropertyS
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.getDeprecationForCallSite
|
||||
import org.jetbrains.kotlin.fir.declarations.getJvmNameFromAnnotation
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.load.java.JvmAbi
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.deprecation.DeprecationInfo
|
||||
|
||||
internal class KtFirSymbolInfoProvider(
|
||||
override val analysisSession: KtFirAnalysisSession,
|
||||
@@ -30,48 +30,45 @@ internal class KtFirSymbolInfoProvider(
|
||||
override fun getDeprecation(symbol: KtSymbol): DeprecationInfo? {
|
||||
if (symbol is KtFirBackingFieldSymbol || symbol is KtFirPackageSymbol) return null
|
||||
require(symbol is KtFirSymbol<*>)
|
||||
return symbol.firRef.withFir {
|
||||
val firSymbol = it.symbol
|
||||
if (firSymbol is FirPropertySymbol) {
|
||||
return when (val firSymbol = symbol.firSymbol) {
|
||||
is FirPropertySymbol -> {
|
||||
firSymbol.getDeprecationForCallSite(AnnotationUseSiteTarget.PROPERTY)
|
||||
} else {
|
||||
}
|
||||
else -> {
|
||||
firSymbol.getDeprecationForCallSite()
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
override fun getDeprecation(symbol: KtSymbol, annotationUseSiteTarget: AnnotationUseSiteTarget?): DeprecationInfo? {
|
||||
require(symbol is KtFirSymbol<*>)
|
||||
return symbol.firRef.withFir { firDeclaration ->
|
||||
if (annotationUseSiteTarget != null) {
|
||||
firDeclaration.symbol.getDeprecationForCallSite(annotationUseSiteTarget)
|
||||
} else {
|
||||
firDeclaration.symbol.getDeprecationForCallSite()
|
||||
}
|
||||
return if (annotationUseSiteTarget != null) {
|
||||
symbol.firSymbol.getDeprecationForCallSite(annotationUseSiteTarget)
|
||||
} else {
|
||||
symbol.firSymbol.getDeprecationForCallSite()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
override fun getGetterDeprecation(symbol: KtPropertySymbol): DeprecationInfo? {
|
||||
require(symbol is KtFirSymbol<*>)
|
||||
return symbol.firRef.withFir {
|
||||
it.symbol.getDeprecationForCallSite(AnnotationUseSiteTarget.PROPERTY_GETTER, AnnotationUseSiteTarget.PROPERTY)
|
||||
}
|
||||
return symbol.firSymbol.getDeprecationForCallSite(AnnotationUseSiteTarget.PROPERTY_GETTER, AnnotationUseSiteTarget.PROPERTY)
|
||||
|
||||
}
|
||||
|
||||
override fun getSetterDeprecation(symbol: KtPropertySymbol): DeprecationInfo? {
|
||||
require(symbol is KtFirSymbol<*>)
|
||||
return symbol.firRef.withFir {
|
||||
it.symbol.getDeprecationForCallSite(AnnotationUseSiteTarget.PROPERTY_SETTER, AnnotationUseSiteTarget.PROPERTY)
|
||||
}
|
||||
return symbol.firSymbol.getDeprecationForCallSite(AnnotationUseSiteTarget.PROPERTY_SETTER, AnnotationUseSiteTarget.PROPERTY)
|
||||
}
|
||||
|
||||
override fun getJavaGetterName(symbol: KtPropertySymbol): Name {
|
||||
require(symbol is KtFirSymbol<*>)
|
||||
if (symbol is KtFirSyntheticJavaPropertySymbol) {
|
||||
return symbol.firRef.withFir { it.getter.delegate.name }
|
||||
return symbol.javaGetterSymbol.name
|
||||
}
|
||||
val jvmName = symbol.firRef.withFir {
|
||||
val firProperty = it as? FirProperty ?: return@withFir null
|
||||
val jvmName = run {
|
||||
val firProperty = symbol.firSymbol.fir as? FirProperty ?: return@run null
|
||||
firProperty.getJvmNameFromAnnotation(AnnotationUseSiteTarget.PROPERTY_GETTER) ?: firProperty.getter?.getJvmNameFromAnnotation()
|
||||
}
|
||||
return Name.identifier(jvmName ?: JvmAbi.getterName(symbol.name.identifier))
|
||||
@@ -80,13 +77,13 @@ internal class KtFirSymbolInfoProvider(
|
||||
override fun getJavaSetterName(symbol: KtPropertySymbol): Name? {
|
||||
require(symbol is KtFirSymbol<*>)
|
||||
if (symbol is KtFirSyntheticJavaPropertySymbol) {
|
||||
symbol.firRef.withFir { it.setter?.delegate?.name }
|
||||
return symbol.javaSetterSymbol?.name
|
||||
}
|
||||
return if (symbol.isVal) null
|
||||
else {
|
||||
val jvmName = symbol.firRef.withFir {
|
||||
val firProperty = it as? FirProperty ?: return@withFir null
|
||||
firProperty.getJvmNameFromAnnotation(AnnotationUseSiteTarget.PROPERTY_SETTER)
|
||||
val jvmName = run {
|
||||
val firProperty = symbol.firSymbol.fir as? FirProperty ?: return@run null
|
||||
firProperty.getJvmNameFromAnnotation(AnnotationUseSiteTarget.PROPERTY_GETTER)
|
||||
?: firProperty.setter?.getJvmNameFromAnnotation()
|
||||
}
|
||||
Name.identifier(jvmName ?: JvmAbi.setterName(symbol.name.identifier))
|
||||
|
||||
+4
-4
@@ -10,15 +10,16 @@ import org.jetbrains.kotlin.analysis.api.components.KtTypeCreator
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtTypeParameterTypeBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtClassType
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtTypeParameterType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedSymbolError
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.toConeType
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassErrorType
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||
import org.jetbrains.kotlin.fir.types.typeContext
|
||||
@@ -38,7 +39,7 @@ internal class KtFirTypeCreator(
|
||||
is KtClassTypeBuilder.BySymbol -> {
|
||||
val symbol = builder.symbol
|
||||
check(symbol is KtFirSymbol<*>)
|
||||
symbol.firRef.withFir { (it as FirClassLikeDeclaration).symbol.toLookupTag() }
|
||||
(symbol.firSymbol as FirClassLikeSymbol<*>).toLookupTag()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,8 +57,7 @@ internal class KtFirTypeCreator(
|
||||
val coneType = when (builder) {
|
||||
is KtTypeParameterTypeBuilder.BySymbol -> {
|
||||
val symbol = builder.symbol
|
||||
check(symbol is KtFirSymbol<*>)
|
||||
symbol.firRef.withFir { (it as FirTypeParameter).toConeType() }
|
||||
(symbol as KtFirTypeParameterSymbol).firSymbol.toConeType()
|
||||
}
|
||||
}
|
||||
return coneType.asKtType() as KtTypeParameterType
|
||||
|
||||
+15
-19
@@ -10,12 +10,12 @@ import org.jetbrains.kotlin.analysis.api.components.KtTypeProvider
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirNamedClassOrObjectSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.dispatchReceiverType
|
||||
import org.jetbrains.kotlin.analysis.api.fir.types.KtFirType
|
||||
import org.jetbrains.kotlin.analysis.api.fir.types.PublicTypeApproximator
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.toConeNullability
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtPossibleMemberSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
|
||||
@@ -37,10 +37,8 @@ import org.jetbrains.kotlin.fir.expressions.FirGetClassCall
|
||||
import org.jetbrains.kotlin.fir.render
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
|
||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ensureResolved
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||
@@ -72,13 +70,14 @@ internal class KtFirTypeProvider(
|
||||
|
||||
override fun buildSelfClassType(symbol: KtNamedClassOrObjectSymbol): KtType {
|
||||
require(symbol is KtFirNamedClassOrObjectSymbol)
|
||||
val type = symbol.firRef.withFir(FirResolvePhase.SUPER_TYPES) { firClass ->
|
||||
ConeClassLikeTypeImpl(
|
||||
firClass.symbol.toLookupTag(),
|
||||
firClass.typeParameters.map { ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), isNullable = false) }.toTypedArray(),
|
||||
isNullable = false
|
||||
)
|
||||
}
|
||||
symbol.firSymbol.ensureResolved(FirResolvePhase.SUPER_TYPES)
|
||||
val firClass = symbol.firSymbol.fir
|
||||
val type = ConeClassLikeTypeImpl(
|
||||
firClass.symbol.toLookupTag(),
|
||||
firClass.typeParameters.map { ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), isNullable = false) }.toTypedArray(),
|
||||
isNullable = false
|
||||
)
|
||||
|
||||
return type.asKtType()
|
||||
}
|
||||
|
||||
@@ -190,14 +189,11 @@ internal class KtFirTypeProvider(
|
||||
|
||||
override fun getDispatchReceiverType(symbol: KtCallableSymbol): KtType? {
|
||||
require(symbol is KtFirSymbol<*>)
|
||||
|
||||
return symbol.firRef.withFir { declaration ->
|
||||
check(declaration is FirCallableDeclaration) {
|
||||
"Fir declaration should be FirCallableDeclaration; instead it was ${declaration::class}"
|
||||
}
|
||||
|
||||
declaration.dispatchReceiverType?.asKtType()
|
||||
val firSymbol = symbol.firSymbol
|
||||
check(firSymbol is FirCallableSymbol<*>) {
|
||||
"Fir declaration should be FirCallableDeclaration; instead it was ${firSymbol::class}"
|
||||
}
|
||||
return firSymbol.dispatchReceiverType(analysisSession.firSymbolBuilder)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+24
-30
@@ -6,13 +6,6 @@
|
||||
package org.jetbrains.kotlin.analysis.api.fir.components
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.ExpressionReceiverValue
|
||||
import org.jetbrains.kotlin.fir.visibilityChecker
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.collectDesignation
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe
|
||||
import org.jetbrains.kotlin.analysis.api.components.KtVisibilityChecker
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirFileSymbol
|
||||
@@ -21,6 +14,13 @@ import org.jetbrains.kotlin.analysis.api.impl.barebone.parentsOfType
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithVisibility
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.collectDesignation
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe
|
||||
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.ExpressionReceiverValue
|
||||
import org.jetbrains.kotlin.fir.visibilityChecker
|
||||
import org.jetbrains.kotlin.psi.KtCallableDeclaration
|
||||
import org.jetbrains.kotlin.psi.KtExpression
|
||||
import org.jetbrains.kotlin.psi.KtNamedFunction
|
||||
@@ -42,32 +42,26 @@ internal class KtFirVisibilityChecker(
|
||||
require(useSiteFile is KtFirFileSymbol)
|
||||
|
||||
val nonLocalContainingDeclaration = findContainingNonLocalDeclaration(position)
|
||||
val useSiteFirFile = useSiteFile.firSymbol.fir
|
||||
val containers = nonLocalContainingDeclaration
|
||||
?.getOrBuildFirSafe<FirCallableDeclaration>(analysisSession.firResolveState)
|
||||
?.collectDesignation()
|
||||
?.path
|
||||
.orEmpty()
|
||||
|
||||
return useSiteFile.firRef.withFir { useSiteFirFile ->
|
||||
val containers = nonLocalContainingDeclaration
|
||||
?.getOrBuildFirSafe<FirCallableDeclaration>(analysisSession.firResolveState)
|
||||
?.collectDesignation()
|
||||
?.path
|
||||
.orEmpty()
|
||||
val explicitDispatchReceiver = receiverExpression
|
||||
?.getOrBuildFirSafe<FirExpression>(analysisSession.firResolveState)
|
||||
?.let { ExpressionReceiverValue(it) }
|
||||
|
||||
val explicitDispatchReceiver = receiverExpression
|
||||
?.getOrBuildFirSafe<FirExpression>(analysisSession.firResolveState)
|
||||
?.let { ExpressionReceiverValue(it) }
|
||||
val candidateFirSymbol = candidateSymbol.firSymbol.fir as FirMemberDeclaration
|
||||
|
||||
candidateSymbol.firRef.withFir { candidateFirSymbol ->
|
||||
require(candidateFirSymbol is FirMemberDeclaration) {
|
||||
"$candidateFirSymbol must be a FirStatusOwner and FirSymbolOwner; it were ${candidateFirSymbol::class} instead"
|
||||
}
|
||||
|
||||
rootModuleSession.visibilityChecker.isVisible(
|
||||
candidateFirSymbol,
|
||||
rootModuleSession,
|
||||
useSiteFirFile,
|
||||
containers,
|
||||
explicitDispatchReceiver
|
||||
)
|
||||
}
|
||||
}
|
||||
return rootModuleSession.visibilityChecker.isVisible(
|
||||
candidateFirSymbol,
|
||||
rootModuleSession,
|
||||
useSiteFirFile,
|
||||
containers,
|
||||
explicitDispatchReceiver
|
||||
)
|
||||
}
|
||||
|
||||
private fun findContainingNonLocalDeclaration(element: PsiElement): KtCallableDeclaration? {
|
||||
|
||||
+161
-161
File diff suppressed because it is too large
Load Diff
+7
-9
@@ -12,7 +12,9 @@ import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirPackageSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirSafe
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
import org.jetbrains.kotlin.fir.FirPackageDirective
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.ROOT_PREFIX_FOR_IDE_RESOLUTION_MODE
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.builder.buildImport
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||
@@ -32,12 +34,8 @@ import org.jetbrains.kotlin.fir.scopes.processClassifiersByName
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.analysis.api.fir.getCandidateSymbols
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.buildSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
@@ -114,7 +112,7 @@ internal object FirReferenceResolveHelper {
|
||||
val boundSymbol = boundSymbol
|
||||
when {
|
||||
!isInLabelReference && boundSymbol is FirCallableSymbol<*> ->
|
||||
symbolBuilder.callableBuilder.buildExtensionReceiverSymbol(boundSymbol.fir)
|
||||
symbolBuilder.callableBuilder.buildExtensionReceiverSymbol(boundSymbol)
|
||||
else -> boundSymbol?.fir?.buildSymbol(symbolBuilder)
|
||||
}.let { listOfNotNull(it) }
|
||||
}
|
||||
@@ -345,7 +343,7 @@ internal object FirReferenceResolveHelper {
|
||||
symbolBuilder: KtSymbolByFirBuilder,
|
||||
fir: FirFile
|
||||
): List<KtSymbol> {
|
||||
return listOf(symbolBuilder.buildSymbol(fir))
|
||||
return listOf(symbolBuilder.buildSymbol(fir.symbol))
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalStdlibApi::class)
|
||||
@@ -414,7 +412,7 @@ internal object FirReferenceResolveHelper {
|
||||
return listOfNotNull(symbolBuilder.createPackageSymbolIfOneExists(FqName.fromSegments(fqNameSegments)))
|
||||
}
|
||||
val referencedClass = referencedSymbol.fir
|
||||
val referencedSymbolsByFir = listOfNotNull(symbolBuilder.buildSymbol(referencedClass))
|
||||
val referencedSymbolsByFir = listOfNotNull(symbolBuilder.buildSymbol(referencedSymbol))
|
||||
val firSourcePsi = fir.source.psi ?: referencedSymbolsByFir
|
||||
if (firSourcePsi !is KtDotQualifiedExpression) return referencedSymbolsByFir
|
||||
|
||||
|
||||
+2
-2
@@ -6,9 +6,9 @@
|
||||
package org.jetbrains.kotlin.idea.references
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findReferencePsi
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.KtSymbolBasedReference
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findReferencePsi
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
@@ -34,7 +34,7 @@ interface KtFirReference : KtReference, KtSymbolBasedReference {
|
||||
|
||||
private fun KtSymbol.findPsiForReferenceResolve(): PsiElement? {
|
||||
require(this is KtFirSymbol<*>)
|
||||
return firRef.withFir { it.findReferencePsi() }
|
||||
return firSymbol.fir.findReferencePsi()
|
||||
}
|
||||
|
||||
override val resolver get() = KtFirReferenceResolver
|
||||
|
||||
+10
-10
@@ -5,12 +5,6 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.fir.scopes
|
||||
|
||||
import org.jetbrains.kotlin.fir.isSubstitutionOverride
|
||||
import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.processClassifiersByName
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.scopes.KtScope
|
||||
@@ -19,7 +13,13 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtClassifierSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.fir.isSubstitutionOverride
|
||||
import org.jetbrains.kotlin.fir.scopes.FirContainingNamesAwareScope
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.processClassifiersByName
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
internal open class KtFirDelegatingScope(
|
||||
@@ -67,14 +67,14 @@ internal fun FirScope.getCallableSymbols(callableNames: Collection<Name>, builde
|
||||
callableNames.forEach { name ->
|
||||
val callables = mutableListOf<KtCallableSymbol>()
|
||||
processFunctionsByName(name) { firSymbol ->
|
||||
callables.add(builder.functionLikeBuilder.buildFunctionSymbol(firSymbol.fir))
|
||||
callables.add(builder.functionLikeBuilder.buildFunctionSymbol(firSymbol))
|
||||
}
|
||||
processPropertiesByName(name) { firSymbol ->
|
||||
val symbol = when {
|
||||
firSymbol is FirPropertySymbol && firSymbol.fir.isSubstitutionOverride -> {
|
||||
builder.variableLikeBuilder.buildVariableSymbol(firSymbol.fir)
|
||||
builder.variableLikeBuilder.buildVariableSymbol(firSymbol)
|
||||
}
|
||||
else -> builder.callableBuilder.buildCallableSymbol(firSymbol.fir)
|
||||
else -> builder.callableBuilder.buildCallableSymbol(firSymbol)
|
||||
}
|
||||
callables.add(symbol)
|
||||
}
|
||||
@@ -97,7 +97,7 @@ internal fun FirScope.getConstructors(builder: KtSymbolByFirBuilder): Sequence<K
|
||||
sequence {
|
||||
val constructorSymbols = mutableListOf<KtConstructorSymbol>()
|
||||
processDeclaredConstructors { firSymbol ->
|
||||
constructorSymbols.add(builder.functionLikeBuilder.buildConstructorSymbol(firSymbol.fir))
|
||||
constructorSymbols.add(builder.functionLikeBuilder.buildConstructorSymbol(firSymbol))
|
||||
}
|
||||
yieldAll(constructorSymbols)
|
||||
}
|
||||
|
||||
+26
-26
@@ -5,7 +5,6 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.fir.scopes
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirFileSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
@@ -15,8 +14,12 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtClassifierSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
internal class KtFirFileScope(
|
||||
@@ -33,15 +36,15 @@ internal class KtFirFileScope(
|
||||
|
||||
private val _callableNames: Set<Name> by cached {
|
||||
val result = mutableSetOf<Name>()
|
||||
owner.firRef.withFir {
|
||||
it.declarations.mapNotNullTo(result) { firDeclaration ->
|
||||
owner.firSymbol.fir.declarations
|
||||
.mapNotNullTo(result) { firDeclaration ->
|
||||
when (firDeclaration) {
|
||||
is FirSimpleFunction -> firDeclaration.name
|
||||
is FirProperty -> firDeclaration.name
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
result
|
||||
}
|
||||
|
||||
@@ -49,51 +52,48 @@ internal class KtFirFileScope(
|
||||
|
||||
private val _classifierNames: Set<Name> by cached {
|
||||
val result = mutableSetOf<Name>()
|
||||
owner.firRef.withFir {
|
||||
it.declarations.mapNotNullTo(result) { firDeclaration ->
|
||||
owner.firSymbol.fir.declarations
|
||||
.mapNotNullTo(result) { firDeclaration ->
|
||||
(firDeclaration as? FirRegularClass)?.name
|
||||
}
|
||||
}
|
||||
|
||||
result
|
||||
}
|
||||
|
||||
override fun getPossibleClassifierNames(): Set<Name> = _classifierNames
|
||||
|
||||
override fun getCallableSymbols(nameFilter: KtScopeNameFilter): Sequence<KtCallableSymbol> = withValidityAssertion {
|
||||
owner.firRef.withFir {
|
||||
sequence {
|
||||
it.declarations.forEach { firDeclaration ->
|
||||
val callableDeclaration = when (firDeclaration) {
|
||||
is FirSimpleFunction -> firDeclaration.takeIf { nameFilter(firDeclaration.name) }
|
||||
is FirProperty -> firDeclaration.takeIf { nameFilter(firDeclaration.name) }
|
||||
else -> null
|
||||
}
|
||||
sequence {
|
||||
owner.firSymbol.fir.declarations.forEach { firDeclaration ->
|
||||
val callableDeclaration = when (firDeclaration) {
|
||||
is FirSimpleFunction -> firDeclaration.takeIf { nameFilter(firDeclaration.name) }
|
||||
is FirProperty -> firDeclaration.takeIf { nameFilter(firDeclaration.name) }
|
||||
else -> null
|
||||
}
|
||||
|
||||
if (callableDeclaration != null) {
|
||||
yield(builder.callableBuilder.buildCallableSymbol(callableDeclaration))
|
||||
}
|
||||
if (callableDeclaration != null) {
|
||||
yield(builder.callableBuilder.buildCallableSymbol(callableDeclaration.symbol))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun getClassifierSymbols(nameFilter: KtScopeNameFilter): Sequence<KtClassifierSymbol> = withValidityAssertion {
|
||||
owner.firRef.withFir {
|
||||
sequence {
|
||||
it.declarations.forEach { firDeclaration ->
|
||||
val classLikeDeclaration = when (firDeclaration) {
|
||||
sequence {
|
||||
owner.firSymbol.fir.declarations.forEach { firDeclaration ->
|
||||
val classLikeDeclaration = when (firDeclaration) {
|
||||
is FirTypeAlias -> if (nameFilter(firDeclaration.name)) firDeclaration else null
|
||||
is FirRegularClass -> if (nameFilter(firDeclaration.name)) firDeclaration else null
|
||||
else -> null
|
||||
}
|
||||
if (classLikeDeclaration != null) {
|
||||
yield(builder.classifierBuilder.buildClassLikeSymbol(classLikeDeclaration))
|
||||
}
|
||||
if (classLikeDeclaration != null) {
|
||||
yield(builder.classifierBuilder.buildClassLikeSymbol(classLikeDeclaration.symbol))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
override fun getConstructors(): Sequence<KtConstructorSymbol> = emptySequence()
|
||||
|
||||
override fun getPackageSymbols(nameFilter: KtScopeNameFilter): Sequence<KtPackageSymbol> = withValidityAssertion {
|
||||
|
||||
-1
@@ -17,7 +17,6 @@ import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirAbstractSimpleImportingScope
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirDefaultSimpleImportingScope
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
|
||||
+20
-25
@@ -6,46 +6,41 @@
|
||||
package org.jetbrains.kotlin.analysis.api.fir.symbols
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.resolve.getHasStableParameterNames
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtAnonymousFunctionSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.fir.resolve.getHasStableParameterNames
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.isExtension
|
||||
|
||||
internal class KtFirAnonymousFunctionSymbol(
|
||||
fir: FirAnonymousFunction,
|
||||
resolveState: FirModuleResolveState,
|
||||
override val firSymbol: FirAnonymousFunctionSymbol,
|
||||
override val resolveState: FirModuleResolveState,
|
||||
override val token: ValidityToken,
|
||||
private val builder: KtSymbolByFirBuilder
|
||||
) : KtAnonymousFunctionSymbol(), KtFirSymbol<FirAnonymousFunction> {
|
||||
override val firRef = firRef(fir, resolveState)
|
||||
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) }
|
||||
private val builder: KtSymbolByFirBuilder,
|
||||
) : KtAnonymousFunctionSymbol(), KtFirSymbol<FirAnonymousFunctionSymbol> {
|
||||
|
||||
override val returnType: KtType by cached {
|
||||
firRef.returnType(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder)
|
||||
}
|
||||
override val psi: PsiElement? by cached { firSymbol.fir.findPsi(firSymbol.fir.moduleData.session) }
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol> by firRef.withFirAndCache { fir ->
|
||||
fir.valueParameters.map { valueParameter ->
|
||||
builder.variableLikeBuilder.buildValueParameterSymbol(valueParameter)
|
||||
override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) }
|
||||
override val receiverType: KtType? get() = withValidityAssertion { firSymbol.receiverType(builder) }
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol> by cached { firSymbol.createKtValueParameters(builder) }
|
||||
|
||||
override val hasStableParameterNames: Boolean
|
||||
get() = withValidityAssertion {
|
||||
firSymbol.fir.getHasStableParameterNames(firSymbol.moduleData.session)
|
||||
}
|
||||
}
|
||||
override val isExtension: Boolean get() = withValidityAssertion { firSymbol.isExtension }
|
||||
|
||||
override val hasStableParameterNames: Boolean = firRef.withFir { it.getHasStableParameterNames(it.moduleData.session) }
|
||||
|
||||
override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null }
|
||||
override val receiverType: KtType? by cached {
|
||||
firRef.receiverType(builder)
|
||||
}
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtAnonymousFunctionSymbol> {
|
||||
KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it }
|
||||
|
||||
+10
-13
@@ -6,33 +6,30 @@
|
||||
package org.jetbrains.kotlin.analysis.api.fir.symbols
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.fir.declarations.FirAnonymousObject
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtAnonymousObjectSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousObjectSymbol
|
||||
|
||||
internal class KtFirAnonymousObjectSymbol(
|
||||
fir: FirAnonymousObject,
|
||||
resolveState: FirModuleResolveState,
|
||||
override val firSymbol: FirAnonymousObjectSymbol,
|
||||
override val resolveState: FirModuleResolveState,
|
||||
override val token: ValidityToken,
|
||||
private val builder: KtSymbolByFirBuilder
|
||||
) : KtAnonymousObjectSymbol(), KtFirSymbol<FirAnonymousObject> {
|
||||
override val firRef = firRef(fir, resolveState)
|
||||
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) }
|
||||
private val builder: KtSymbolByFirBuilder,
|
||||
) : KtAnonymousObjectSymbol(), KtFirSymbol<FirAnonymousObjectSymbol> {
|
||||
override val psi: PsiElement? by cached { firSymbol.findPsi() }
|
||||
|
||||
override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firRef, resolveState.rootModuleSession, token) }
|
||||
override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, resolveState.rootModuleSession, token) }
|
||||
|
||||
|
||||
override val superTypes: List<KtType> by cached { firRef.superTypesList(builder) }
|
||||
override val superTypes: List<KtType> by cached { firSymbol.superTypesList(builder) }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtAnonymousObjectSymbol> =
|
||||
KtPsiBasedSymbolPointer.createForSymbolFromSource(this)
|
||||
|
||||
+4
-4
@@ -6,9 +6,9 @@
|
||||
package org.jetbrains.kotlin.analysis.api.fir.symbols
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.symbolProvider
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -16,13 +16,13 @@ import org.jetbrains.kotlin.name.StandardClassIds
|
||||
|
||||
object KtFirArrayOfSymbolProvider {
|
||||
internal fun KtFirAnalysisSession.arrayOfSymbol(identifier: Name): KtFirFunctionSymbol? {
|
||||
val fir = firResolveState.rootModuleSession.symbolProvider.getTopLevelCallableSymbols(kotlinPackage, identifier).firstOrNull {
|
||||
val firSymbol = firResolveState.rootModuleSession.symbolProvider.getTopLevelCallableSymbols(kotlinPackage, identifier).firstOrNull {
|
||||
/* choose (for byte array)
|
||||
* public fun byteArrayOf(vararg elements: kotlin.Byte): kotlin.ByteArray
|
||||
*/
|
||||
(it as? FirFunctionSymbol<*>)?.fir?.valueParameters?.singleOrNull()?.isVararg == true
|
||||
}?.fir as? FirSimpleFunction ?: return null
|
||||
return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(fir)
|
||||
} as? FirNamedFunctionSymbol ?: return null
|
||||
return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firSymbol)
|
||||
}
|
||||
|
||||
private val kotlinPackage = FqName("kotlin")
|
||||
|
||||
+12
-19
@@ -7,8 +7,6 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirBackingFieldSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtBackingFieldSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
||||
@@ -17,27 +15,22 @@ import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.fir.declarations.FirBackingField
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirBackingFieldSymbol
|
||||
|
||||
internal class KtFirBackingFieldSymbol(
|
||||
fir: FirBackingField,
|
||||
resolveState: FirModuleResolveState,
|
||||
override val firSymbol: FirBackingFieldSymbol,
|
||||
override val resolveState: FirModuleResolveState,
|
||||
override val token: ValidityToken,
|
||||
private val builder: KtSymbolByFirBuilder
|
||||
) : KtBackingFieldSymbol(), KtFirSymbol<FirBackingField> {
|
||||
override val firRef = firRef(fir, resolveState)
|
||||
) : KtBackingFieldSymbol(), KtFirSymbol<FirBackingFieldSymbol> {
|
||||
override val origin: KtSymbolOrigin get() = withValidityAssertion { super<KtBackingFieldSymbol>.origin }
|
||||
|
||||
override val origin: KtSymbolOrigin
|
||||
get() = withValidityAssertion { super<KtBackingFieldSymbol>.origin }
|
||||
override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) }
|
||||
|
||||
override val returnType: KtType by cached {
|
||||
firRef.returnType(FirResolvePhase.TYPES, builder)
|
||||
}
|
||||
|
||||
override val owningProperty: KtKotlinPropertySymbol by firRef.withFirAndCache { fir ->
|
||||
builder.buildSymbol(fir.propertySymbol.fir) as KtKotlinPropertySymbol
|
||||
}
|
||||
override val owningProperty: KtKotlinPropertySymbol
|
||||
get() = withValidityAssertion {
|
||||
builder.variableLikeBuilder.buildPropertySymbol(firSymbol.propertySymbol) as KtKotlinPropertySymbol
|
||||
}
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtBackingFieldSymbol> {
|
||||
return KtFirBackingFieldSymbolPointer(owningProperty.createPointer())
|
||||
@@ -49,10 +42,10 @@ internal class KtFirBackingFieldSymbol(
|
||||
|
||||
other as KtFirBackingFieldSymbol
|
||||
|
||||
return this.firRef == other.firRef
|
||||
return this.firSymbol == other.firSymbol
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
return firRef.hashCode() * 31 + token.hashCode()
|
||||
return firSymbol.hashCode() * 31 + token.hashCode()
|
||||
}
|
||||
}
|
||||
+6
-7
@@ -7,22 +7,21 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtClassInitializerSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.fir.declarations.FirAnonymousInitializer
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousInitializerSymbol
|
||||
|
||||
internal class KtFirClassInitializerSymbol(
|
||||
fir: FirAnonymousInitializer,
|
||||
resolveState: FirModuleResolveState,
|
||||
override val firSymbol: FirAnonymousInitializerSymbol,
|
||||
override val resolveState: FirModuleResolveState,
|
||||
override val token: ValidityToken,
|
||||
) : KtClassInitializerSymbol(), KtFirSymbol<FirAnonymousInitializer> {
|
||||
override val firRef = firRef(fir, resolveState)
|
||||
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) }
|
||||
) : KtClassInitializerSymbol(), KtFirSymbol<FirAnonymousInitializerSymbol> {
|
||||
override val psi: PsiElement? by cached { firSymbol.findPsi() }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtSymbol> {
|
||||
TODO("Figure out how to create such a pointer. Should we give an index to class initializers?")
|
||||
|
||||
+19
-28
@@ -12,7 +12,6 @@ import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirConstructorSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.createSignature
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
||||
@@ -25,47 +24,39 @@ import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.containingClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.visibility
|
||||
import org.jetbrains.kotlin.fir.resolve.getHasStableParameterNames
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
|
||||
internal class KtFirConstructorSymbol(
|
||||
fir: FirConstructor,
|
||||
resolveState: FirModuleResolveState,
|
||||
override val firSymbol: FirConstructorSymbol,
|
||||
override val resolveState: FirModuleResolveState,
|
||||
override val token: ValidityToken,
|
||||
private val builder: KtSymbolByFirBuilder
|
||||
) : KtConstructorSymbol(), KtFirSymbol<FirConstructor> {
|
||||
override val firRef = firRef(fir, resolveState)
|
||||
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) }
|
||||
) : KtConstructorSymbol(), KtFirSymbol<FirConstructorSymbol> {
|
||||
override val psi: PsiElement? by cached { firSymbol.findPsi() }
|
||||
|
||||
override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) }
|
||||
|
||||
override val returnType: KtType by cached {
|
||||
firRef.returnType(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder)
|
||||
}
|
||||
override val valueParameters: List<KtValueParameterSymbol> by cached { firSymbol.createKtValueParameters(builder) }
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol> by firRef.withFirAndCache { fir ->
|
||||
fir.valueParameters.map { valueParameter ->
|
||||
builder.variableLikeBuilder.buildValueParameterSymbol(valueParameter)
|
||||
override val hasStableParameterNames: Boolean
|
||||
get() = withValidityAssertion {
|
||||
firSymbol.fir.getHasStableParameterNames(firSymbol.moduleData.session)
|
||||
}
|
||||
}
|
||||
|
||||
override val hasStableParameterNames: Boolean = firRef.withFir { it.getHasStableParameterNames(it.moduleData.session) }
|
||||
|
||||
override val visibility: Visibility get() = getVisibility()
|
||||
|
||||
override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firRef, resolveState.rootModuleSession, token) }
|
||||
override val visibility: Visibility get() = withValidityAssertion { firSymbol.visibility }
|
||||
|
||||
override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, resolveState.rootModuleSession, token) }
|
||||
|
||||
override val containingClassIdIfNonLocal: ClassId?
|
||||
get() = firRef.withFir { fir -> fir.containingClass()?.classId /* TODO check if local */ }
|
||||
get() = withValidityAssertion { firSymbol.containingClass()?.classId?.takeUnless { it.isLocal } }
|
||||
|
||||
override val isPrimary: Boolean get() = firRef.withFir { it.isPrimary }
|
||||
override val isPrimary: Boolean get() = withValidityAssertion { firSymbol.isPrimary }
|
||||
|
||||
override val typeParameters by cached { firSymbol.createKtTypeParameters(builder) }
|
||||
|
||||
override val typeParameters by firRef.withFirAndCache { fir ->
|
||||
fir.typeParameters.map { typeParameter ->
|
||||
builder.classifierBuilder.buildTypeParameterSymbol(typeParameter.symbol.fir)
|
||||
}
|
||||
}
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtConstructorSymbol> = withValidityAssertion {
|
||||
KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it }
|
||||
@@ -74,7 +65,7 @@ internal class KtFirConstructorSymbol(
|
||||
}
|
||||
val ownerClassId = containingClassIdIfNonLocal
|
||||
?: error("ClassId should present for member declaration")
|
||||
return KtFirConstructorSymbolPointer(ownerClassId, isPrimary, firRef.withFir { it.createSignature() })
|
||||
return KtFirConstructorSymbolPointer(ownerClassId, isPrimary, firSymbol.fir.createSignature())
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean = symbolEquals(other)
|
||||
|
||||
+17
-26
@@ -6,52 +6,43 @@
|
||||
package org.jetbrains.kotlin.analysis.api.fir.symbols
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.fir.containingClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirEnumEntrySymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.fir.containingClass
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirEnumEntrySymbol
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
internal class KtFirEnumEntrySymbol(
|
||||
fir: FirEnumEntry,
|
||||
resolveState: FirModuleResolveState,
|
||||
override val firSymbol: FirEnumEntrySymbol,
|
||||
override val resolveState: FirModuleResolveState,
|
||||
override val token: ValidityToken,
|
||||
private val builder: KtSymbolByFirBuilder
|
||||
) : KtEnumEntrySymbol(), KtFirSymbol<FirEnumEntry> {
|
||||
override val firRef = firRef(fir, resolveState)
|
||||
) : KtEnumEntrySymbol(), KtFirSymbol<FirEnumEntrySymbol> {
|
||||
override val psi: PsiElement? by cached { firSymbol.findPsi() }
|
||||
|
||||
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) }
|
||||
override val name: Name get() = withValidityAssertion { firSymbol.name }
|
||||
override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) }
|
||||
override val containingEnumClassIdIfNonLocal: ClassId? get() = callableIdIfNonLocal?.classId
|
||||
|
||||
override val name: Name get() = firRef.withFir { it.name }
|
||||
override val returnType: KtType by cached {
|
||||
firRef.returnType(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder)
|
||||
}
|
||||
|
||||
override val containingEnumClassIdIfNonLocal: ClassId?
|
||||
get() = firRef.withFir { it.containingClass()?.classId?.takeUnless { it.isLocal } }
|
||||
|
||||
override val callableIdIfNonLocal: CallableId? get() = getCallableIdIfNonLocal()
|
||||
override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { firSymbol.getCallableIdIfNonLocal() }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtEnumEntrySymbol> {
|
||||
KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it }
|
||||
return firRef.withFir { fir ->
|
||||
KtFirEnumEntrySymbolPointer(
|
||||
fir.symbol.containingClass()?.classId ?: error("Containing class should present for enum entry"),
|
||||
fir.name
|
||||
)
|
||||
}
|
||||
return KtFirEnumEntrySymbolPointer(
|
||||
firSymbol.containingClass()?.classId ?: error("Containing class should present for enum entry"),
|
||||
firSymbol.name
|
||||
)
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean = symbolEquals(other)
|
||||
|
||||
+7
-9
@@ -7,31 +7,29 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtFileSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithDeclarations
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFileSymbol
|
||||
|
||||
internal class KtFirFileSymbol(
|
||||
fir: FirFile,
|
||||
resolveState: FirModuleResolveState,
|
||||
override val firSymbol: FirFileSymbol,
|
||||
override val resolveState: FirModuleResolveState,
|
||||
override val token: ValidityToken,
|
||||
) : KtFileSymbol(), KtSymbolWithDeclarations, KtFirSymbol<FirFile> {
|
||||
override val firRef = firRef(fir, resolveState)
|
||||
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) }
|
||||
) : KtFileSymbol(), KtSymbolWithDeclarations, KtFirSymbol<FirFileSymbol> {
|
||||
override val psi: PsiElement? by cached { firSymbol.findPsi() }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtFileSymbol> {
|
||||
KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it }
|
||||
TODO("Creating pointers for files from library is not supported yet")
|
||||
}
|
||||
|
||||
override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firRef, resolveState.rootModuleSession, token) }
|
||||
override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, resolveState.rootModuleSession, token) }
|
||||
|
||||
override fun equals(other: Any?): Boolean = symbolEquals(other)
|
||||
override fun hashCode(): Int = symbolHashCode()
|
||||
|
||||
+44
-57
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirMemberFunctio
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirTopLevelFunctionSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.createSignature
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.util.kotlinFunctionInvokeCallableIds
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
@@ -24,94 +23,82 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.WrongSymbolForSamConstructor
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.containingClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.*
|
||||
import org.jetbrains.kotlin.fir.resolve.getHasStableParameterNames
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.isExtension
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
internal class KtFirFunctionSymbol(
|
||||
fir: FirSimpleFunction,
|
||||
resolveState: FirModuleResolveState,
|
||||
override val firSymbol: FirNamedFunctionSymbol,
|
||||
override val resolveState: FirModuleResolveState,
|
||||
override val token: ValidityToken,
|
||||
private val builder: KtSymbolByFirBuilder
|
||||
) : KtFunctionSymbol(), KtFirSymbol<FirSimpleFunction> {
|
||||
override val firRef = firRef(fir, resolveState)
|
||||
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) }
|
||||
override val name: Name get() = firRef.withFir { it.name }
|
||||
override val returnType: KtType by cached {
|
||||
firRef.returnType(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder)
|
||||
}
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol> by firRef.withFirAndCache { fir ->
|
||||
fir.valueParameters.map { valueParameter ->
|
||||
builder.variableLikeBuilder.buildValueParameterSymbol(valueParameter)
|
||||
}
|
||||
}
|
||||
|
||||
override val typeParameters by firRef.withFirAndCache { fir ->
|
||||
fir.typeParameters.map { typeParameter ->
|
||||
builder.classifierBuilder.buildTypeParameterSymbol(typeParameter.symbol.fir)
|
||||
}
|
||||
}
|
||||
|
||||
override val hasStableParameterNames: Boolean = firRef.withFir { it.getHasStableParameterNames(it.moduleData.session) }
|
||||
|
||||
override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firRef, resolveState.rootModuleSession, token) }
|
||||
|
||||
|
||||
override val isSuspend: Boolean get() = firRef.withFir { it.isSuspend }
|
||||
override val isOverride: Boolean get() = firRef.withFir { it.isOverride }
|
||||
override val isInfix: Boolean get() = firRef.withFir { it.isInfix }
|
||||
override val isStatic: Boolean get() = firRef.withFir { it.isStatic }
|
||||
) : KtFunctionSymbol(), KtFirSymbol<FirNamedFunctionSymbol> {
|
||||
override val psi: PsiElement? by cached { firSymbol.findPsi() }
|
||||
override val name: Name get() = withValidityAssertion { firSymbol.name }
|
||||
|
||||
override val isBuiltinFunctionInvoke: Boolean
|
||||
get() = callableIdIfNonLocal in kotlinFunctionInvokeCallableIds
|
||||
get() = withValidityAssertion { callableIdIfNonLocal in kotlinFunctionInvokeCallableIds }
|
||||
|
||||
override val receiverType: KtType? by cached {
|
||||
firRef.receiverType(builder)
|
||||
}
|
||||
override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) }
|
||||
override val receiverType: KtType? get() = withValidityAssertion { firSymbol.receiverType(builder) }
|
||||
|
||||
override val typeParameters by cached { firSymbol.createKtTypeParameters(builder) }
|
||||
override val valueParameters: List<KtValueParameterSymbol> by cached { firSymbol.createKtValueParameters(builder) }
|
||||
|
||||
override val isOperator: Boolean get() = firRef.withFir { it.isOperator }
|
||||
override val isExternal: Boolean get() = firRef.withFir { it.isExternal }
|
||||
override val isInline: Boolean get() = firRef.withFir { it.isInline }
|
||||
override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null }
|
||||
override val callableIdIfNonLocal: CallableId? get() = getCallableIdIfNonLocal()
|
||||
override val hasStableParameterNames: Boolean
|
||||
get() = withValidityAssertion { firSymbol.fir.getHasStableParameterNames(firSymbol.moduleData.session) }
|
||||
|
||||
override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, resolveState.rootModuleSession, token) }
|
||||
|
||||
override val isSuspend: Boolean get() = withValidityAssertion { firSymbol.isSuspend }
|
||||
override val isOverride: Boolean get() = withValidityAssertion { firSymbol.isOverride }
|
||||
override val isInfix: Boolean get() = withValidityAssertion { firSymbol.isInfix }
|
||||
override val isStatic: Boolean get() = withValidityAssertion { firSymbol.isStatic }
|
||||
|
||||
|
||||
override val isOperator: Boolean get() = withValidityAssertion { firSymbol.isOperator }
|
||||
override val isExternal: Boolean get() = withValidityAssertion { firSymbol.isExternal }
|
||||
override val isInline: Boolean get() = withValidityAssertion { firSymbol.isInline }
|
||||
override val isExtension: Boolean get() = withValidityAssertion { firSymbol.isExtension }
|
||||
override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { firSymbol.getCallableIdIfNonLocal() }
|
||||
|
||||
override val symbolKind: KtSymbolKind
|
||||
get() = firRef.withFir { fir ->
|
||||
get() = withValidityAssertion {
|
||||
when {
|
||||
fir.isLocal -> KtSymbolKind.LOCAL
|
||||
fir.containingClass()?.classId == null -> KtSymbolKind.TOP_LEVEL
|
||||
firSymbol.isLocal -> KtSymbolKind.LOCAL
|
||||
firSymbol.containingClass()?.classId == null -> KtSymbolKind.TOP_LEVEL
|
||||
else -> KtSymbolKind.CLASS_MEMBER
|
||||
}
|
||||
}
|
||||
override val modality: Modality get() = getModality()
|
||||
|
||||
override val visibility: Visibility get() = getVisibility()
|
||||
override val modality: Modality get() = withValidityAssertion { firSymbol.modalityOrFinal }
|
||||
override val visibility: Visibility get() = withValidityAssertion { firSymbol.visibility }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtFunctionSymbol> {
|
||||
if (firRef.withFir { it.origin != FirDeclarationOrigin.SubstitutionOverride }) {
|
||||
if (firSymbol.fir.origin != FirDeclarationOrigin.SubstitutionOverride) {
|
||||
KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it }
|
||||
}
|
||||
|
||||
return when (symbolKind) {
|
||||
KtSymbolKind.TOP_LEVEL -> firRef.withFir { fir ->
|
||||
KtFirTopLevelFunctionSymbolPointer(fir.symbol.callableId, fir.createSignature())
|
||||
}
|
||||
KtSymbolKind.CLASS_MEMBER -> firRef.withFir { fir ->
|
||||
KtSymbolKind.TOP_LEVEL ->
|
||||
KtFirTopLevelFunctionSymbolPointer(firSymbol.callableId, firSymbol.createSignature())
|
||||
|
||||
KtSymbolKind.CLASS_MEMBER ->
|
||||
KtFirMemberFunctionSymbolPointer(
|
||||
fir.containingClass()?.classId ?: error("ClassId should not be null for member function"),
|
||||
fir.name,
|
||||
fir.createSignature()
|
||||
firSymbol.containingClass()?.classId ?: error("ClassId should not be null for member function"),
|
||||
firSymbol.name,
|
||||
firSymbol.createSignature()
|
||||
)
|
||||
}
|
||||
|
||||
KtSymbolKind.ACCESSOR -> TODO("Creating symbol for accessors fun is not supported yet")
|
||||
KtSymbolKind.LOCAL -> throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException(
|
||||
callableIdIfNonLocal?.toString() ?: name.asString()
|
||||
|
||||
+21
-23
@@ -6,49 +6,47 @@
|
||||
package org.jetbrains.kotlin.analysis.api.fir.symbols
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.declarations.FirField
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isStatic
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirJavaFieldSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtJavaFieldSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.containingClass
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isStatic
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.modalityOrFinal
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.visibility
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFieldSymbol
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
internal class KtFirJavaFieldSymbol(
|
||||
fir: FirField,
|
||||
resolveState: FirModuleResolveState,
|
||||
override val firSymbol: FirFieldSymbol,
|
||||
override val resolveState: FirModuleResolveState,
|
||||
override val token: ValidityToken,
|
||||
private val builder: KtSymbolByFirBuilder
|
||||
) : KtJavaFieldSymbol(), KtFirSymbol<FirField> {
|
||||
override val firRef = firRef(fir, resolveState)
|
||||
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) }
|
||||
) : KtJavaFieldSymbol(), KtFirSymbol<FirFieldSymbol> {
|
||||
override val psi: PsiElement? by cached { firSymbol.findPsi() }
|
||||
|
||||
override val returnType: KtType by cached {
|
||||
firRef.returnType(FirResolvePhase.TYPES, builder)
|
||||
}
|
||||
override val isVal: Boolean get() = firRef.withFir { it.isVal }
|
||||
override val name: Name get() = firRef.withFir { it.name }
|
||||
override val isVal: Boolean get() = withValidityAssertion { firSymbol.fir.isVal }
|
||||
override val name: Name get() = withValidityAssertion { firSymbol.name }
|
||||
override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) }
|
||||
|
||||
override val callableIdIfNonLocal: CallableId? get() = getCallableIdIfNonLocal()
|
||||
override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { firSymbol.getCallableIdIfNonLocal() }
|
||||
|
||||
override val modality: Modality get() = getModality()
|
||||
override val modality: Modality get() = withValidityAssertion { firSymbol.modalityOrFinal }
|
||||
override val visibility: Visibility get() = withValidityAssertion { firSymbol.visibility }
|
||||
|
||||
override val visibility: Visibility get() = getVisibility()
|
||||
override val isStatic: Boolean get() = firRef.withFir { it.isStatic }
|
||||
override val isStatic: Boolean get() = withValidityAssertion { firSymbol.isStatic }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtJavaFieldSymbol> {
|
||||
val containingClassId = firRef.withFir { it.containingClass()?.classId }
|
||||
val containingClassId = firSymbol.containingClass()?.classId
|
||||
?: error("Cannot find parent class for java field $callableIdIfNonLocal")
|
||||
|
||||
return KtFirJavaFieldSymbolPointer(containingClassId, name)
|
||||
|
||||
+58
-55
@@ -7,14 +7,13 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
||||
import org.jetbrains.kotlin.analysis.api.KtInitializerValue
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirMemberPropertySymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.createSignature
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.asKtInitializerValue
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol
|
||||
@@ -26,107 +25,111 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.WrongSymbolForSamConstructor
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.containingClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.*
|
||||
import org.jetbrains.kotlin.fir.symbols.ensureResolved
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.isExtension
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
internal class KtFirKotlinPropertySymbol(
|
||||
fir: FirProperty,
|
||||
resolveState: FirModuleResolveState,
|
||||
override val firSymbol: FirPropertySymbol,
|
||||
override val resolveState: FirModuleResolveState,
|
||||
override val token: ValidityToken,
|
||||
private val builder: KtSymbolByFirBuilder
|
||||
) : KtKotlinPropertySymbol(), KtFirSymbol<FirProperty> {
|
||||
) : KtKotlinPropertySymbol(), KtFirSymbol<FirPropertySymbol> {
|
||||
init {
|
||||
assert(!fir.isLocal)
|
||||
check(fir !is FirSyntheticProperty)
|
||||
assert(!firSymbol.isLocal)
|
||||
check(firSymbol !is FirSyntheticPropertySymbol)
|
||||
check(firSymbol.fir !is FirSyntheticProperty)
|
||||
}
|
||||
|
||||
override val firRef = firRef(fir, resolveState)
|
||||
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) }
|
||||
override val isDelegatedProperty: Boolean
|
||||
get() = withValidityAssertion { firSymbol.delegateFieldSymbol != null }
|
||||
|
||||
override val isVal: Boolean get() = firRef.withFir { it.isVal }
|
||||
override val name: Name get() = firRef.withFir { it.name }
|
||||
override val psi: PsiElement? by cached { firSymbol.findPsi() }
|
||||
|
||||
override val returnType: KtType by cached {
|
||||
firRef.returnType(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder)
|
||||
}
|
||||
override val isVal: Boolean get() = withValidityAssertion { firSymbol.isVal }
|
||||
override val name: Name get() = withValidityAssertion { firSymbol.name }
|
||||
|
||||
override val typeParameters: List<KtTypeParameterSymbol> by cached {
|
||||
fir.typeParameters.map { builder.classifierBuilder.buildTypeParameterSymbol(it) }
|
||||
}
|
||||
override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) }
|
||||
override val receiverType: KtType? get() = withValidityAssertion { firSymbol.receiverType(builder) }
|
||||
|
||||
|
||||
override val receiverType: KtType? by cached {
|
||||
firRef.receiverType(builder)
|
||||
}
|
||||
override val isExtension: Boolean get() = withValidityAssertion { firSymbol.isExtension }
|
||||
override val initializer: KtInitializerValue? by cached { firSymbol.getKtConstantInitializer() }
|
||||
|
||||
override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null }
|
||||
override val initializer by firRef.withFirAndCache(FirResolvePhase.BODY_RESOLVE) { fir ->
|
||||
fir.initializer?.asKtInitializerValue()
|
||||
}
|
||||
override val symbolKind: KtSymbolKind
|
||||
get() = firRef.withFir { fir ->
|
||||
when (fir.containingClass()?.classId) {
|
||||
get() = withValidityAssertion {
|
||||
when (firSymbol.containingClass()?.classId) {
|
||||
null -> KtSymbolKind.TOP_LEVEL
|
||||
else -> KtSymbolKind.CLASS_MEMBER
|
||||
}
|
||||
}
|
||||
override val modality: Modality get() = getModality()
|
||||
override val modality: Modality get() = withValidityAssertion { firSymbol.modalityOrFinal }
|
||||
override val visibility: Visibility get() = withValidityAssertion { firSymbol.visibility }
|
||||
|
||||
override val visibility: Visibility get() = getVisibility()
|
||||
override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, resolveState.rootModuleSession, token) }
|
||||
|
||||
override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firRef, resolveState.rootModuleSession, token) }
|
||||
override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { firSymbol.getCallableIdIfNonLocal() }
|
||||
|
||||
override val callableIdIfNonLocal: CallableId? get() = getCallableIdIfNonLocal()
|
||||
override val typeParameters: List<KtTypeParameterSymbol>
|
||||
get() = withValidityAssertion { firSymbol.createKtTypeParameters(builder) }
|
||||
|
||||
override val getter: KtPropertyGetterSymbol? by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { property ->
|
||||
property.getter?.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as? KtPropertyGetterSymbol
|
||||
}
|
||||
override val getter: KtPropertyGetterSymbol?
|
||||
get() = withValidityAssertion {
|
||||
firSymbol.getterSymbol?.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as? KtPropertyGetterSymbol
|
||||
}
|
||||
|
||||
override val setter: KtPropertySetterSymbol? by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { property ->
|
||||
property.setter?.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as? KtPropertySetterSymbol
|
||||
}
|
||||
override val setter: KtPropertySetterSymbol?
|
||||
get() = withValidityAssertion {
|
||||
firSymbol.setterSymbol?.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as? KtPropertySetterSymbol
|
||||
}
|
||||
|
||||
// NB: `field` in accessors indicates the property should have a backing field. To see that, though, we need BODY_RESOLVE.
|
||||
override val hasBackingField: Boolean get() = firRef.withFir(FirResolvePhase.BODY_RESOLVE) { it.hasBackingField }
|
||||
override val hasBackingField: Boolean
|
||||
get() = withValidityAssertion {
|
||||
firSymbol.ensureResolved(FirResolvePhase.BODY_RESOLVE)
|
||||
firSymbol.fir.hasBackingField
|
||||
}
|
||||
override val isLateInit: Boolean get() = withValidityAssertion { firSymbol.isLateInit }
|
||||
|
||||
override val isDelegatedProperty: Boolean get() = firRef.withFir { it.delegateFieldSymbol != null }
|
||||
|
||||
override val isLateInit: Boolean get() = firRef.withFir { it.isLateInit }
|
||||
|
||||
override val isConst: Boolean get() = firRef.withFir { it.isConst }
|
||||
|
||||
override val isFromPrimaryConstructor: Boolean
|
||||
get() = firRef.withFir {
|
||||
it.fromPrimaryConstructor == true || it.source?.kind == KtFakeSourceElementKind.PropertyFromParameter
|
||||
get() = withValidityAssertion {
|
||||
firSymbol.fir.fromPrimaryConstructor == true || firSymbol.source?.kind == KtFakeSourceElementKind.PropertyFromParameter
|
||||
}
|
||||
override val isOverride: Boolean get() = firRef.withFir { it.isOverride }
|
||||
override val isStatic: Boolean get() = firRef.withFir { it.isStatic }
|
||||
|
||||
override val hasGetter: Boolean get() = firRef.withFir { it.getter != null }
|
||||
override val hasSetter: Boolean get() = firRef.withFir { it.setter != null }
|
||||
override val isOverride: Boolean get() = withValidityAssertion { firSymbol.isOverride }
|
||||
override val isConst: Boolean get() = withValidityAssertion { firSymbol.isConst }
|
||||
override val isStatic: Boolean get() = withValidityAssertion { firSymbol.isStatic }
|
||||
|
||||
override val hasGetter: Boolean get() = withValidityAssertion { firSymbol.getterSymbol != null }
|
||||
override val hasSetter: Boolean get() = withValidityAssertion { firSymbol.setterSymbol != null }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtKotlinPropertySymbol> {
|
||||
if (firRef.withFir { it.origin != FirDeclarationOrigin.SubstitutionOverride }) {
|
||||
if (firSymbol.fir.origin != FirDeclarationOrigin.SubstitutionOverride) {
|
||||
KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it }
|
||||
}
|
||||
|
||||
return when (symbolKind) {
|
||||
KtSymbolKind.TOP_LEVEL -> TODO("Creating symbol for top level properties is not supported yet")
|
||||
KtSymbolKind.CLASS_MEMBER -> firRef.withFir { fir ->
|
||||
KtSymbolKind.CLASS_MEMBER ->
|
||||
KtFirMemberPropertySymbolPointer(
|
||||
fir.containingClass()?.classId ?: error("ClassId should not be null for member property"),
|
||||
fir.name,
|
||||
fir.createSignature()
|
||||
firSymbol.containingClass()?.classId ?: error("ClassId should not be null for member property"),
|
||||
firSymbol.name,
|
||||
firSymbol.createSignature()
|
||||
)
|
||||
}
|
||||
|
||||
KtSymbolKind.ACCESSOR -> TODO("Creating symbol for accessors is not supported yet")
|
||||
KtSymbolKind.LOCAL -> throw CanNotCreateSymbolPointerForLocalLibraryDeclarationException(name.asString())
|
||||
KtSymbolKind.SAM_CONSTRUCTOR -> throw WrongSymbolForSamConstructor(this::class.java.simpleName)
|
||||
|
||||
+13
-16
@@ -6,13 +6,9 @@
|
||||
package org.jetbrains.kotlin.analysis.api.fir.symbols
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtLocalVariableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.CanNotCreateSymbolPointerForLocalLibraryDeclarationException
|
||||
@@ -20,27 +16,28 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointe
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
internal class KtFirLocalVariableSymbol(
|
||||
fir: FirProperty,
|
||||
resolveState: FirModuleResolveState,
|
||||
override val firSymbol: FirPropertySymbol,
|
||||
override val resolveState: FirModuleResolveState,
|
||||
override val token: ValidityToken,
|
||||
private val builder: KtSymbolByFirBuilder
|
||||
) : KtLocalVariableSymbol(),
|
||||
KtFirSymbol<FirProperty> {
|
||||
KtFirSymbol<FirPropertySymbol> {
|
||||
init {
|
||||
assert(fir.isLocal)
|
||||
assert(firSymbol.isLocal)
|
||||
}
|
||||
|
||||
override val firRef = firRef(fir, resolveState)
|
||||
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) }
|
||||
override val psi: PsiElement? by cached { firSymbol.findPsi() }
|
||||
|
||||
override val isVal: Boolean get() = withValidityAssertion { firSymbol.isVal }
|
||||
override val name: Name get() = withValidityAssertion { firSymbol.name }
|
||||
override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) }
|
||||
|
||||
override val isVal: Boolean get() = firRef.withFir { it.isVal }
|
||||
override val name: Name get() = firRef.withFir { it.name }
|
||||
override val returnType: KtType by cached {
|
||||
firRef.returnType(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder)
|
||||
}
|
||||
override val symbolKind: KtSymbolKind get() = KtSymbolKind.LOCAL
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtLocalVariableSymbol> {
|
||||
|
||||
+61
-55
@@ -6,19 +6,11 @@
|
||||
package org.jetbrains.kotlin.analysis.api.fir.symbols
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.*
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirClassOrObjectInLibrarySymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtClassKind
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
||||
@@ -27,85 +19,99 @@ import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointe
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.*
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
internal class KtFirNamedClassOrObjectSymbol(
|
||||
fir: FirRegularClass,
|
||||
resolveState: FirModuleResolveState,
|
||||
override val firSymbol: FirRegularClassSymbol,
|
||||
override val resolveState: FirModuleResolveState,
|
||||
override val token: ValidityToken,
|
||||
private val builder: KtSymbolByFirBuilder
|
||||
) : KtNamedClassOrObjectSymbol(), KtFirSymbol<FirRegularClass> {
|
||||
override val firRef = firRef(fir, resolveState)
|
||||
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) }
|
||||
override val name: Name get() = firRef.withFir { it.name }
|
||||
) : KtNamedClassOrObjectSymbol(), KtFirSymbol<FirRegularClassSymbol> {
|
||||
override val psi: PsiElement? by cached { firSymbol.findPsi() }
|
||||
|
||||
override val name: Name get() = withValidityAssertion { firSymbol.name }
|
||||
|
||||
override val classIdIfNonLocal: ClassId?
|
||||
get() = firRef.withFir { fir ->
|
||||
fir.symbol.classId.takeUnless { it.isLocal }
|
||||
get() = withValidityAssertion { firSymbol.classId.takeUnless { it.isLocal } }
|
||||
|
||||
/* FirRegularClass modality is not modified by STATUS, so it can be taken from RAW */
|
||||
override val modality: Modality
|
||||
get() = withValidityAssertion {
|
||||
firSymbol.fir.modality
|
||||
?: when (classKind) { // default modality
|
||||
KtClassKind.INTERFACE -> Modality.ABSTRACT
|
||||
// Enum class should not be `final`, since its entries extend it.
|
||||
// It could be either `abstract` w/o ctor, or empty modality w/ private ctor.
|
||||
KtClassKind.ENUM_CLASS -> Modality.OPEN
|
||||
else -> Modality.FINAL
|
||||
}
|
||||
}
|
||||
|
||||
/* FirRegularClass modality does not modified by STATUS so it can be taken from RAW */
|
||||
override val modality: Modality
|
||||
get() = getModality(
|
||||
FirResolvePhase.RAW_FIR,
|
||||
when (classKind) { // default modality
|
||||
KtClassKind.INTERFACE -> Modality.ABSTRACT
|
||||
// Enum class should not be `final`, since its entries extend it.
|
||||
// It could be either `abstract` w/o ctor, or empty modality w/ private ctor.
|
||||
KtClassKind.ENUM_CLASS -> Modality.OPEN
|
||||
else -> Modality.FINAL
|
||||
}
|
||||
)
|
||||
|
||||
/* FirRegularClass visibility are not modified by STATUS only for Unknown so it can be taken from RAW */
|
||||
/* FirRegularClass visibility is not modified by STATUS only for Unknown, so it can be taken from RAW */
|
||||
override val visibility: Visibility
|
||||
get() = when (val possiblyRawVisibility = getVisibility(FirResolvePhase.RAW_FIR)) {
|
||||
Visibilities.Unknown -> if (firRef.withFir { it.isLocal }) Visibilities.Local else Visibilities.Public
|
||||
get() = when (val possiblyRawVisibility = firSymbol.fir.visibility) {
|
||||
Visibilities.Unknown -> if (firSymbol.fir.isLocal) Visibilities.Local else Visibilities.Public
|
||||
else -> possiblyRawVisibility
|
||||
}
|
||||
|
||||
override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firRef, resolveState.rootModuleSession, token) }
|
||||
override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, resolveState.rootModuleSession, token) }
|
||||
|
||||
override val isInner: Boolean get() = firRef.withFir { it.isInner }
|
||||
override val isData: Boolean get() = firRef.withFir { it.isData }
|
||||
override val isInline: Boolean get() = firRef.withFir { it.isInline }
|
||||
override val isFun: Boolean get() = firRef.withFir { it.isFun }
|
||||
override val isExternal: Boolean get() = firRef.withFir { it.isExternal }
|
||||
override val isInner: Boolean get() = withValidityAssertion { firSymbol.isInner }
|
||||
override val isData: Boolean get() = withValidityAssertion { firSymbol.isData }
|
||||
override val isInline: Boolean get() = withValidityAssertion { firSymbol.isInline }
|
||||
override val isFun: Boolean get() = withValidityAssertion { firSymbol.isFun }
|
||||
override val isExternal: Boolean get() = withValidityAssertion { firSymbol.isExternal }
|
||||
|
||||
override val companionObject: KtFirNamedClassOrObjectSymbol? by firRef.withFirAndCache { fir ->
|
||||
fir.companionObjectSymbol?.let { builder.classifierBuilder.buildNamedClassOrObjectSymbol(it.fir) }
|
||||
}
|
||||
|
||||
override val superTypes: List<KtType> by cached {
|
||||
firRef.superTypesAndAnnotationsListForRegularClass(builder)
|
||||
}
|
||||
|
||||
override val typeParameters by firRef.withFirAndCache { fir ->
|
||||
fir.typeParameters.filterIsInstance<FirTypeParameter>().map { typeParameter ->
|
||||
builder.classifierBuilder.buildTypeParameterSymbol(typeParameter.symbol.fir)
|
||||
override val companionObject: KtFirNamedClassOrObjectSymbol? by cached {
|
||||
firSymbol.companionObjectSymbol?.let {
|
||||
builder.classifierBuilder.buildNamedClassOrObjectSymbol(it)
|
||||
}
|
||||
}
|
||||
|
||||
override val superTypes: List<KtType> by cached {
|
||||
firSymbol.superTypesAndAnnotationsListForRegularClass(builder)
|
||||
}
|
||||
|
||||
override val typeParameters = withValidityAssertion {
|
||||
firSymbol.fir.typeParameters.filterIsInstance<FirTypeParameter>().map { typeParameter ->
|
||||
builder.classifierBuilder.buildTypeParameterSymbol(typeParameter.symbol)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
override val classKind: KtClassKind
|
||||
get() = firRef.withFir { fir ->
|
||||
when (fir.classKind) {
|
||||
get() = withValidityAssertion {
|
||||
when (firSymbol.classKind) {
|
||||
ClassKind.INTERFACE -> KtClassKind.INTERFACE
|
||||
ClassKind.ENUM_CLASS -> KtClassKind.ENUM_CLASS
|
||||
ClassKind.ENUM_ENTRY -> KtClassKind.ENUM_ENTRY
|
||||
ClassKind.ANNOTATION_CLASS -> KtClassKind.ANNOTATION_CLASS
|
||||
ClassKind.CLASS -> KtClassKind.CLASS
|
||||
ClassKind.OBJECT -> if (fir.isCompanion) KtClassKind.COMPANION_OBJECT else KtClassKind.OBJECT
|
||||
ClassKind.OBJECT -> if (firSymbol.isCompanion) KtClassKind.COMPANION_OBJECT else KtClassKind.OBJECT
|
||||
}
|
||||
}
|
||||
|
||||
override val symbolKind: KtSymbolKind
|
||||
get() = firRef.withFir { fir ->
|
||||
get() = withValidityAssertion {
|
||||
when {
|
||||
fir.isLocal -> KtSymbolKind.LOCAL
|
||||
fir.symbol.classId.isNestedClass -> KtSymbolKind.CLASS_MEMBER
|
||||
firSymbol.isLocal -> KtSymbolKind.LOCAL
|
||||
firSymbol.classId.isNestedClass -> KtSymbolKind.CLASS_MEMBER
|
||||
else -> KtSymbolKind.TOP_LEVEL
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtNamedClassOrObjectSymbol> {
|
||||
KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it }
|
||||
if (symbolKind == KtSymbolKind.LOCAL) {
|
||||
|
||||
+22
-32
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.SessionHolderImpl
|
||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.delegatedWrapperData
|
||||
import org.jetbrains.kotlin.fir.symbols.ensureResolved
|
||||
import org.jetbrains.kotlin.util.ImplementationStatus
|
||||
|
||||
internal class KtFirOverrideInfoProvider(
|
||||
@@ -36,15 +37,11 @@ internal class KtFirOverrideInfoProvider(
|
||||
require(classSymbol is KtFirSymbol<*>)
|
||||
|
||||
// Inspecting visibility requires resolving to status
|
||||
return memberSymbol.firRef.withFir(FirResolvePhase.STATUS) outer@{ memberFir ->
|
||||
if (memberFir !is FirCallableDeclaration) return@outer false
|
||||
classSymbol.firSymbol.ensureResolved(FirResolvePhase.STATUS)
|
||||
val memberFir = memberSymbol.firSymbol.fir as? FirCallableDeclaration ?: return false
|
||||
val parentClassFir = classSymbol.firSymbol.fir as? FirClass ?: return false
|
||||
|
||||
classSymbol.firRef.withFir inner@{ parentClassFir ->
|
||||
if (parentClassFir !is FirClass) return@inner false
|
||||
|
||||
memberFir.isVisibleInClass(parentClassFir)
|
||||
}
|
||||
}
|
||||
return memberFir.isVisibleInClass(parentClassFir)
|
||||
}
|
||||
|
||||
override fun getImplementationStatus(memberSymbol: KtCallableSymbol, parentClassSymbol: KtClassOrObjectSymbol): ImplementationStatus? {
|
||||
@@ -52,39 +49,32 @@ internal class KtFirOverrideInfoProvider(
|
||||
require(parentClassSymbol is KtFirSymbol<*>)
|
||||
|
||||
// Inspecting implementation status requires resolving to status
|
||||
return memberSymbol.firRef.withFir(FirResolvePhase.STATUS) outer@{ memberFir ->
|
||||
if (memberFir !is FirCallableDeclaration) return@outer null
|
||||
parentClassSymbol.firSymbol.ensureResolved(FirResolvePhase.STATUS)
|
||||
val memberFir = memberSymbol.firSymbol.fir as? FirCallableDeclaration ?: return null
|
||||
val parentClassFir = parentClassSymbol.firSymbol.fir as? FirClass ?: return null
|
||||
|
||||
parentClassSymbol.firRef.withFir inner@{ parentClassFir ->
|
||||
if (parentClassFir !is FirClass) return@inner null
|
||||
|
||||
memberFir.symbol.getImplementationStatus(
|
||||
SessionHolderImpl(rootModuleSession, ScopeSession()),
|
||||
parentClassFir.symbol
|
||||
)
|
||||
}
|
||||
}
|
||||
return memberFir.symbol.getImplementationStatus(
|
||||
SessionHolderImpl(rootModuleSession, ScopeSession()),
|
||||
parentClassFir.symbol
|
||||
)
|
||||
}
|
||||
|
||||
override fun getOriginalContainingClassForOverride(symbol: KtCallableSymbol): KtClassOrObjectSymbol? {
|
||||
require(symbol is KtFirSymbol<*>)
|
||||
return symbol.firRef.withFir(FirResolvePhase.STATUS) { firDeclaration ->
|
||||
if (firDeclaration !is FirCallableDeclaration) return@withFir null
|
||||
val containingClass =
|
||||
getOriginalOverriddenSymbol(firDeclaration)?.containingClass()?.toSymbol(rootModuleSession) ?: return@withFir null
|
||||
analysisSession.firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(containingClass.fir) as? KtClassOrObjectSymbol
|
||||
}
|
||||
symbol.firSymbol.ensureResolved(FirResolvePhase.STATUS)
|
||||
val firDeclaration = symbol.firSymbol.fir as FirCallableDeclaration
|
||||
val containingClass =
|
||||
getOriginalOverriddenSymbol(firDeclaration)?.containingClass()?.toSymbol(rootModuleSession) ?: return null
|
||||
return analysisSession.firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(containingClass.fir.symbol) as? KtClassOrObjectSymbol
|
||||
|
||||
}
|
||||
|
||||
override fun getOriginalOverriddenSymbol(symbol: KtCallableSymbol): KtCallableSymbol? {
|
||||
require(symbol is KtFirSymbol<*>)
|
||||
return symbol.firRef.withFir(FirResolvePhase.STATUS) { firDeclaration ->
|
||||
if (firDeclaration !is FirCallableDeclaration) return@withFir null
|
||||
with(analysisSession) {
|
||||
getOriginalOverriddenSymbol(firDeclaration)
|
||||
?.buildSymbol((analysisSession as KtFirAnalysisSession).firSymbolBuilder) as KtCallableSymbol?
|
||||
}
|
||||
}
|
||||
symbol.firSymbol.ensureResolved(FirResolvePhase.STATUS)
|
||||
val firDeclaration = symbol.firSymbol.fir as FirCallableDeclaration
|
||||
return getOriginalOverriddenSymbol(firDeclaration)
|
||||
?.buildSymbol(analysisSession.firSymbolBuilder) as KtCallableSymbol?
|
||||
}
|
||||
|
||||
private fun getOriginalOverriddenSymbol(member: FirCallableDeclaration): FirCallableDeclaration? {
|
||||
|
||||
+4
-3
@@ -11,14 +11,15 @@ import com.intellij.psi.PsiElement
|
||||
import com.intellij.psi.PsiManager
|
||||
import com.intellij.psi.impl.file.PsiPackageImpl
|
||||
import com.intellij.psi.search.GlobalSearchScope
|
||||
import org.jetbrains.kotlin.analysis.providers.createPackageProvider
|
||||
import org.jetbrains.kotlin.analysis.api.ValidityTokenOwner
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.*
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPackageSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.symbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.providers.createPackageProvider
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
|
||||
class KtFirPackageSymbol(
|
||||
|
||||
+26
-28
@@ -10,69 +10,67 @@ import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isInline
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isOverride
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.modalityOrFinal
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.visibility
|
||||
import org.jetbrains.kotlin.fir.resolve.getHasStableParameterNames
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertyAccessorSymbol
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
|
||||
internal class KtFirPropertyGetterSymbol(
|
||||
fir: FirPropertyAccessor,
|
||||
resolveState: FirModuleResolveState,
|
||||
override val firSymbol: FirPropertyAccessorSymbol,
|
||||
override val resolveState: FirModuleResolveState,
|
||||
override val token: ValidityToken,
|
||||
private val builder: KtSymbolByFirBuilder,
|
||||
) : KtPropertyGetterSymbol(), KtFirSymbol<FirPropertyAccessor> {
|
||||
) : KtPropertyGetterSymbol(), KtFirSymbol<FirPropertyAccessorSymbol> {
|
||||
init {
|
||||
require(fir.isGetter)
|
||||
require(firSymbol.isGetter)
|
||||
}
|
||||
|
||||
override val firRef = firRef(fir, resolveState)
|
||||
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) }
|
||||
override val psi: PsiElement? by cached { firSymbol.findPsi() }
|
||||
|
||||
override val isDefault: Boolean get() = firRef.withFir { it is FirDefaultPropertyAccessor }
|
||||
override val isInline: Boolean get() = firRef.withFir { it.isInline }
|
||||
override val isOverride: Boolean get() = firRef.withFir { it.isOverride }
|
||||
override val hasBody: Boolean get() = firRef.withFir { it.body != null }
|
||||
override val isDefault: Boolean get() = withValidityAssertion { firSymbol.fir is FirDefaultPropertyAccessor }
|
||||
override val isInline: Boolean get() = withValidityAssertion { firSymbol.isInline }
|
||||
override val isOverride: Boolean get() = withValidityAssertion { firSymbol.isOverride }
|
||||
override val hasBody: Boolean get() = withValidityAssertion { firSymbol.fir.body != null }
|
||||
|
||||
override val returnType: KtType by cached {
|
||||
firRef.returnType(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder)
|
||||
}
|
||||
override val modality: Modality get() = getModality()
|
||||
override val visibility: Visibility get() = getVisibility()
|
||||
override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firRef, resolveState.rootModuleSession, token) }
|
||||
override val modality: Modality get() = withValidityAssertion { firSymbol.modalityOrFinal }
|
||||
override val visibility: Visibility get() = withValidityAssertion { firSymbol.visibility }
|
||||
|
||||
|
||||
override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) }
|
||||
override val receiverType: KtType? get() = withValidityAssertion { firSymbol.receiverType(builder) }
|
||||
|
||||
override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, resolveState.rootModuleSession, token) }
|
||||
|
||||
/**
|
||||
* Returns [CallableId] of the delegated Java method if the corresponding property of this getter is a synthetic Java property.
|
||||
* Returns [CallableId] of the delegated Java method if the corresponding property of this setter is a synthetic Java property.
|
||||
* Otherwise, returns `null`
|
||||
*/
|
||||
override val callableIdIfNonLocal: CallableId? by firRef.withFirAndCache { fir ->
|
||||
override val callableIdIfNonLocal: CallableId? by cached {
|
||||
val fir = firSymbol.fir
|
||||
if (fir is FirSyntheticPropertyAccessor) {
|
||||
fir.delegate.symbol.callableId
|
||||
} else null
|
||||
}
|
||||
|
||||
override val receiverType: KtType? by cached {
|
||||
firRef.receiverType(builder)
|
||||
}
|
||||
override val valueParameters: List<KtValueParameterSymbol> get() = withValidityAssertion { emptyList() }
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol>
|
||||
get() = emptyList()
|
||||
|
||||
override val hasStableParameterNames: Boolean = firRef.withFir { it.getHasStableParameterNames(it.moduleData.session) }
|
||||
override val hasStableParameterNames: Boolean
|
||||
get() = withValidityAssertion { firSymbol.fir.getHasStableParameterNames(firSymbol.moduleData.session) }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtPropertyGetterSymbol> {
|
||||
KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it }
|
||||
|
||||
+26
-28
@@ -10,74 +10,72 @@ import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticPropertyAccessor
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isInline
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isOverride
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.modalityOrFinal
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.visibility
|
||||
import org.jetbrains.kotlin.fir.resolve.getHasStableParameterNames
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertyAccessorSymbol
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
|
||||
internal class KtFirPropertySetterSymbol(
|
||||
fir: FirPropertyAccessor,
|
||||
resolveState: FirModuleResolveState,
|
||||
override val firSymbol: FirPropertyAccessorSymbol,
|
||||
override val resolveState: FirModuleResolveState,
|
||||
override val token: ValidityToken,
|
||||
private val builder: KtSymbolByFirBuilder,
|
||||
) : KtPropertySetterSymbol(), KtFirSymbol<FirPropertyAccessor> {
|
||||
) : KtPropertySetterSymbol(), KtFirSymbol<FirPropertyAccessorSymbol> {
|
||||
|
||||
init {
|
||||
require(fir.isSetter)
|
||||
require(firSymbol.isSetter)
|
||||
}
|
||||
|
||||
override val firRef = firRef(fir, resolveState)
|
||||
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) }
|
||||
override val psi: PsiElement? by cached { firSymbol.findPsi() }
|
||||
|
||||
override val isDefault: Boolean get() = firRef.withFir { it is FirDefaultPropertyAccessor }
|
||||
override val isInline: Boolean get() = firRef.withFir { it.isInline }
|
||||
override val isOverride: Boolean get() = firRef.withFir { it.isOverride }
|
||||
override val hasBody: Boolean get() = firRef.withFir { it.body != null }
|
||||
override val isDefault: Boolean get() = withValidityAssertion { firSymbol.fir is FirDefaultPropertyAccessor }
|
||||
override val isInline: Boolean get() = withValidityAssertion { firSymbol.isInline }
|
||||
override val isOverride: Boolean get() = withValidityAssertion { firSymbol.isOverride }
|
||||
override val hasBody: Boolean get() = withValidityAssertion { firSymbol.fir.body != null }
|
||||
|
||||
override val modality: Modality get() = getModality()
|
||||
override val visibility: Visibility get() = getVisibility()
|
||||
|
||||
override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firRef, resolveState.rootModuleSession, token) }
|
||||
override val modality: Modality get() = withValidityAssertion { firSymbol.modalityOrFinal }
|
||||
override val visibility: Visibility get() = withValidityAssertion { firSymbol.visibility }
|
||||
|
||||
override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, resolveState.rootModuleSession, token) }
|
||||
|
||||
/**
|
||||
* Returns [CallableId] of the delegated Java method if the corresponding property of this setter is a synthetic Java property.
|
||||
* Otherwise, returns `null`
|
||||
*/
|
||||
override val callableIdIfNonLocal: CallableId? by firRef.withFirAndCache { fir ->
|
||||
override val callableIdIfNonLocal: CallableId? by cached {
|
||||
val fir = firSymbol.fir
|
||||
if (fir is FirSyntheticPropertyAccessor) {
|
||||
fir.delegate.symbol.callableId
|
||||
} else null
|
||||
}
|
||||
|
||||
override val parameter: KtValueParameterSymbol by firRef.withFirAndCache { fir ->
|
||||
builder.variableLikeBuilder.buildValueParameterSymbol(fir.valueParameters.single())
|
||||
override val parameter: KtValueParameterSymbol by cached {
|
||||
builder.variableLikeBuilder.buildValueParameterSymbol(firSymbol.fir.valueParameters.single().symbol)
|
||||
}
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol> by cached { listOf(parameter) }
|
||||
|
||||
override val returnType: KtType by cached {
|
||||
firRef.returnType(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder)
|
||||
}
|
||||
override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) }
|
||||
override val receiverType: KtType? get() = withValidityAssertion { firSymbol.receiverType(builder) }
|
||||
|
||||
|
||||
override val receiverType: KtType? by cached {
|
||||
firRef.receiverType(builder)
|
||||
}
|
||||
|
||||
override val hasStableParameterNames: Boolean = firRef.withFir { it.getHasStableParameterNames(it.moduleData.session) }
|
||||
override val hasStableParameterNames: Boolean
|
||||
get() = withValidityAssertion { firSymbol.fir.getHasStableParameterNames(firSymbol.moduleData.session) }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtPropertySetterSymbol> {
|
||||
KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it }
|
||||
|
||||
+11
-9
@@ -10,35 +10,37 @@ import org.jetbrains.kotlin.analysis.api.ValidityTokenOwner
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.weakRef
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtReceiverParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
|
||||
import org.jetbrains.kotlin.fir.originalOrSelf
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
|
||||
internal class KtFirReceiverParameterSymbol(
|
||||
fir: FirCallableDeclaration,
|
||||
resolveState: FirModuleResolveState,
|
||||
val firSymbol: FirCallableSymbol<*>,
|
||||
val resolveState: FirModuleResolveState,
|
||||
override val token: ValidityToken,
|
||||
_builder: KtSymbolByFirBuilder
|
||||
) : KtReceiverParameterSymbol(), ValidityTokenOwner {
|
||||
override val psi: PsiElement? by cached { firSymbol.fir.receiverTypeRef?.findPsi(firSymbol.fir.moduleData.session) }
|
||||
|
||||
init {
|
||||
require(fir.receiverTypeRef != null) { "$fir doesn't have an extension receiver." }
|
||||
require(firSymbol.fir.receiverTypeRef != null) { "$firSymbol doesn't have an extension receiver." }
|
||||
}
|
||||
|
||||
private val builder by weakRef(_builder)
|
||||
internal val firRef = firRef(fir, resolveState)
|
||||
|
||||
override val type: KtType by cached {
|
||||
firRef.receiverType(builder) ?: throw IllegalStateException("$fir doesn't have an extension receiver.")
|
||||
firSymbol.receiverType(builder)
|
||||
?: error("$firSymbol doesn't have an extension receiver.")
|
||||
}
|
||||
override val origin: KtSymbolOrigin get() = firRef.withFir { it.ktSymbolOrigin() }
|
||||
|
||||
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.receiverTypeRef?.findPsi(fir.moduleData.session) }
|
||||
override val origin: KtSymbolOrigin = withValidityAssertion { firSymbol.fir.ktSymbolOrigin() }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtFirReceiverParameterSymbol> {
|
||||
TODO("Probably just create a pointer based on the underlying declaration")
|
||||
|
||||
+28
-29
@@ -6,56 +6,55 @@
|
||||
package org.jetbrains.kotlin.analysis.api.fir.symbols
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.resolve.getHasStableParameterNames
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirSamConstructorSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSamConstructorSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.fir.resolve.getHasStableParameterNames
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.isExtension
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
internal class KtFirSamConstructorSymbol(
|
||||
fir: FirSimpleFunction,
|
||||
resolveState: FirModuleResolveState,
|
||||
override val firSymbol: FirNamedFunctionSymbol,
|
||||
override val resolveState: FirModuleResolveState,
|
||||
override val token: ValidityToken,
|
||||
private val builder: KtSymbolByFirBuilder
|
||||
) : KtSamConstructorSymbol(), KtFirSymbol<FirSimpleFunction> {
|
||||
override val firRef = firRef(fir, resolveState)
|
||||
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) }
|
||||
override val name: Name get() = firRef.withFir { it.name }
|
||||
override val returnType: KtType by cached {
|
||||
firRef.returnType(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder)
|
||||
}
|
||||
) : KtSamConstructorSymbol(), KtFirSymbol<FirNamedFunctionSymbol> {
|
||||
override val psi: PsiElement? by cached { firSymbol.findPsi() }
|
||||
override val name: Name get() = withValidityAssertion { firSymbol.name }
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol> by firRef.withFirAndCache { fir ->
|
||||
fir.valueParameters.map { valueParameter ->
|
||||
builder.variableLikeBuilder.buildValueParameterSymbol(valueParameter)
|
||||
override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) }
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol>
|
||||
get() = withValidityAssertion {
|
||||
firSymbol.fir.valueParameters.map { valueParameter ->
|
||||
builder.variableLikeBuilder.buildValueParameterSymbol(valueParameter.symbol)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override val hasStableParameterNames: Boolean = firRef.withFir { it.getHasStableParameterNames(it.moduleData.session) }
|
||||
override val hasStableParameterNames: Boolean
|
||||
get() = withValidityAssertion {
|
||||
firSymbol.fir.getHasStableParameterNames(firSymbol.moduleData.session)
|
||||
}
|
||||
|
||||
override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null }
|
||||
override val receiverType: KtType? by cached {
|
||||
firRef.receiverType(builder)
|
||||
}
|
||||
override val isExtension: Boolean get() = withValidityAssertion { firSymbol.isExtension }
|
||||
|
||||
override val callableIdIfNonLocal: CallableId? get() = getCallableIdIfNonLocal()
|
||||
override val receiverType: KtType? get() = withValidityAssertion { firSymbol.receiverType(builder) }
|
||||
|
||||
override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { firSymbol.getCallableIdIfNonLocal() }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtSamConstructorSymbol> {
|
||||
return firRef.withFir { fir ->
|
||||
val callableId = fir.symbol.callableId
|
||||
KtFirSamConstructorSymbolPointer(ClassId(callableId.packageName, callableId.callableName))
|
||||
}
|
||||
val callableId = firSymbol.callableId
|
||||
return KtFirSamConstructorSymbolPointer(ClassId(callableId.packageName, callableId.callableName))
|
||||
}
|
||||
}
|
||||
|
||||
+9
-6
@@ -7,9 +7,9 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols
|
||||
|
||||
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
||||
import org.jetbrains.kotlin.analysis.api.ValidityTokenOwner
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.FirRefWithValidityCheck
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
||||
@@ -17,19 +17,22 @@ import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.originalIfFakeOverride
|
||||
import org.jetbrains.kotlin.fir.render
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.importedFromObjectData
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
|
||||
internal interface KtFirSymbol<out F : FirDeclaration> : KtSymbol, ValidityTokenOwner {
|
||||
val firRef: FirRefWithValidityCheck<F>
|
||||
internal interface KtFirSymbol<out S : FirBasedSymbol<*>> : KtSymbol, ValidityTokenOwner {
|
||||
val firSymbol: S
|
||||
|
||||
override val origin: KtSymbolOrigin get() = firRef.withFir { it.ktSymbolOrigin() }
|
||||
abstract val resolveState: FirModuleResolveState
|
||||
|
||||
override val origin: KtSymbolOrigin get() = firSymbol.fir.ktSymbolOrigin()
|
||||
}
|
||||
|
||||
internal fun KtFirSymbol<*>.symbolEquals(other: Any?): Boolean {
|
||||
if (other !is KtFirSymbol<*>) return false
|
||||
return this.firRef == other.firRef
|
||||
return this.firSymbol == other.firSymbol
|
||||
}
|
||||
|
||||
internal fun KtFirSymbol<*>.symbolHashCode(): Int = firRef.hashCode()
|
||||
internal fun KtFirSymbol<*>.symbolHashCode(): Int = firSymbol.hashCode()
|
||||
|
||||
internal tailrec fun FirDeclaration.ktSymbolOrigin(): KtSymbolOrigin = when (origin) {
|
||||
FirDeclarationOrigin.Source -> {
|
||||
|
||||
+24
-25
@@ -15,12 +15,11 @@ import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirFile
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirOfType
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.withFirDeclarationOfType
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.withFirSymbolOfType
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
||||
import org.jetbrains.kotlin.fir.renderWithType
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtClassInitializerSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -41,87 +40,87 @@ internal class KtFirSymbolProvider(
|
||||
"Creating KtValueParameterSymbol for function type parameter is not possible. Please see the KDoc of getParameterSymbol"
|
||||
)
|
||||
|
||||
psi.isLoopParameter -> psi.withFirDeclarationOfType<FirProperty, KtLocalVariableSymbol>(resolveState) {
|
||||
psi.isLoopParameter -> psi.withFirSymbolOfType<FirPropertySymbol, KtLocalVariableSymbol>(resolveState) {
|
||||
firSymbolBuilder.variableLikeBuilder.buildLocalVariableSymbol(it)
|
||||
}
|
||||
|
||||
else -> psi.withFirDeclarationOfType<FirValueParameter, KtValueParameterSymbol>(resolveState) {
|
||||
else -> psi.withFirSymbolOfType<FirValueParameterSymbol, KtValueParameterSymbol>(resolveState) {
|
||||
firSymbolBuilder.variableLikeBuilder.buildValueParameterSymbol(it)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun getFileSymbol(psi: KtFile): KtFileSymbol = withValidityAssertion {
|
||||
firSymbolBuilder.buildFileSymbol(psi.getOrBuildFirFile(resolveState))
|
||||
firSymbolBuilder.buildFileSymbol(psi.getOrBuildFirFile(resolveState).symbol)
|
||||
}
|
||||
|
||||
override fun getFunctionLikeSymbol(psi: KtNamedFunction): KtFunctionLikeSymbol = withValidityAssertion {
|
||||
psi.withFirDeclarationOfType<FirFunction, KtFunctionLikeSymbol>(resolveState) { fir ->
|
||||
psi.withFirSymbolOfType<FirFunctionSymbol<*>, KtFunctionLikeSymbol>(resolveState) { fir ->
|
||||
when (fir) {
|
||||
is FirSimpleFunction -> {
|
||||
is FirNamedFunctionSymbol -> {
|
||||
if (fir.origin == FirDeclarationOrigin.SamConstructor) {
|
||||
firSymbolBuilder.functionLikeBuilder.buildSamConstructorSymbol(fir)
|
||||
} else {
|
||||
firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(fir)
|
||||
}
|
||||
}
|
||||
is FirAnonymousFunction -> firSymbolBuilder.functionLikeBuilder.buildAnonymousFunctionSymbol(fir)
|
||||
else -> error("Unexpected ${fir.renderWithType()}")
|
||||
is FirAnonymousFunctionSymbol -> firSymbolBuilder.functionLikeBuilder.buildAnonymousFunctionSymbol(fir)
|
||||
else -> error("Unexpected ${fir.fir.renderWithType()}")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun getConstructorSymbol(psi: KtConstructor<*>): KtConstructorSymbol = withValidityAssertion {
|
||||
psi.withFirDeclarationOfType<FirConstructor, KtConstructorSymbol>(resolveState) {
|
||||
psi.withFirSymbolOfType<FirConstructorSymbol, KtConstructorSymbol>(resolveState) {
|
||||
firSymbolBuilder.functionLikeBuilder.buildConstructorSymbol(it)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getTypeParameterSymbol(psi: KtTypeParameter): KtTypeParameterSymbol = withValidityAssertion {
|
||||
psi.withFirDeclarationOfType<FirTypeParameter, KtTypeParameterSymbol>(resolveState) {
|
||||
psi.withFirSymbolOfType<FirTypeParameterSymbol, KtTypeParameterSymbol>(resolveState) {
|
||||
firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(it)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getTypeAliasSymbol(psi: KtTypeAlias): KtTypeAliasSymbol = withValidityAssertion {
|
||||
psi.withFirDeclarationOfType<FirTypeAlias, KtTypeAliasSymbol>(resolveState) {
|
||||
psi.withFirSymbolOfType<FirTypeAliasSymbol, KtTypeAliasSymbol>(resolveState) {
|
||||
firSymbolBuilder.classifierBuilder.buildTypeAliasSymbol(it)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getEnumEntrySymbol(psi: KtEnumEntry): KtEnumEntrySymbol = withValidityAssertion {
|
||||
psi.withFirDeclarationOfType<FirEnumEntry, KtEnumEntrySymbol>(resolveState) {
|
||||
psi.withFirSymbolOfType<FirEnumEntrySymbol, KtEnumEntrySymbol>(resolveState) {
|
||||
firSymbolBuilder.buildEnumEntrySymbol(it)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getAnonymousFunctionSymbol(psi: KtNamedFunction): KtAnonymousFunctionSymbol = withValidityAssertion {
|
||||
psi.withFirDeclarationOfType<FirSimpleFunction, KtFunctionSymbol>(resolveState) {
|
||||
psi.withFirSymbolOfType<FirNamedFunctionSymbol, KtFunctionSymbol>(resolveState) {
|
||||
firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(it)
|
||||
}
|
||||
firSymbolBuilder.functionLikeBuilder.buildAnonymousFunctionSymbol(psi.getOrBuildFirOfType(resolveState))
|
||||
}
|
||||
|
||||
override fun getAnonymousFunctionSymbol(psi: KtFunctionLiteral): KtAnonymousFunctionSymbol = withValidityAssertion {
|
||||
psi.withFirDeclarationOfType<FirAnonymousFunction, KtAnonymousFunctionSymbol>(resolveState) {
|
||||
psi.withFirSymbolOfType<FirAnonymousFunctionSymbol, KtAnonymousFunctionSymbol>(resolveState) {
|
||||
firSymbolBuilder.functionLikeBuilder.buildAnonymousFunctionSymbol(it)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getVariableSymbol(psi: KtProperty): KtVariableSymbol = withValidityAssertion {
|
||||
psi.withFirDeclarationOfType<FirProperty, KtVariableSymbol>(resolveState) {
|
||||
psi.withFirSymbolOfType<FirPropertySymbol, KtVariableSymbol>(resolveState) {
|
||||
firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(it)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getAnonymousObjectSymbol(psi: KtObjectLiteralExpression): KtAnonymousObjectSymbol = withValidityAssertion {
|
||||
psi.objectDeclaration.withFirDeclarationOfType<FirAnonymousObject, KtAnonymousObjectSymbol>(resolveState) {
|
||||
psi.objectDeclaration.withFirSymbolOfType<FirAnonymousObjectSymbol, KtAnonymousObjectSymbol>(resolveState) {
|
||||
firSymbolBuilder.classifierBuilder.buildAnonymousObjectSymbol(it)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getClassOrObjectSymbol(psi: KtClassOrObject): KtClassOrObjectSymbol = withValidityAssertion {
|
||||
psi.withFirDeclarationOfType<FirClass, KtClassOrObjectSymbol>(resolveState) {
|
||||
psi.withFirSymbolOfType<FirClassSymbol<*>, KtClassOrObjectSymbol>(resolveState) {
|
||||
firSymbolBuilder.classifierBuilder.buildClassOrObjectSymbol(it)
|
||||
}
|
||||
}
|
||||
@@ -130,31 +129,31 @@ internal class KtFirSymbolProvider(
|
||||
require(psi !is KtObjectDeclaration || psi.parent !is KtObjectLiteralExpression)
|
||||
// A KtClassOrObject may also map to an FirEnumEntry. Hence, we need to return null in this case.
|
||||
if (psi is KtEnumEntry) return null
|
||||
psi.withFirDeclarationOfType<FirRegularClass, KtNamedClassOrObjectSymbol>(resolveState) {
|
||||
psi.withFirSymbolOfType<FirRegularClassSymbol, KtNamedClassOrObjectSymbol>(resolveState) {
|
||||
firSymbolBuilder.classifierBuilder.buildNamedClassOrObjectSymbol(it)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getPropertyAccessorSymbol(psi: KtPropertyAccessor): KtPropertyAccessorSymbol = withValidityAssertion {
|
||||
psi.withFirDeclarationOfType<FirPropertyAccessor, KtPropertyAccessorSymbol>(resolveState) {
|
||||
psi.withFirSymbolOfType<FirPropertyAccessorSymbol, KtPropertyAccessorSymbol>(resolveState) {
|
||||
firSymbolBuilder.callableBuilder.buildPropertyAccessorSymbol(it)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getClassInitializerSymbol(psi: KtClassInitializer): KtClassInitializerSymbol = withValidityAssertion {
|
||||
psi.withFirDeclarationOfType<FirAnonymousInitializer, KtClassInitializerSymbol>(resolveState) {
|
||||
psi.withFirSymbolOfType<FirAnonymousInitializerSymbol, KtClassInitializerSymbol>(resolveState) {
|
||||
firSymbolBuilder.anonymousInitializerBuilder.buildClassInitializer(it)
|
||||
}
|
||||
}
|
||||
|
||||
override fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol? = withValidityAssertion {
|
||||
val symbol = firSymbolProvider.getClassLikeSymbolByClassId(classId) as? FirRegularClassSymbol ?: return null
|
||||
firSymbolBuilder.classifierBuilder.buildNamedClassOrObjectSymbol(symbol.fir)
|
||||
firSymbolBuilder.classifierBuilder.buildNamedClassOrObjectSymbol(symbol)
|
||||
}
|
||||
|
||||
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): Sequence<KtSymbol> {
|
||||
val firs = firSymbolProvider.getTopLevelCallableSymbols(packageFqName, name)
|
||||
return firs.asSequence().map { firSymbol -> firSymbolBuilder.buildSymbol(firSymbol.fir) }
|
||||
return firs.asSequence().map { firSymbol -> firSymbolBuilder.buildSymbol(firSymbol) }
|
||||
}
|
||||
|
||||
override val ROOT_PACKAGE_SYMBOL: KtPackageSymbol = KtFirPackageSymbol(FqName.ROOT, resolveState.project, token)
|
||||
|
||||
+41
-45
@@ -10,11 +10,8 @@ import org.jetbrains.kotlin.analysis.api.KtInitializerValue
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirJavaSyntheticPropertySymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.asKtInitializerValue
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.*
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
@@ -24,76 +21,75 @@ import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.containingClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isOverride
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isStatic
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.modality
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.visibility
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.isExtension
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
internal class KtFirSyntheticJavaPropertySymbol(
|
||||
fir: FirSyntheticProperty,
|
||||
resolveState: FirModuleResolveState,
|
||||
override val firSymbol: FirSyntheticPropertySymbol,
|
||||
override val resolveState: FirModuleResolveState,
|
||||
override val token: ValidityToken,
|
||||
private val builder: KtSymbolByFirBuilder
|
||||
) : KtSyntheticJavaPropertySymbol(), KtFirSymbol<FirSyntheticProperty> {
|
||||
override val firRef = firRef(fir, resolveState)
|
||||
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) }
|
||||
) : KtSyntheticJavaPropertySymbol(), KtFirSymbol<FirSyntheticPropertySymbol> {
|
||||
override val psi: PsiElement? by cached { firSymbol.findPsi() }
|
||||
|
||||
override val isVal: Boolean get() = firRef.withFir { it.isVal }
|
||||
override val name: Name get() = firRef.withFir { it.name }
|
||||
override val returnType: KtType by cached {
|
||||
firRef.returnType(FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, builder)
|
||||
}
|
||||
override val isVal: Boolean get() = withValidityAssertion { firSymbol.isVal }
|
||||
override val name: Name get() = withValidityAssertion { firSymbol.name }
|
||||
|
||||
override val typeParameters: List<KtTypeParameterSymbol> by cached {
|
||||
fir.typeParameters.map { builder.classifierBuilder.buildTypeParameterSymbol(it) }
|
||||
}
|
||||
override val returnType: KtType get() = withValidityAssertion { firSymbol.returnType(builder) }
|
||||
override val receiverType: KtType? get() = withValidityAssertion { firSymbol.receiverType(builder) }
|
||||
|
||||
override val receiverType: KtType? by cached {
|
||||
firRef.receiverType(builder)
|
||||
}
|
||||
override val isExtension: Boolean get() = firRef.withFir { it.receiverTypeRef != null }
|
||||
override val initializer: KtInitializerValue? by firRef.withFirAndCache(FirResolvePhase.BODY_RESOLVE) { fir ->
|
||||
fir.initializer?.asKtInitializerValue()
|
||||
}
|
||||
|
||||
override val modality: Modality get() = getModality()
|
||||
override val visibility: Visibility get() = getVisibility()
|
||||
|
||||
override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firRef, resolveState.rootModuleSession, token) }
|
||||
override val typeParameters: List<KtTypeParameterSymbol>
|
||||
get() = withValidityAssertion { firSymbol.createKtTypeParameters(builder) }
|
||||
|
||||
|
||||
override val callableIdIfNonLocal: CallableId? get() = getCallableIdIfNonLocal()
|
||||
override val isExtension: Boolean get() = withValidityAssertion { firSymbol.isExtension }
|
||||
|
||||
override val getter: KtPropertyGetterSymbol by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { property ->
|
||||
property.getter.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as KtPropertyGetterSymbol
|
||||
}
|
||||
override val initializer: KtInitializerValue? by cached { firSymbol.getKtConstantInitializer() }
|
||||
|
||||
override val modality: Modality get() = withValidityAssertion { firSymbol.modality ?: firSymbol.invalidModalityError() }
|
||||
override val visibility: Visibility get() = withValidityAssertion { firSymbol.visibility }
|
||||
|
||||
override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, resolveState.rootModuleSession, token) }
|
||||
|
||||
override val callableIdIfNonLocal: CallableId? get() = withValidityAssertion { firSymbol.getCallableIdIfNonLocal() }
|
||||
|
||||
override val getter: KtPropertyGetterSymbol
|
||||
get() = withValidityAssertion {
|
||||
builder.callableBuilder.buildGetterSymbol(firSymbol.getterSymbol!!)
|
||||
}
|
||||
override val javaGetterSymbol: KtFunctionSymbol
|
||||
get() {
|
||||
return firRef.withFir { builder.functionLikeBuilder.buildFunctionSymbol(it.getter.delegate) }
|
||||
val fir = firSymbol.fir as FirSyntheticProperty
|
||||
return builder.functionLikeBuilder.buildFunctionSymbol(fir.getter.delegate.symbol)
|
||||
}
|
||||
override val javaSetterSymbol: KtFunctionSymbol?
|
||||
get() {
|
||||
return firRef.withFir { fir ->
|
||||
fir.setter?.delegate?.let { setter -> builder.functionLikeBuilder.buildFunctionSymbol(setter) }
|
||||
}
|
||||
val fir = firSymbol.fir as FirSyntheticProperty
|
||||
return fir.setter?.delegate?.let { builder.functionLikeBuilder.buildFunctionSymbol(it.symbol) }
|
||||
}
|
||||
|
||||
override val setter: KtPropertySetterSymbol? by firRef.withFirAndCache(FirResolvePhase.RAW_FIR) { property ->
|
||||
property.setter?.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as? KtPropertySetterSymbol
|
||||
}
|
||||
override val setter: KtPropertySetterSymbol?
|
||||
get() = withValidityAssertion {
|
||||
firSymbol.setterSymbol?.let { builder.callableBuilder.buildPropertyAccessorSymbol(it) } as? KtPropertySetterSymbol
|
||||
}
|
||||
|
||||
override val isFromPrimaryConstructor: Boolean get() = false
|
||||
override val isOverride: Boolean get() = firRef.withFir { it.isOverride }
|
||||
override val isStatic: Boolean get() = firRef.withFir { it.isStatic }
|
||||
override val isFromPrimaryConstructor: Boolean get() = withValidityAssertion { false }
|
||||
override val isOverride: Boolean get() = withValidityAssertion { firSymbol.isOverride }
|
||||
override val isStatic: Boolean get() = withValidityAssertion { firSymbol.isStatic }
|
||||
|
||||
override val hasSetter: Boolean get() = firRef.withFir { it.setter != null }
|
||||
override val hasSetter: Boolean get() = withValidityAssertion { firSymbol.setterSymbol != null }
|
||||
|
||||
override val origin: KtSymbolOrigin get() = withValidityAssertion { KtSymbolOrigin.JAVA_SYNTHETIC_PROPERTY }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtSyntheticJavaPropertySymbol> {
|
||||
val containingClassId = firRef.withFir { it.containingClass()?.classId }
|
||||
val containingClassId = firSymbol.containingClass()?.classId
|
||||
?: error("Cannot find parent class for synthetic java property $callableIdIfNonLocal")
|
||||
|
||||
return KtFirJavaSyntheticPropertySymbolPointer(containingClassId, name)
|
||||
|
||||
+20
-29
@@ -7,58 +7,49 @@ package org.jetbrains.kotlin.analysis.api.fir.symbols
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.isLocal
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.weakRef
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeAliasSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.visibility
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
internal class KtFirTypeAliasSymbol(
|
||||
fir: FirTypeAlias,
|
||||
private val resolveState: FirModuleResolveState,
|
||||
override val firSymbol: FirTypeAliasSymbol,
|
||||
override val resolveState: FirModuleResolveState,
|
||||
override val token: ValidityToken,
|
||||
private val builder: KtSymbolByFirBuilder,
|
||||
) : KtTypeAliasSymbol(), KtFirSymbol<FirTypeAlias> {
|
||||
) : KtTypeAliasSymbol(), KtFirSymbol<FirTypeAliasSymbol> {
|
||||
|
||||
override val firRef = firRef(fir, resolveState)
|
||||
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) }
|
||||
override val name: Name get() = firRef.withFir { it.name }
|
||||
override val classIdIfNonLocal: ClassId get() = firRef.withFir { it.symbol.classId }
|
||||
override val psi: PsiElement? by cached { firSymbol.findPsi() }
|
||||
override val name: Name get() = withValidityAssertion { firSymbol.name }
|
||||
override val classIdIfNonLocal: ClassId? get() = withValidityAssertion { firSymbol.getClassIdIfNonLocal() }
|
||||
|
||||
override val visibility: Visibility
|
||||
get() = when (val possiblyRawVisibility = getVisibility(FirResolvePhase.RAW_FIR)) {
|
||||
Visibilities.Unknown -> Visibilities.Public
|
||||
else -> possiblyRawVisibility
|
||||
get() = withValidityAssertion {
|
||||
when (val possiblyRawVisibility = firSymbol.fir.visibility) {
|
||||
Visibilities.Unknown -> Visibilities.Public
|
||||
else -> possiblyRawVisibility
|
||||
}
|
||||
}
|
||||
|
||||
override val typeParameters by firRef.withFirAndCache { fir ->
|
||||
fir.typeParameters.filterIsInstance<FirTypeParameter>().map { typeParameter ->
|
||||
builder.classifierBuilder.buildTypeParameterSymbol(typeParameter.symbol.fir)
|
||||
}
|
||||
}
|
||||
override val typeParameters by cached { firSymbol.createKtTypeParameters(builder) }
|
||||
|
||||
override val expandedType: KtType by firRef.withFirAndCache(FirResolvePhase.SUPER_TYPES) { fir ->
|
||||
builder.typeBuilder.buildKtType(fir.expandedTypeRef)
|
||||
}
|
||||
override val expandedType: KtType by cached { builder.typeBuilder.buildKtType(firSymbol.resolvedExpandedTypeRef) }
|
||||
|
||||
override val annotationsList: KtAnnotationsList by cached {
|
||||
KtFirAnnotationListForDeclaration.create(firRef, resolveState.rootModuleSession, token)
|
||||
KtFirAnnotationListForDeclaration.create(firSymbol, resolveState.rootModuleSession, token)
|
||||
}
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtTypeAliasSymbol> {
|
||||
|
||||
+18
-23
@@ -6,27 +6,26 @@
|
||||
package org.jetbrains.kotlin.analysis.api.fir.symbols
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.FirRefWithValidityCheck
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.resolveSupertypesInTheAir
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
|
||||
|
||||
internal fun FirRefWithValidityCheck<FirClass>.superTypesList(builder: KtSymbolByFirBuilder): List<KtType> =
|
||||
withFir(FirResolvePhase.SUPER_TYPES) { fir ->
|
||||
fir.superTypeRefs.mapToKtType(builder)
|
||||
internal fun FirClassSymbol<*>.superTypesList(builder: KtSymbolByFirBuilder): List<KtType> =
|
||||
resolvedSuperTypeRefs.mapToKtType(builder)
|
||||
|
||||
internal fun FirRegularClassSymbol.superTypesAndAnnotationsListForRegularClass(builder: KtSymbolByFirBuilder): List<KtType> {
|
||||
val fir = fir
|
||||
|
||||
if (fir.resolvePhase >= FirResolvePhase.SUPER_TYPES) {
|
||||
return fir.superTypeRefs.mapToKtType(builder)
|
||||
}
|
||||
|
||||
internal fun FirRefWithValidityCheck<FirRegularClass>.superTypesAndAnnotationsListForRegularClass(builder: KtSymbolByFirBuilder): List<KtType> {
|
||||
return withFir { fir ->
|
||||
if (fir.resolvePhase >= FirResolvePhase.SUPER_TYPES) {
|
||||
fir.superTypeRefs.mapToKtType(builder)
|
||||
} else null
|
||||
} ?: withFirByType(ResolveType.NoResolve) { fir ->
|
||||
fir.resolveSupertypesInTheAir(builder.rootSession).mapToKtType(builder)
|
||||
}
|
||||
return fir.resolveSupertypesInTheAir(builder.rootSession).mapToKtType(builder)
|
||||
}
|
||||
|
||||
private fun List<FirTypeRef>.mapToKtType(
|
||||
@@ -35,15 +34,11 @@ private fun List<FirTypeRef>.mapToKtType(
|
||||
builder.typeBuilder.buildKtType(typeRef)
|
||||
}
|
||||
|
||||
internal fun FirRefWithValidityCheck<FirTypedDeclaration>.returnType(
|
||||
typeResolvePhase: FirResolvePhase,
|
||||
builder: KtSymbolByFirBuilder
|
||||
) = withFir(typeResolvePhase) { builder.typeBuilder.buildKtType(it.returnTypeRef) }
|
||||
internal fun FirCallableSymbol<*>.returnType(builder: KtSymbolByFirBuilder): KtType =
|
||||
builder.typeBuilder.buildKtType(resolvedReturnType)
|
||||
|
||||
internal fun FirRefWithValidityCheck<FirCallableDeclaration>.receiverType(
|
||||
builder: KtSymbolByFirBuilder
|
||||
): KtType? = withFir(FirResolvePhase.TYPES) { fir ->
|
||||
fir.receiverTypeRef?.let { receiver ->
|
||||
internal fun FirCallableSymbol<*>.receiverType(builder: KtSymbolByFirBuilder): KtType? =
|
||||
resolvedReceiverTypeRef?.let { receiver ->
|
||||
builder.typeBuilder.buildKtType(receiver)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+14
-16
@@ -6,38 +6,36 @@
|
||||
package org.jetbrains.kotlin.analysis.api.fir.symbols
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.weakRef
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.types.Variance
|
||||
|
||||
internal class KtFirTypeParameterSymbol(
|
||||
fir: FirTypeParameter,
|
||||
resolveState: FirModuleResolveState,
|
||||
override val firSymbol: FirTypeParameterSymbol,
|
||||
override val resolveState: FirModuleResolveState,
|
||||
override val token: ValidityToken,
|
||||
private val builder: KtSymbolByFirBuilder
|
||||
) : KtTypeParameterSymbol(), KtFirSymbol<FirTypeParameter> {
|
||||
override val firRef = firRef(fir, resolveState)
|
||||
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) }
|
||||
) : KtTypeParameterSymbol(), KtFirSymbol<FirTypeParameterSymbol> {
|
||||
override val psi: PsiElement? by cached { firSymbol.findPsi() }
|
||||
|
||||
override val name: Name get() = firRef.withFir { it.name }
|
||||
override val name: Name get() = withValidityAssertion { firSymbol.name }
|
||||
|
||||
override val upperBounds: List<KtType> by firRef.withFirAndCache(FirResolvePhase.TYPES) { fir ->
|
||||
fir.bounds.map { type -> builder.typeBuilder.buildKtType(type) }
|
||||
override val upperBounds: List<KtType> by cached {
|
||||
firSymbol.resolvedBounds.map { type -> builder.typeBuilder.buildKtType(type) }
|
||||
}
|
||||
|
||||
override val variance: Variance get() = firRef.withFir { it.variance }
|
||||
override val isReified: Boolean get() = firRef.withFir { it.isReified }
|
||||
override val variance: Variance get() = withValidityAssertion { firSymbol.variance }
|
||||
override val isReified: Boolean get() = withValidityAssertion { firSymbol.isReified }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtTypeParameterSymbol> {
|
||||
KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it }
|
||||
|
||||
+50
-55
@@ -10,27 +10,25 @@ import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.annotations.KtFirAnnotationListForDeclaration
|
||||
import org.jetbrains.kotlin.analysis.api.fir.findPsi
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtPsiBasedSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFirOfType
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.withFirDeclaration
|
||||
import org.jetbrains.kotlin.builtins.StandardNames
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirValueParameter
|
||||
import org.jetbrains.kotlin.fir.declarations.getAnnotationsByClassId
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||
import org.jetbrains.kotlin.fir.expressions.FirConstExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.unwrapArgument
|
||||
import org.jetbrains.kotlin.fir.psi
|
||||
import org.jetbrains.kotlin.fir.renderWithType
|
||||
import org.jetbrains.kotlin.fir.symbols.ensureResolved
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.types.arrayElementType
|
||||
import org.jetbrains.kotlin.fir.types.coneType
|
||||
import org.jetbrains.kotlin.fir.types.customAnnotations
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.name.StandardClassIds
|
||||
@@ -39,68 +37,32 @@ import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
|
||||
internal class KtFirValueParameterSymbol(
|
||||
fir: FirValueParameter,
|
||||
resolveState: FirModuleResolveState,
|
||||
override val firSymbol: FirValueParameterSymbol,
|
||||
override val resolveState: FirModuleResolveState,
|
||||
override val token: ValidityToken,
|
||||
private val builder: KtSymbolByFirBuilder
|
||||
) : KtValueParameterSymbol(), KtFirSymbol<FirValueParameter> {
|
||||
override val firRef = firRef(fir, resolveState)
|
||||
override val psi: PsiElement? by firRef.withFirAndCache { fir -> fir.findPsi(fir.moduleData.session) }
|
||||
) : KtValueParameterSymbol(), KtFirSymbol<FirValueParameterSymbol> {
|
||||
override val psi: PsiElement? by cached { firSymbol.findPsi() }
|
||||
|
||||
override val name: Name by cached {
|
||||
firRef.withFir { fir ->
|
||||
val defaultName = fir.name
|
||||
if (fir.psi != null) return@withFir defaultName
|
||||
override val name: Name by cached { firSymbol.getNameByAnnotation(resolveState) }
|
||||
|
||||
// The case where PSI is null is when calling `invoke()` on a variable with functional type, e.g. `x(1)` below:
|
||||
//
|
||||
// fun foo(x: (item: Int) -> Unit) { x(1) }
|
||||
// fun bar(x: Function1<@ParameterName("item") Int, Unit>) { x(1) }
|
||||
//
|
||||
// The function being called is `invoke(p1: Int)` on `Function1<Int, Unit>` which is from the stdlib, and therefore no source
|
||||
// PSI for the function or its parameters. In that case, we use the `@ParameterName` annotation on the parameter type if present
|
||||
// and fall back to the parameter names from the `invoke()` function (`p1`, `p2`, etc.).
|
||||
//
|
||||
// Note: During type resolution, `@ParameterName` type annotations are added based on the names (which are optional) in the
|
||||
// function type notation. Therefore the `x` parameter in both example functions above have the same type and type annotations.
|
||||
fir.withFirDeclaration(resolveState, FirResolvePhase.TYPES) {
|
||||
val parameterNameAnnotation =
|
||||
fir.returnTypeRef.coneType.attributes.customAnnotations
|
||||
.getAnnotationsByClassId(StandardNames.FqNames.parameterNameClassId)
|
||||
.singleOrNull()?.safeAs<FirAnnotation>() ?: return@withFirDeclaration defaultName
|
||||
override val isVararg: Boolean get() = withValidityAssertion { firSymbol.isVararg }
|
||||
|
||||
// The parent KtDeclaration is where the variable with functional type and `@ParameterName` annotation is declared.
|
||||
val parentKtDeclaration =
|
||||
parameterNameAnnotation.psi?.getNonStrictParentOfType<KtDeclaration>() ?: return@withFirDeclaration defaultName
|
||||
val parentFirDeclaration = parentKtDeclaration.getOrBuildFirOfType<FirDeclaration>(resolveState)
|
||||
|
||||
// Resolve to ARGUMENTS_OF_ANNOTATIONS phase to get `name` argument from mapping.
|
||||
val parameterNameFromAnnotation =
|
||||
parentFirDeclaration.withFirDeclaration(resolveState, FirResolvePhase.ARGUMENTS_OF_ANNOTATIONS) {
|
||||
val nameArgument =
|
||||
parameterNameAnnotation.argumentMapping.mapping[StandardClassIds.Annotations.ParameterNames.parameterNameName]
|
||||
nameArgument?.unwrapArgument()?.safeAs<FirConstExpression<*>>()?.value as? String
|
||||
}
|
||||
parameterNameFromAnnotation?.let { Name.identifier(it) } ?: defaultName
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override val isVararg: Boolean get() = firRef.withFir { it.isVararg }
|
||||
override val returnType: KtType by firRef.withFirAndCache(FirResolvePhase.TYPES) { fir ->
|
||||
if (fir.isVararg) {
|
||||
override val returnType by cached {
|
||||
val returnType = firSymbol.resolvedReturnType
|
||||
return@cached if (firSymbol.isVararg) {
|
||||
// There SHOULD always be an array element type (even if it is an error type, e.g., unresolved).
|
||||
val arrayElementType = fir.returnTypeRef.coneType.arrayElementType()
|
||||
?: error("No array element type for vararg value parameter: ${fir.renderWithType()}")
|
||||
val arrayElementType = returnType.arrayElementType()
|
||||
?: error("No array element type for vararg value parameter: ${firSymbol.fir.renderWithType()}")
|
||||
builder.typeBuilder.buildKtType(arrayElementType)
|
||||
} else {
|
||||
firRef.returnType(FirResolvePhase.TYPES, builder)
|
||||
builder.typeBuilder.buildKtType(returnType)
|
||||
}
|
||||
}
|
||||
|
||||
override val hasDefaultValue: Boolean get() = firRef.withFir { it.defaultValue != null }
|
||||
override val hasDefaultValue: Boolean get() = withValidityAssertion { firSymbol.hasDefaultValue }
|
||||
|
||||
override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firRef, resolveState.rootModuleSession, token) }
|
||||
override val annotationsList by cached { KtFirAnnotationListForDeclaration.create(firSymbol, resolveState.rootModuleSession, token) }
|
||||
|
||||
override fun createPointer(): KtSymbolPointer<KtValueParameterSymbol> {
|
||||
KtPsiBasedSymbolPointer.createForSymbolFromSource(this)?.let { return it }
|
||||
@@ -110,3 +72,36 @@ internal class KtFirValueParameterSymbol(
|
||||
override fun equals(other: Any?): Boolean = symbolEquals(other)
|
||||
override fun hashCode(): Int = symbolHashCode()
|
||||
}
|
||||
|
||||
|
||||
private fun FirValueParameterSymbol.getNameByAnnotation(resolveState: FirModuleResolveState): Name {
|
||||
val defaultName = fir.name
|
||||
if (fir.psi != null) return defaultName
|
||||
|
||||
// The case where PSI is null is when calling `invoke()` on a variable with functional type, e.g. `x(1)` below:
|
||||
//
|
||||
// fun foo(x: (item: Int) -> Unit) { x(1) }
|
||||
// fun bar(x: Function1<@ParameterName("item") Int, Unit>) { x(1) }
|
||||
//
|
||||
// The function being called is `invoke(p1: Int)` on `Function1<Int, Unit>` which is from the stdlib, and therefore no source
|
||||
// PSI for the function or its parameters. In that case, we use the `@ParameterName` annotation on the parameter type if present
|
||||
// and fall back to the parameter names from the `invoke()` function (`p1`, `p2`, etc.).
|
||||
//
|
||||
// Note: During type resolution, `@ParameterName` type annotations are added based on the names (which are optional) in the
|
||||
// function type notation. Therefore the `x` parameter in both example functions above have the same type and type annotations.
|
||||
val parameterNameAnnotation =
|
||||
resolvedReturnType.attributes.customAnnotations
|
||||
.getAnnotationsByClassId(StandardNames.FqNames.parameterNameClassId)
|
||||
.singleOrNull()?.safeAs<FirAnnotation>() ?: return defaultName
|
||||
|
||||
// The parent KtDeclaration is where the variable with functional type and `@ParameterName` annotation is declared.
|
||||
val parentKtDeclaration =
|
||||
parameterNameAnnotation.psi?.getNonStrictParentOfType<KtDeclaration>() ?: return defaultName
|
||||
val parentFirDeclaration = parentKtDeclaration.getOrBuildFirOfType<FirDeclaration>(resolveState)
|
||||
|
||||
// Resolve to ARGUMENTS_OF_ANNOTATIONS phase to get `name` argument from mapping.
|
||||
parentFirDeclaration.ensureResolved(FirResolvePhase.ARGUMENTS_OF_ANNOTATIONS)
|
||||
val nameArgument = parameterNameAnnotation.argumentMapping.mapping[StandardClassIds.Annotations.ParameterNames.parameterNameName]
|
||||
val parameterNameFromAnnotation = nameArgument?.unwrapArgument()?.safeAs<FirConstExpression<*>>()?.value as? String
|
||||
return parameterNameFromAnnotation?.let { Name.identifier(it) } ?: defaultName
|
||||
}
|
||||
+47
-26
@@ -5,47 +5,68 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.fir.symbols
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.analysis.api.KtInitializerValue
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtSymbolByFirBuilder
|
||||
import org.jetbrains.kotlin.analysis.api.fir.utils.asKtInitializerValue
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getElementTextInContext
|
||||
import org.jetbrains.kotlin.fir.FirRenderer
|
||||
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.modality
|
||||
import org.jetbrains.kotlin.fir.declarations.utils.visibility
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameterRefsOwner
|
||||
import org.jetbrains.kotlin.fir.psi
|
||||
import org.jetbrains.kotlin.fir.renderWithType
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.util.getElementTextInContext
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ensureResolved
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||
|
||||
internal fun KtFirSymbol<FirMemberDeclaration>.getModality(
|
||||
phase: FirResolvePhase = FirResolvePhase.STATUS,
|
||||
defaultModality: Modality? = null
|
||||
): Modality {
|
||||
return firRef.withFir(phase) { fir ->
|
||||
fir.modality
|
||||
?: defaultModality
|
||||
?: fir.invalidModalityError()
|
||||
}
|
||||
}
|
||||
|
||||
private fun FirDeclaration.invalidModalityError(): Nothing {
|
||||
internal fun FirCallableSymbol<*>.invalidModalityError(): Nothing {
|
||||
error(
|
||||
"""|Symbol modality should not be null, looks like the FIR symbol was not properly resolved
|
||||
|
|
||||
|${renderWithType(FirRenderer.RenderMode.WithResolvePhases)}
|
||||
|${fir.renderWithType(FirRenderer.RenderMode.WithResolvePhases)}
|
||||
|
|
||||
|${(psi as? KtDeclaration)?.getElementTextInContext()}""".trimMargin()
|
||||
|${(fir.psi as? KtDeclaration)?.getElementTextInContext()}""".trimMargin()
|
||||
)
|
||||
}
|
||||
|
||||
internal fun FirFunctionSymbol<*>.createKtValueParameters(builder: KtSymbolByFirBuilder): List<KtValueParameterSymbol> {
|
||||
return fir.valueParameters.map { valueParameter ->
|
||||
builder.variableLikeBuilder.buildValueParameterSymbol(valueParameter.symbol)
|
||||
}
|
||||
}
|
||||
|
||||
internal fun KtFirSymbol<FirMemberDeclaration>.getVisibility(
|
||||
phase: FirResolvePhase = FirResolvePhase.STATUS
|
||||
): Visibility =
|
||||
firRef.withFir(phase) { fir -> fir.visibility }
|
||||
internal fun <D> FirBasedSymbol<D>.createKtTypeParameters(
|
||||
builder: KtSymbolByFirBuilder
|
||||
): List<KtFirTypeParameterSymbol> where D : FirTypeParameterRefsOwner, D : FirDeclaration {
|
||||
return fir.typeParameters.map { typeParameter ->
|
||||
builder.classifierBuilder.buildTypeParameterSymbol(typeParameter.symbol)
|
||||
}
|
||||
}
|
||||
|
||||
internal fun KtFirSymbol<FirCallableDeclaration>.getCallableIdIfNonLocal(): CallableId? =
|
||||
firRef.withFir { fir -> fir.symbol.callableId.takeUnless { it.isLocal } }
|
||||
|
||||
internal fun FirCallableSymbol<*>.getCallableIdIfNonLocal(): CallableId? =
|
||||
callableId.takeUnless { it.isLocal }
|
||||
|
||||
internal fun FirClassLikeSymbol<*>.getClassIdIfNonLocal(): ClassId? =
|
||||
classId.takeUnless { it.isLocal }
|
||||
|
||||
internal fun FirCallableSymbol<*>.dispatchReceiverType(
|
||||
builder: KtSymbolByFirBuilder,
|
||||
): KtType? {
|
||||
return dispatchReceiverType?.let { builder.typeBuilder.buildKtType(it) }
|
||||
}
|
||||
|
||||
internal fun FirVariableSymbol<*>.getKtConstantInitializer(): KtInitializerValue? {
|
||||
ensureResolved(FirResolvePhase.BODY_RESOLVE)
|
||||
val firInitializer = fir.initializer ?: return null
|
||||
return firInitializer.asKtInitializerValue()
|
||||
}
|
||||
|
||||
+1
-3
@@ -21,9 +21,7 @@ internal class KtFirBackingFieldSymbolPointer(
|
||||
@Suppress("DEPRECATION")
|
||||
val propertySymbol = propertySymbolPointer.restoreSymbol(analysisSession) ?: return null
|
||||
check(propertySymbol is KtFirKotlinPropertySymbol)
|
||||
return propertySymbol.firRef.withFir { firProperty ->
|
||||
analysisSession.firSymbolBuilder.variableLikeBuilder.buildBackingFieldSymbolByProperty(firProperty)
|
||||
}
|
||||
return analysisSession.firSymbolBuilder.variableLikeBuilder.buildBackingFieldSymbolByProperty(propertySymbol.firSymbol)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+3
-3
@@ -5,11 +5,11 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol
|
||||
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
|
||||
@@ -26,7 +26,7 @@ internal class KtFirConstructorSymbolPointer(
|
||||
candidates.findDeclarationWithSignature<FirConstructor>(signature, firSession) { processDeclaredConstructors(it) }
|
||||
?: return null
|
||||
if (firConstructor.isPrimary != isPrimary) return null
|
||||
return firSymbolBuilder.functionLikeBuilder.buildConstructorSymbol(firConstructor)
|
||||
return firSymbolBuilder.functionLikeBuilder.buildConstructorSymbol(firConstructor.symbol)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -5,13 +5,13 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
@@ -26,7 +26,7 @@ internal class KtFirEnumEntrySymbolPointer(
|
||||
?: return null
|
||||
val enumEntry = enumClass.enumEntryByName(name)
|
||||
?: return null
|
||||
return analysisSession.firSymbolBuilder.buildEnumEntrySymbol(enumEntry)
|
||||
return analysisSession.firSymbolBuilder.buildEnumEntrySymbol(enumEntry.symbol)
|
||||
}
|
||||
|
||||
private fun getEnumClass(analysisSession: KtFirAnalysisSession, classId: ClassId): FirRegularClass? {
|
||||
|
||||
+1
-1
@@ -28,6 +28,6 @@ internal class KtFirJavaFieldSymbolPointer(
|
||||
.singleOrNull()
|
||||
?: return null
|
||||
|
||||
return firSymbolBuilder.variableLikeBuilder.buildFieldSymbol(javaField)
|
||||
return firSymbolBuilder.variableLikeBuilder.buildFieldSymbol(javaField.symbol)
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -28,6 +28,6 @@ internal class KtFirJavaSyntheticPropertySymbolPointer(
|
||||
.singleOrNull()
|
||||
?: return null
|
||||
|
||||
return firSymbolBuilder.variableLikeBuilder.buildSyntheticJavaPropertySymbol(syntheticProperty)
|
||||
return firSymbolBuilder.variableLikeBuilder.buildSyntheticJavaPropertySymbol(syntheticProperty.symbol)
|
||||
}
|
||||
}
|
||||
+3
-3
@@ -5,11 +5,11 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
|
||||
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -26,7 +26,7 @@ internal class KtFirMemberFunctionSymbolPointer(
|
||||
val firFunction = candidates.findDeclarationWithSignature<FirSimpleFunction>(signature, firSession) {
|
||||
processFunctionsByName(name, it)
|
||||
} ?: return null
|
||||
return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firFunction)
|
||||
return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firFunction.symbol)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+4
-5
@@ -5,12 +5,11 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirEnumEntry
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtKotlinPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -26,7 +25,7 @@ internal class KtFirMemberPropertySymbolPointer(
|
||||
): KtKotlinPropertySymbol? {
|
||||
val firProperty = candidates.findDeclarationWithSignature<FirProperty>(signature, firSession) { processPropertiesByName(name, it) }
|
||||
?: return null
|
||||
return firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firProperty) as? KtKotlinPropertySymbol
|
||||
return firSymbolBuilder.variableLikeBuilder.buildVariableSymbol(firProperty.symbol) as? KtKotlinPropertySymbol
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -5,15 +5,15 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
|
||||
internal abstract class KtFirMemberSymbolPointer<S : KtSymbol>(
|
||||
|
||||
+2
-2
@@ -5,11 +5,11 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers
|
||||
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSamConstructorSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
|
||||
internal class KtFirSamConstructorSymbolPointer(
|
||||
@@ -19,7 +19,7 @@ internal class KtFirSamConstructorSymbolPointer(
|
||||
override fun restoreSymbol(analysisSession: KtAnalysisSession): KtSamConstructorSymbol? {
|
||||
require(analysisSession is KtFirAnalysisSession)
|
||||
val owner = analysisSession.getClassLikeSymbol(ownerClassId) as? FirRegularClass ?: return null
|
||||
val classSymbol = analysisSession.firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(owner)
|
||||
val classSymbol = analysisSession.firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(owner.symbol)
|
||||
with(analysisSession) {
|
||||
return classSymbol.getSamConstructor()
|
||||
}
|
||||
|
||||
+4
-6
@@ -5,15 +5,13 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.fir.symbols.pointers
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
|
||||
internal class KtFirTopLevelFunctionSymbolPointer(
|
||||
callableId: CallableId,
|
||||
@@ -24,7 +22,7 @@ internal class KtFirTopLevelFunctionSymbolPointer(
|
||||
firSession: FirSession
|
||||
): KtFunctionSymbol? {
|
||||
val firFunction = candidates.findDeclarationWithSignatureBySymbols<FirSimpleFunction>(signature, firSession) ?: return null
|
||||
return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firFunction)
|
||||
return firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firFunction.symbol)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+3
@@ -48,6 +48,9 @@ internal inline fun <reified D : FirDeclaration> Collection<FirCallableSymbol<*>
|
||||
return null
|
||||
}
|
||||
|
||||
internal fun FirBasedSymbol<*>.createSignature(): IdSignature =
|
||||
fir.createSignature()
|
||||
|
||||
internal fun FirDeclaration.createSignature(): IdSignature {
|
||||
val signatureComposer = moduleData.session.ideSessionComponents.signatureComposer
|
||||
return signatureComposer.composeSignature(this)
|
||||
|
||||
+1
-3
@@ -18,8 +18,6 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.*
|
||||
import org.jetbrains.kotlin.analysis.api.withValidityAssertion
|
||||
import org.jetbrains.kotlin.fir.types.isSuspendFunctionType
|
||||
import org.jetbrains.kotlin.fir.types.receiverType
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassLikeTypeImpl
|
||||
@@ -132,7 +130,7 @@ internal class KtFirClassErrorType(
|
||||
|
||||
override val candidateClassSymbols: Collection<KtClassLikeSymbol> by cached {
|
||||
val symbols = coneType.diagnostic.getCandidateSymbols().filterIsInstance<FirClassLikeSymbol<*>>()
|
||||
symbols.map { builder.classifierBuilder.buildClassLikeSymbol(it.fir) }
|
||||
symbols.map { builder.classifierBuilder.buildClassLikeSymbol(it) }
|
||||
}
|
||||
|
||||
override fun asStringForDebugging(): String = withValidityAssertion { coneType.render() }
|
||||
|
||||
-66
@@ -1,66 +0,0 @@
|
||||
/*
|
||||
* Copyright 2010-2020 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.analysis.api.fir.utils
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.ValidityTokenOwner
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.assertIsValidAndAccessible
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.withFirDeclaration
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
|
||||
internal class FirRefWithValidityCheck<out D : FirDeclaration>(
|
||||
private val fir: D,
|
||||
val resolveState: FirModuleResolveState,
|
||||
val token: ValidityToken
|
||||
) {
|
||||
|
||||
inline fun <R> withFir(phase: FirResolvePhase = FirResolvePhase.RAW_FIR, crossinline action: (fir: D) -> R): R {
|
||||
token.assertIsValidAndAccessible()
|
||||
return fir.withFirDeclaration(resolveState, phase) { action(it) }
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs [action] with fir element *without* any lock hold
|
||||
* Consider using this only when you are completely sure
|
||||
* that fir or one of it's container already holds the lock (i.e, corresponding withFir call was made)
|
||||
*/
|
||||
inline fun <R> withFirUnsafe(action: (fir: D) -> R): R {
|
||||
token.assertIsValidAndAccessible()
|
||||
return action(fir)
|
||||
}
|
||||
|
||||
inline fun <R> withFirAndCache(phase: FirResolvePhase = FirResolvePhase.RAW_FIR, crossinline createValue: (fir: D) -> R) =
|
||||
ValidityAwareCachedValue(token) {
|
||||
withFir(phase) { fir -> createValue(fir) }
|
||||
}
|
||||
|
||||
inline fun <R> withFirByType(type: ResolveType, crossinline action: (fir: D) -> R): R {
|
||||
token.assertIsValidAndAccessible()
|
||||
return fir.withFirDeclaration(type, resolveState) { action(it) }
|
||||
}
|
||||
|
||||
inline fun <R> withFirAndCache(type: ResolveType, crossinline createValue: (fir: D) -> R) =
|
||||
ValidityAwareCachedValue(token) {
|
||||
withFirByType(type) { fir -> createValue(fir) }
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
if (other !is FirRefWithValidityCheck<*>) return false
|
||||
return fir == other.fir && this.token == other.token
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
return fir.hashCode() * 31 + token.hashCode()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Suppress("NOTHING_TO_INLINE")
|
||||
internal inline fun <D : FirDeclaration> ValidityTokenOwner.firRef(fir: D, resolveState: FirModuleResolveState) =
|
||||
FirRefWithValidityCheck(fir, resolveState, token)
|
||||
+8
-8
@@ -5,11 +5,6 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.fir.utils
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.analysis.api.InvalidWayOfUsingAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
|
||||
@@ -20,6 +15,11 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtClassLikeSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.declarations.FirClassLikeDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||
import org.jetbrains.kotlin.psi.KtElement
|
||||
|
||||
@@ -32,7 +32,7 @@ class KtAnalysisSessionFe10BindingHolder private constructor(
|
||||
val firResolveState: FirModuleResolveState get() = firAnalysisSession.firResolveState
|
||||
|
||||
fun buildClassLikeSymbol(fir: FirClassLikeDeclaration): KtClassLikeSymbol =
|
||||
firAnalysisSession.firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(fir)
|
||||
firAnalysisSession.firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(fir.symbol)
|
||||
|
||||
fun buildKtType(coneType: FirTypeRef): KtType =
|
||||
firAnalysisSession.firSymbolBuilder.typeBuilder.buildKtType(coneType)
|
||||
@@ -41,9 +41,9 @@ class KtAnalysisSessionFe10BindingHolder private constructor(
|
||||
|
||||
@Suppress("UNCHECKED_CAST", "NON_PUBLIC_CALL_FROM_PUBLIC_INLINE")
|
||||
inline fun <T : FirDeclaration, R> withFir(ktSymbol: KtSymbol, crossinline action: (T) -> R) =
|
||||
(ktSymbol as KtFirSymbol<T>).firRef.withFir(action = action)
|
||||
(ktSymbol as KtFirSymbol<*>).firSymbol.fir.let { action(it as T) }
|
||||
|
||||
fun toSignature(ktSymbol: KtSymbol): IdSignature = (ktSymbol as KtFirSymbol<*>).firRef.withFir { it.createSignature() }
|
||||
fun toSignature(ktSymbol: KtSymbol): IdSignature = (ktSymbol as KtFirSymbol<*>).firSymbol.createSignature()
|
||||
|
||||
companion object {
|
||||
@InvalidWayOfUsingAnalysisSession
|
||||
|
||||
+1
-1
@@ -5,8 +5,8 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.fir.utils
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.ValidityTokenOwner
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import java.lang.ref.WeakReference
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
|
||||
+1
-1
@@ -5,8 +5,8 @@
|
||||
|
||||
package org.jetbrains.kotlin.analysis.api.fir.utils
|
||||
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.ValidityTokenOwner
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
|
||||
import org.jetbrains.kotlin.analysis.api.tokens.assertIsValidAndAccessible
|
||||
import kotlin.properties.ReadOnlyProperty
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
+13
-9
@@ -9,25 +9,29 @@ import org.jetbrains.kotlin.analysis.api.KtConstantInitializerValue
|
||||
import org.jetbrains.kotlin.analysis.api.KtInitializerValue
|
||||
import org.jetbrains.kotlin.analysis.api.KtNonConstantInitializerValue
|
||||
import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirCompileTimeConstantEvaluator
|
||||
import org.jetbrains.kotlin.analysis.api.fir.getCandidateSymbols
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.withFirDeclaration
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType
|
||||
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.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.psi
|
||||
import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
|
||||
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.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.analysis.api.fir.getCandidateSymbols
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.FirModuleResolveState
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.withFirDeclaration
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.lazy.resolve.ResolveType
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.psi
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassErrorType
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.ConeNullability
|
||||
import org.jetbrains.kotlin.fir.types.coneType
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
|
||||
|
||||
+2
@@ -54,6 +54,8 @@ public abstract class KtEnumEntrySymbol : KtVariableLikeSymbol(), KtSymbolWithMe
|
||||
final override val symbolKind: KtSymbolKind get() = KtSymbolKind.CLASS_MEMBER
|
||||
final override val isExtension: Boolean get() = false
|
||||
final override val receiverType: KtType? get() = null
|
||||
|
||||
//todo reduntant, remove
|
||||
public abstract val containingEnumClassIdIfNonLocal: ClassId?
|
||||
|
||||
abstract override fun createPointer(): KtSymbolPointer<KtEnumEntrySymbol>
|
||||
|
||||
+3
-2
@@ -61,7 +61,7 @@ private fun collectDesignationPath(declaration: FirDeclaration): List<FirDeclara
|
||||
if (declaration.symbol.callableId.isLocal) return null
|
||||
if ((declaration as? FirCallableDeclaration)?.status?.visibility == Visibilities.Local) return null
|
||||
when (declaration) {
|
||||
is FirSimpleFunction, is FirProperty, is FirField, is FirConstructor -> {
|
||||
is FirSimpleFunction, is FirProperty, is FirField, is FirConstructor, is FirEnumEntry -> {
|
||||
val klass = declaration.containingClass() ?: return emptyList()
|
||||
if (klass.classId.isLocal) return null
|
||||
@OptIn(LookupTagInternals::class)
|
||||
@@ -90,7 +90,8 @@ fun FirDeclaration.collectDesignation(): FirDeclarationDesignation =
|
||||
tryCollectDesignation() ?: error("No designation of local declaration ${this.render()}")
|
||||
|
||||
fun FirDeclaration.collectDesignationWithFile(): FirDeclarationDesignationWithFile =
|
||||
tryCollectDesignationWithFile() ?: error("No designation of local declaration ${this.render()}")
|
||||
tryCollectDesignationWithFile()
|
||||
?: error("No designation of local declaration ${this.render()}")
|
||||
|
||||
fun FirDeclaration.tryCollectDesignation(firFile: FirFile): FirDeclarationDesignationWithFile? =
|
||||
collectDesignationPath(this)?.let {
|
||||
|
||||
+8
-8
@@ -11,33 +11,33 @@ import java.util.*
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
class InvalidFirElementTypeException(
|
||||
actualFirClass: KClass<out FirElement>?,
|
||||
actualFirClass: KClass<*>?,
|
||||
ktElement: KtElement?,
|
||||
expectedFirClasses: List<KClass<out FirElement>>,
|
||||
expectedFirClasses: List<KClass<*>>,
|
||||
) : IllegalStateException() {
|
||||
override val message: String = buildString {
|
||||
if (ktElement != null) {
|
||||
append("For $ktElement with text `${ktElement.text}`, ")
|
||||
}
|
||||
val message = when (expectedFirClasses.size) {
|
||||
0 -> "Unexpected FirElement of type:"
|
||||
1 -> "The FirElement of type ${expectedFirClasses.single()} expected, but"
|
||||
else -> "One of [${expectedFirClasses.joinToString()}] FirElement types expected, but"
|
||||
0 -> "Unexpected element of type:"
|
||||
1 -> "The element of type ${expectedFirClasses.single()} expected, but"
|
||||
else -> "One of [${expectedFirClasses.joinToString()}] element types expected, but"
|
||||
}
|
||||
append(if (ktElement == null) message else message.replaceFirstChar { it.lowercase(Locale.getDefault()) })
|
||||
if (actualFirClass != null) {
|
||||
append(" ${actualFirClass.simpleName} found")
|
||||
} else {
|
||||
append(" no FirElement found")
|
||||
append(" no element found")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fun throwUnexpectedFirElementError(
|
||||
firElement: FirElement?,
|
||||
firElement: Any?,
|
||||
ktElement: KtElement? = null,
|
||||
vararg expectedFirClasses: KClass<out FirElement>
|
||||
vararg expectedFirClasses: KClass<*>
|
||||
): Nothing {
|
||||
throw InvalidFirElementTypeException(firElement?.let { it::class }, ktElement, expectedFirClasses.toList())
|
||||
}
|
||||
+11
-10
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.diagnostics.KtPsiDiagnostic
|
||||
import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||
import org.jetbrains.kotlin.psi.KtElement
|
||||
import org.jetbrains.kotlin.psi.KtFile
|
||||
@@ -43,10 +44,10 @@ fun KtModule.getResolveState(project: Project): FirModuleResolveState =
|
||||
* Otherwise, some threading problems may arise,
|
||||
*/
|
||||
@OptIn(InternalForInline::class)
|
||||
inline fun <R> KtDeclaration.withFirDeclaration(
|
||||
inline fun <R> KtDeclaration.withFirSymbol(
|
||||
resolveState: FirModuleResolveState,
|
||||
phase: FirResolvePhase = FirResolvePhase.RAW_FIR,
|
||||
action: (FirDeclaration) -> R
|
||||
action: (FirBasedSymbol<*>) -> R
|
||||
): R {
|
||||
val firDeclaration = if (getKtModule(project) !is KtSourceModule) {
|
||||
resolveState.findSourceFirCompiledDeclaration(this)
|
||||
@@ -60,7 +61,7 @@ inline fun <R> KtDeclaration.withFirDeclaration(
|
||||
firDeclaration
|
||||
}
|
||||
|
||||
return action(resolvedDeclaration)
|
||||
return action(resolvedDeclaration.symbol)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -71,14 +72,14 @@ inline fun <R> KtDeclaration.withFirDeclaration(
|
||||
* Otherwise, some threading problems may arise,
|
||||
*/
|
||||
@OptIn(InternalForInline::class)
|
||||
inline fun <R> KtDeclaration.withFirDeclaration(
|
||||
inline fun <R> KtDeclaration.withFirSymbolDeclaration(
|
||||
resolveState: FirModuleResolveState,
|
||||
resolveType: ResolveType = ResolveType.NoResolve,
|
||||
action: (FirDeclaration) -> R
|
||||
action: (FirBasedSymbol<*>) -> R
|
||||
): R {
|
||||
val firDeclaration = resolveState.findSourceFirDeclaration(this)
|
||||
val resolvedDeclaration = firDeclaration.resolvedFirToType(resolveType, resolveState)
|
||||
return action(resolvedDeclaration)
|
||||
return action(resolvedDeclaration.symbol)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -91,11 +92,11 @@ inline fun <R> KtDeclaration.withFirDeclaration(
|
||||
* Otherwise, some threading problems may arise,
|
||||
*/
|
||||
@OptIn(InternalForInline::class)
|
||||
inline fun <reified F : FirDeclaration, R> KtDeclaration.withFirDeclarationOfType(
|
||||
inline fun <reified F : FirBasedSymbol<*>, R> KtDeclaration.withFirSymbolOfType(
|
||||
resolveState: FirModuleResolveState,
|
||||
phase: FirResolvePhase = FirResolvePhase.RAW_FIR,
|
||||
action: (F) -> R
|
||||
): R = withFirDeclaration(resolveState, phase) { firDeclaration ->
|
||||
): R = withFirSymbol(resolveState, phase) { firDeclaration ->
|
||||
if (firDeclaration !is F) throwUnexpectedFirElementError(firDeclaration, this, F::class)
|
||||
action(firDeclaration)
|
||||
}
|
||||
@@ -164,7 +165,7 @@ fun KtFile.collectDiagnosticsForFile(
|
||||
/**
|
||||
* Resolves a given [FirDeclaration] to [phase] and returns resolved declaration
|
||||
*
|
||||
* Should not be called form [withFirDeclaration], [withFirDeclarationOfType] functions, as it it may cause deadlock
|
||||
* Should not be called form [withFirSymbol], [withFirDeclarationOfType] functions, as it it may cause deadlock
|
||||
*/
|
||||
fun <D : FirDeclaration> D.resolvedFirToPhase(
|
||||
phase: FirResolvePhase,
|
||||
@@ -175,7 +176,7 @@ fun <D : FirDeclaration> D.resolvedFirToPhase(
|
||||
/**
|
||||
* Resolves a given [FirDeclaration] to [phase] and returns resolved declaration
|
||||
*
|
||||
* Should not be called form [withFirDeclaration], [withFirDeclarationOfType] functions, as it it may cause deadlock
|
||||
* Should not be called form [withFirSymbol], [withFirDeclarationOfType] functions, as it it may cause deadlock
|
||||
*/
|
||||
fun <D : FirDeclaration> D.resolvedFirToType(
|
||||
type: ResolveType,
|
||||
|
||||
-1
@@ -129,7 +129,6 @@ internal inline fun PsiElement.getNonLocalContainingOrThisDeclaration(predicate:
|
||||
&& (container.isNonAnonymousClassOrObject() || container is KtDeclarationWithBody || container is KtProperty || container is KtTypeAlias)
|
||||
&& container !is KtPrimaryConstructor
|
||||
&& declarationCanBeLazilyResolved(container)
|
||||
&& container !is KtEnumEntry
|
||||
&& container !is KtFunctionLiteral
|
||||
&& container.containingClassOrObject !is KtEnumEntry
|
||||
&& predicate(container)
|
||||
|
||||
+12
-1
@@ -29,6 +29,10 @@ import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.firProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.FirImportResolveTransformer
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirTowerDataContextCollector
|
||||
import org.jetbrains.kotlin.psi.KtClass
|
||||
import org.jetbrains.kotlin.psi.KtClassBody
|
||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||
import org.jetbrains.kotlin.psi.KtElement
|
||||
|
||||
internal class FirLazyDeclarationResolver(private val firFileBuilder: FirFileBuilder) {
|
||||
/**
|
||||
@@ -291,7 +295,8 @@ internal class FirLazyDeclarationResolver(private val firFileBuilder: FirFileBui
|
||||
val nonLocalDeclaration = possiblyLocalDeclaration.getNonLocalContainingOrThisDeclaration()
|
||||
?: error("Container for local declaration cannot be null")
|
||||
|
||||
isLocalDeclarationResolveRequested = possiblyLocalDeclaration != nonLocalDeclaration
|
||||
isLocalDeclarationResolveRequested =
|
||||
possiblyLocalDeclaration != nonLocalDeclaration
|
||||
if (isLocalDeclarationResolveRequested && skipLocalDeclaration) return firDeclarationToResolve
|
||||
|
||||
val nonLocalFirDeclaration = nonLocalDeclaration.findSourceNonLocalFirDeclaration(
|
||||
@@ -428,4 +433,10 @@ internal class FirLazyDeclarationResolver(private val firFileBuilder: FirFileBui
|
||||
}
|
||||
}
|
||||
|
||||
private fun KtDeclaration.isMemberOfEnumEntry(container: KtDeclaration) : Boolean {
|
||||
if (container !is KtClass) return false
|
||||
if (!container.isEnum()) return false
|
||||
val enumEntryBody = this.parent as? KtClassBody ?: return false
|
||||
return enumEntryBody.parent == container
|
||||
}
|
||||
|
||||
|
||||
-1
@@ -92,7 +92,6 @@ internal val FirDeclaration.containingKtFileIfAny: KtFile?
|
||||
internal fun KtDeclaration.isNonAnonymousClassOrObject() =
|
||||
this is KtClassOrObject
|
||||
&& !this.isObjectLiteral()
|
||||
&& this !is KtEnumEntry
|
||||
|
||||
|
||||
|
||||
|
||||
+1
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
// ---------------------- callables with status ----------------------
|
||||
|
||||
inline val FirCallableSymbol<*>.modality: Modality? get() = resolvedStatus.modality
|
||||
inline val FirCallableSymbol<*>.modalityOrFinal: Modality get() = modality ?: Modality.FINAL
|
||||
inline val FirCallableSymbol<*>.isAbstract: Boolean get() = resolvedStatus.modality == Modality.ABSTRACT
|
||||
inline val FirCallableSymbol<*>.isOpen: Boolean get() = resolvedStatus.modality == Modality.OPEN
|
||||
inline val FirCallableSymbol<*>.isFinal: Boolean
|
||||
|
||||
@@ -9,7 +9,11 @@ import org.jetbrains.kotlin.KtSourceElement
|
||||
import org.jetbrains.kotlin.fir.FirModuleData
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvePhase
|
||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||
import org.jetbrains.kotlin.fir.types.coneType
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
|
||||
abstract class FirBasedSymbol<E : FirDeclaration> {
|
||||
private var _fir: E? = null
|
||||
@@ -34,6 +38,18 @@ abstract class FirBasedSymbol<E : FirDeclaration> {
|
||||
|
||||
val annotations: List<FirAnnotation>
|
||||
get() = fir.annotations
|
||||
|
||||
val resolvedAnnotationsWithArguments: List<FirAnnotation>
|
||||
get() {
|
||||
ensureResolved(FirResolvePhase.ARGUMENTS_OF_ANNOTATIONS)
|
||||
return fir.annotations
|
||||
}
|
||||
|
||||
val resolvedAnnotationClassIds: List<ClassId>
|
||||
get() {
|
||||
ensureResolved(FirResolvePhase.TYPES)
|
||||
return fir.annotations.mapNotNull { (it.annotationTypeRef.coneType as? ConeClassLikeType)?.lookupTag?.classId }
|
||||
}
|
||||
}
|
||||
|
||||
@RequiresOptIn
|
||||
|
||||
@@ -21,6 +21,10 @@ abstract class FirCallableSymbol<D : FirCallableDeclaration> : FirBasedSymbol<D>
|
||||
return fir.returnTypeRef as FirResolvedTypeRef
|
||||
}
|
||||
|
||||
val resolvedReturnType: ConeKotlinType
|
||||
get() = resolvedReturnTypeRef.coneType
|
||||
|
||||
|
||||
val resolvedReceiverTypeRef: FirResolvedTypeRef?
|
||||
get() {
|
||||
ensureType(fir.receiverTypeRef)
|
||||
|
||||
@@ -10,10 +10,11 @@ import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ensureResolved
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.coneType
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.name.SpecialNames
|
||||
|
||||
sealed class FirClassLikeSymbol<D : FirClassLikeDeclaration>(
|
||||
@@ -21,6 +22,8 @@ sealed class FirClassLikeSymbol<D : FirClassLikeDeclaration>(
|
||||
) : FirClassifierSymbol<D>() {
|
||||
abstract override fun toLookupTag(): ConeClassLikeLookupTag
|
||||
|
||||
val name get() = classId.shortClassName
|
||||
|
||||
val deprecation: DeprecationsPerUseSite?
|
||||
get() {
|
||||
ensureResolved(FirResolvePhase.STATUS)
|
||||
@@ -44,6 +47,9 @@ sealed class FirClassSymbol<C : FirClass>(classId: ClassId) : FirClassLikeSymbol
|
||||
return fir.superTypeRefs as List<FirResolvedTypeRef>
|
||||
}
|
||||
|
||||
val resolvedSuperTypes: List<ConeKotlinType>
|
||||
get() = resolvedSuperTypeRefs.map { it.coneType }
|
||||
|
||||
val declarationSymbols: List<FirBasedSymbol<*>>
|
||||
get() {
|
||||
return fir.declarations.map { it.symbol }
|
||||
|
||||
@@ -105,6 +105,9 @@ class FirAnonymousFunctionSymbol : FirFunctionWithoutNameSymbol<FirAnonymousFunc
|
||||
val label: FirLabel? get() = fir.label
|
||||
}
|
||||
|
||||
class FirPropertyAccessorSymbol : FirFunctionWithoutNameSymbol<FirPropertyAccessor>(Name.identifier("accessor"))
|
||||
class FirPropertyAccessorSymbol : FirFunctionWithoutNameSymbol<FirPropertyAccessor>(Name.identifier("accessor")) {
|
||||
val isGetter: Boolean get() = fir.isGetter
|
||||
val isSetter: Boolean get() = fir.isSetter
|
||||
}
|
||||
|
||||
class FirErrorFunctionSymbol : FirFunctionWithoutNameSymbol<FirErrorFunction>(Name.identifier("error"))
|
||||
|
||||
@@ -30,6 +30,12 @@ open class FirPropertySymbol(
|
||||
val setterSymbol: FirPropertyAccessorSymbol?
|
||||
get() = fir.setter?.symbol
|
||||
|
||||
val backingFieldSymbol: FirBackingFieldSymbol?
|
||||
get() = fir.backingField?.symbol
|
||||
|
||||
val delegateFieldSymbol: FirDelegateFieldSymbol?
|
||||
get() = fir.delegateFieldSymbol
|
||||
|
||||
val hasInitializer: Boolean
|
||||
get() = fir.initializer != null
|
||||
|
||||
@@ -61,6 +67,9 @@ class FirBackingFieldSymbol(callableId: CallableId) : FirVariableSymbol<FirBacki
|
||||
val isVar: Boolean
|
||||
get() = fir.isVar
|
||||
|
||||
val propertySymbol: FirPropertySymbol
|
||||
get() = fir.propertySymbol
|
||||
|
||||
val getterSymbol: FirPropertyAccessorSymbol?
|
||||
get() = fir.propertySymbol.fir.getter?.symbol
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user