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