FIR IDE: extract class-like symbol building to separate class
This commit is contained in:
+3
-3
@@ -116,7 +116,7 @@ private object FirToKtConversionCreator {
|
|||||||
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.buildClassLikeSymbol({0})",
|
"firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0})",
|
||||||
KtClassLikeSymbol::class.createType()
|
KtClassLikeSymbol::class.createType()
|
||||||
),
|
),
|
||||||
FirExpression::class to HLFunctionCallConversion(
|
FirExpression::class to HLFunctionCallConversion(
|
||||||
@@ -128,7 +128,7 @@ private object FirToKtConversionCreator {
|
|||||||
)
|
)
|
||||||
),
|
),
|
||||||
FirClassLikeSymbol::class to HLFunctionCallConversion(
|
FirClassLikeSymbol::class to HLFunctionCallConversion(
|
||||||
"firSymbolBuilder.buildClassLikeSymbol({0}.fir as FirClass<*>)",
|
"firSymbolBuilder.classifierBuilder.buildClassLikeSymbol({0}.fir as FirClass<*>)",
|
||||||
KtClassLikeSymbol::class.createType(),
|
KtClassLikeSymbol::class.createType(),
|
||||||
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirClass")
|
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirClass")
|
||||||
),
|
),
|
||||||
@@ -143,7 +143,7 @@ private object FirToKtConversionCreator {
|
|||||||
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.buildTypeParameterSymbol({0}.fir)",
|
"firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol({0}.fir)",
|
||||||
KtTypeParameterSymbol::class.createType(),
|
KtTypeParameterSymbol::class.createType(),
|
||||||
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirTypeParameter")
|
importsToAdd = listOf("org.jetbrains.kotlin.fir.declarations.FirTypeParameter")
|
||||||
),
|
),
|
||||||
|
|||||||
+65
-50
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.idea.frontend.api.fir
|
|||||||
import com.google.common.collect.MapMaker
|
import com.google.common.collect.MapMaker
|
||||||
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.descriptors.ClassKind
|
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
import org.jetbrains.kotlin.fir.FirElement
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
@@ -53,6 +52,7 @@ internal class KtSymbolByFirBuilder private constructor(
|
|||||||
private val firProvider get() = resolveState.rootModuleSession.symbolProvider
|
private val firProvider get() = resolveState.rootModuleSession.symbolProvider
|
||||||
val rootSession: FirSession = resolveState.rootModuleSession
|
val rootSession: FirSession = resolveState.rootModuleSession
|
||||||
|
|
||||||
|
val classifierBuilder = ClassifierSymbolBuilder()
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
resolveState: FirModuleResolveState,
|
resolveState: FirModuleResolveState,
|
||||||
@@ -85,12 +85,12 @@ internal class KtSymbolByFirBuilder private constructor(
|
|||||||
|
|
||||||
fun buildSymbol(fir: FirDeclaration): KtSymbol {
|
fun buildSymbol(fir: FirDeclaration): KtSymbol {
|
||||||
return when (fir) {
|
return when (fir) {
|
||||||
is FirClassLikeDeclaration<*> -> buildClassLikeSymbol(fir)
|
is FirClassLikeDeclaration<*> -> classifierBuilder.buildClassLikeSymbol(fir)
|
||||||
|
is FirTypeParameter -> classifierBuilder.buildTypeParameterSymbol(fir)
|
||||||
is FirSimpleFunction -> buildFunctionSymbol(fir)
|
is FirSimpleFunction -> buildFunctionSymbol(fir)
|
||||||
is FirProperty -> buildVariableSymbol(fir)
|
is FirProperty -> buildVariableSymbol(fir)
|
||||||
is FirValueParameter -> buildParameterSymbol(fir)
|
is FirValueParameter -> buildParameterSymbol(fir)
|
||||||
is FirConstructor -> buildConstructorSymbol(fir)
|
is FirConstructor -> buildConstructorSymbol(fir)
|
||||||
is FirTypeParameter -> buildTypeParameterSymbol(fir)
|
|
||||||
is FirEnumEntry -> buildEnumEntrySymbol(fir)
|
is FirEnumEntry -> buildEnumEntrySymbol(fir)
|
||||||
is FirField -> buildFieldSymbol(fir)
|
is FirField -> buildFieldSymbol(fir)
|
||||||
is FirAnonymousFunction -> buildAnonymousFunctionSymbol(fir)
|
is FirAnonymousFunction -> buildAnonymousFunctionSymbol(fir)
|
||||||
@@ -105,43 +105,12 @@ internal class KtSymbolByFirBuilder private constructor(
|
|||||||
fun buildCallableSymbol(fir: FirCallableDeclaration<*>): KtCallableSymbol = buildSymbol(fir) as KtCallableSymbol
|
fun buildCallableSymbol(fir: FirCallableDeclaration<*>): KtCallableSymbol = buildSymbol(fir) as KtCallableSymbol
|
||||||
|
|
||||||
|
|
||||||
fun buildClassLikeSymbol(fir: FirClassLikeDeclaration<*>): KtClassLikeSymbol {
|
|
||||||
return when (fir) {
|
|
||||||
is FirClass<*> -> buildClassOrObjectSymbol(fir)
|
|
||||||
is FirTypeAlias -> buildTypeAliasSymbol(fir)
|
|
||||||
else -> error("Unexpected ${fir::class.simpleName}")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun buildClassOrObjectSymbol(fir: FirClass<*>): KtClassOrObjectSymbol {
|
|
||||||
return when (fir) {
|
|
||||||
is FirAnonymousObject -> buildAnonymousObjectSymbol(fir)
|
|
||||||
is FirRegularClass -> buildNamedClassOrObjectSymbol(fir)
|
|
||||||
else -> error("Unexpected ${fir::class.simpleName}")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fun buildNamedClassOrObjectSymbol(fir: FirRegularClass): KtFirNamedClassOrObjectSymbol {
|
|
||||||
return symbolsCache.cache(fir) { KtFirNamedClassOrObjectSymbol(fir, resolveState, token, this) }
|
|
||||||
}
|
|
||||||
|
|
||||||
fun buildAnonymousObjectSymbol(fir: FirAnonymousObject): KtAnonymousObjectSymbol {
|
|
||||||
return symbolsCache.cache(fir) { KtFirAnonymousObjectSymbol(fir, resolveState, token, this) }
|
|
||||||
}
|
|
||||||
|
|
||||||
fun buildClassifierSymbol(firSymbol: FirClassifierSymbol<*>): KtClassifierSymbol = when (val fir = firSymbol.fir) {
|
|
||||||
is FirClassLikeDeclaration -> buildClassLikeSymbol(fir)
|
|
||||||
is FirTypeParameter -> buildTypeParameterSymbol(fir)
|
|
||||||
else ->
|
|
||||||
TODO(fir::class.toString())
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// TODO it can be a constructor parameter, which may be split into parameter & property
|
// TODO it can be a constructor parameter, which may be split into parameter & property
|
||||||
// we should handle them both
|
// we should handle them both
|
||||||
fun buildParameterSymbol(fir: FirValueParameter) =
|
fun buildParameterSymbol(fir: FirValueParameter) =
|
||||||
symbolsCache.cache(fir) { KtFirFunctionValueParameterSymbol(fir, resolveState, token, this) }
|
symbolsCache.cache(fir) { KtFirFunctionValueParameterSymbol(fir, resolveState, token, this) }
|
||||||
|
|
||||||
|
|
||||||
fun buildFirConstructorParameter(fir: FirValueParameter) =
|
fun buildFirConstructorParameter(fir: FirValueParameter) =
|
||||||
symbolsCache.cache(fir) { KtFirConstructorValueParameterSymbol(fir, resolveState, token, this) }
|
symbolsCache.cache(fir) { KtFirConstructorValueParameterSymbol(fir, resolveState, token, this) }
|
||||||
|
|
||||||
@@ -153,11 +122,8 @@ internal class KtSymbolByFirBuilder private constructor(
|
|||||||
val originalFir = fir.originalConstructorIfTypeAlias ?: fir
|
val originalFir = fir.originalConstructorIfTypeAlias ?: fir
|
||||||
return symbolsCache.cache(originalFir) { KtFirConstructorSymbol(originalFir, resolveState, token, this) }
|
return symbolsCache.cache(originalFir) { KtFirConstructorSymbol(originalFir, resolveState, token, this) }
|
||||||
}
|
}
|
||||||
fun buildTypeParameterSymbol(fir: FirTypeParameter) =
|
|
||||||
symbolsCache.cache(fir) { KtFirTypeParameterSymbol(fir, resolveState, token, this) }
|
|
||||||
|
|
||||||
fun buildTypeAliasSymbol(fir: FirTypeAlias) = symbolsCache.cache(fir) { KtFirTypeAliasSymbol(fir, resolveState, token) }
|
|
||||||
fun buildEnumEntrySymbol(fir: FirEnumEntry) = symbolsCache.cache(fir) { KtFirEnumEntrySymbol(fir, resolveState, token, this) }
|
|
||||||
fun buildFieldSymbol(fir: FirField) = symbolsCache.cache(fir) { KtFirJavaFieldSymbol(fir, resolveState, token, this) }
|
fun buildFieldSymbol(fir: FirField) = symbolsCache.cache(fir) { KtFirJavaFieldSymbol(fir, resolveState, token, this) }
|
||||||
fun buildAnonymousFunctionSymbol(fir: FirAnonymousFunction) =
|
fun buildAnonymousFunctionSymbol(fir: FirAnonymousFunction) =
|
||||||
symbolsCache.cache(fir) { KtFirAnonymousFunctionSymbol(fir, resolveState, token, this) }
|
symbolsCache.cache(fir) { KtFirAnonymousFunctionSymbol(fir, resolveState, token, this) }
|
||||||
@@ -179,17 +145,6 @@ internal class KtSymbolByFirBuilder private constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun buildClassLikeSymbolByLookupTag(lookupTag: ConeClassLikeLookupTag): KtClassLikeSymbol? = withValidityAssertion {
|
|
||||||
firProvider.getSymbolByLookupTag(lookupTag)?.fir?.let(::buildClassLikeSymbol)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun buildTypeParameterSymbolByLookupTag(lookupTag: ConeTypeParameterLookupTag): KtTypeParameterSymbol? = withValidityAssertion {
|
|
||||||
(firProvider.getSymbolByLookupTag(lookupTag) as? FirTypeParameterSymbol)?.fir?.let(::buildTypeParameterSymbol)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun buildClassLikeSymbolByClassId(classId: ClassId): FirRegularClass? = withValidityAssertion {
|
|
||||||
firProvider.getClassLikeSymbolByFqName(classId)?.fir as? FirRegularClass
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
fun createPackageSymbolIfOneExists(packageFqName: FqName): KtFirPackageSymbol? {
|
fun createPackageSymbolIfOneExists(packageFqName: FqName): KtFirPackageSymbol? {
|
||||||
@@ -236,8 +191,68 @@ internal class KtSymbolByFirBuilder private constructor(
|
|||||||
else -> TODO(coneType::class.toString())
|
else -> TODO(coneType::class.toString())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inner class ClassifierSymbolBuilder {
|
||||||
|
fun buildClassifierSymbol(firSymbol: FirClassifierSymbol<*>): KtClassifierSymbol {
|
||||||
|
return when (val fir = firSymbol.fir) {
|
||||||
|
is FirClassLikeDeclaration -> classifierBuilder.buildClassLikeSymbol(fir)
|
||||||
|
is FirTypeParameter -> buildTypeParameterSymbol(fir)
|
||||||
|
else -> error("Unexpected ${fir::class.simpleName}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
fun buildClassLikeSymbol(fir: FirClassLikeDeclaration<*>): KtClassLikeSymbol {
|
||||||
|
return when (fir) {
|
||||||
|
is FirClass<*> -> buildClassOrObjectSymbol(fir)
|
||||||
|
is FirTypeAlias -> buildTypeAliasSymbol(fir)
|
||||||
|
else -> error("Unexpected ${fir::class.simpleName}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun buildClassOrObjectSymbol(fir: FirClass<*>): KtClassOrObjectSymbol {
|
||||||
|
return when (fir) {
|
||||||
|
is FirAnonymousObject -> buildAnonymousObjectSymbol(fir)
|
||||||
|
is FirRegularClass -> buildNamedClassOrObjectSymbol(fir)
|
||||||
|
else -> error("Unexpected ${fir::class.simpleName}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun buildNamedClassOrObjectSymbol(fir: FirRegularClass): KtFirNamedClassOrObjectSymbol {
|
||||||
|
return symbolsCache.cache(fir) { KtFirNamedClassOrObjectSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun buildAnonymousObjectSymbol(fir: FirAnonymousObject): KtAnonymousObjectSymbol {
|
||||||
|
return symbolsCache.cache(fir) { KtFirAnonymousObjectSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun buildTypeAliasSymbol(fir: FirTypeAlias): KtFirTypeAliasSymbol {
|
||||||
|
return symbolsCache.cache(fir) { KtFirTypeAliasSymbol(fir, resolveState, token) }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun buildTypeParameterSymbol(fir: FirTypeParameter): KtFirTypeParameterSymbol {
|
||||||
|
return symbolsCache.cache(fir) { KtFirTypeParameterSymbol(fir, resolveState, token, this@KtSymbolByFirBuilder) }
|
||||||
|
}
|
||||||
|
|
||||||
|
fun buildTypeParameterSymbolByLookupTag(lookupTag: ConeTypeParameterLookupTag): KtTypeParameterSymbol? {
|
||||||
|
val firTypeParameterSymbol = firProvider.getSymbolByLookupTag(lookupTag) as? FirTypeParameterSymbol ?: return null
|
||||||
|
return buildTypeParameterSymbol(firTypeParameterSymbol.fir)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun buildClassLikeSymbolByClassId(classId: ClassId): KtClassLikeSymbol? {
|
||||||
|
val firClassLikeSymbol = firProvider.getClassLikeSymbolByFqName(classId) ?: return null
|
||||||
|
return buildClassLikeSymbol(firClassLikeSymbol.fir)
|
||||||
|
}
|
||||||
|
|
||||||
|
fun buildClassLikeSymbolByLookupTag(lookupTag: ConeClassLikeLookupTag): KtClassLikeSymbol? {
|
||||||
|
val firClassLikeSymbol = firProvider.getSymbolByLookupTag(lookupTag) ?: return null
|
||||||
|
return buildClassLikeSymbol(firClassLikeSymbol.fir)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
private class BuilderCache<From, To: Any> private constructor(
|
private class BuilderCache<From, To: Any> private constructor(
|
||||||
private val cache: ConcurrentMap<From, To>,
|
private val cache: ConcurrentMap<From, To>,
|
||||||
private val isReadOnly: Boolean
|
private val isReadOnly: Boolean
|
||||||
|
|||||||
+3
-3
@@ -216,7 +216,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
|
|||||||
}
|
}
|
||||||
add(FirErrors.QUALIFIED_SUPERTYPE_EXTENDED_BY_OTHER_SUPERTYPE) { firDiagnostic ->
|
add(FirErrors.QUALIFIED_SUPERTYPE_EXTENDED_BY_OTHER_SUPERTYPE) { firDiagnostic ->
|
||||||
QualifiedSupertypeExtendedByOtherSupertypeImpl(
|
QualifiedSupertypeExtendedByOtherSupertypeImpl(
|
||||||
firSymbolBuilder.buildClassLikeSymbol(firDiagnostic.a),
|
firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.a),
|
||||||
firDiagnostic as FirPsiDiagnostic<*>,
|
firDiagnostic as FirPsiDiagnostic<*>,
|
||||||
token,
|
token,
|
||||||
)
|
)
|
||||||
@@ -718,7 +718,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
|
|||||||
}
|
}
|
||||||
add(FirErrors.UPPER_BOUND_VIOLATED) { firDiagnostic ->
|
add(FirErrors.UPPER_BOUND_VIOLATED) { firDiagnostic ->
|
||||||
UpperBoundViolatedImpl(
|
UpperBoundViolatedImpl(
|
||||||
firSymbolBuilder.buildTypeParameterSymbol(firDiagnostic.a.fir),
|
firSymbolBuilder.classifierBuilder.buildTypeParameterSymbol(firDiagnostic.a.fir),
|
||||||
firSymbolBuilder.buildKtType(firDiagnostic.b),
|
firSymbolBuilder.buildKtType(firDiagnostic.b),
|
||||||
firDiagnostic as FirPsiDiagnostic<*>,
|
firDiagnostic as FirPsiDiagnostic<*>,
|
||||||
token,
|
token,
|
||||||
@@ -733,7 +733,7 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
|
|||||||
add(FirErrors.WRONG_NUMBER_OF_TYPE_ARGUMENTS) { firDiagnostic ->
|
add(FirErrors.WRONG_NUMBER_OF_TYPE_ARGUMENTS) { firDiagnostic ->
|
||||||
WrongNumberOfTypeArgumentsImpl(
|
WrongNumberOfTypeArgumentsImpl(
|
||||||
firDiagnostic.a,
|
firDiagnostic.a,
|
||||||
firSymbolBuilder.buildClassLikeSymbol(firDiagnostic.b.fir as FirClass<*>),
|
firSymbolBuilder.classifierBuilder.buildClassLikeSymbol(firDiagnostic.b.fir as FirClass<*>),
|
||||||
firDiagnostic as FirPsiDiagnostic<*>,
|
firDiagnostic as FirPsiDiagnostic<*>,
|
||||||
token,
|
token,
|
||||||
)
|
)
|
||||||
|
|||||||
+1
-1
@@ -84,7 +84,7 @@ internal fun FirScope.getClassifierSymbols(classLikeNames: Collection<Name>, bui
|
|||||||
classLikeNames.forEach { name ->
|
classLikeNames.forEach { name ->
|
||||||
val classifierSymbols = mutableListOf<KtClassifierSymbol>()
|
val classifierSymbols = mutableListOf<KtClassifierSymbol>()
|
||||||
processClassifiersByName(name) { firSymbol ->
|
processClassifiersByName(name) { firSymbol ->
|
||||||
classifierSymbols.add(builder.buildClassifierSymbol(firSymbol))
|
classifierSymbols.add(builder.classifierBuilder.buildClassifierSymbol(firSymbol))
|
||||||
}
|
}
|
||||||
yieldAll(classifierSymbols)
|
yieldAll(classifierSymbols)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -87,7 +87,7 @@ internal class KtFirFileScope(
|
|||||||
it.declarations.forEach { firDeclaration ->
|
it.declarations.forEach { firDeclaration ->
|
||||||
val classLikeDeclaration = (firDeclaration as? FirRegularClass)?.takeIf { klass -> nameFilter(klass.name) }
|
val classLikeDeclaration = (firDeclaration as? FirRegularClass)?.takeIf { klass -> nameFilter(klass.name) }
|
||||||
if (classLikeDeclaration != null) {
|
if (classLikeDeclaration != null) {
|
||||||
yield(builder.buildClassLikeSymbol(classLikeDeclaration))
|
yield(builder.classifierBuilder.buildClassLikeSymbol(classLikeDeclaration))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -67,7 +67,7 @@ internal class KtFirConstructorSymbol(
|
|||||||
|
|
||||||
override val typeParameters by firRef.withFirAndCache { fir ->
|
override val typeParameters by firRef.withFirAndCache { fir ->
|
||||||
fir.typeParameters.map { typeParameter ->
|
fir.typeParameters.map { typeParameter ->
|
||||||
builder.buildTypeParameterSymbol(typeParameter.symbol.fir)
|
builder.classifierBuilder.buildTypeParameterSymbol(typeParameter.symbol.fir)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -50,7 +50,7 @@ internal class KtFirFunctionSymbol(
|
|||||||
}
|
}
|
||||||
override val typeParameters by firRef.withFirAndCache { fir ->
|
override val typeParameters by firRef.withFirAndCache { fir ->
|
||||||
fir.typeParameters.map { typeParameter ->
|
fir.typeParameters.map { typeParameter ->
|
||||||
builder.buildTypeParameterSymbol(typeParameter.symbol.fir)
|
builder.classifierBuilder.buildTypeParameterSymbol(typeParameter.symbol.fir)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -59,7 +59,7 @@ internal class KtFirNamedClassOrObjectSymbol(
|
|||||||
override val isExternal: Boolean get() = firRef.withFir(FirResolvePhase.STATUS) { it.isExternal }
|
override val isExternal: Boolean get() = firRef.withFir(FirResolvePhase.STATUS) { it.isExternal }
|
||||||
|
|
||||||
override val companionObject: KtFirNamedClassOrObjectSymbol? by firRef.withFirAndCache { fir ->
|
override val companionObject: KtFirNamedClassOrObjectSymbol? by firRef.withFirAndCache { fir ->
|
||||||
fir.companionObject?.let { builder.buildNamedClassOrObjectSymbol(it) }
|
fir.companionObject?.let { builder.classifierBuilder.buildNamedClassOrObjectSymbol(it) }
|
||||||
}
|
}
|
||||||
|
|
||||||
override val superTypes: List<KtTypeAndAnnotations> by cached {
|
override val superTypes: List<KtTypeAndAnnotations> by cached {
|
||||||
@@ -68,7 +68,7 @@ internal class KtFirNamedClassOrObjectSymbol(
|
|||||||
|
|
||||||
override val typeParameters by firRef.withFirAndCache { fir ->
|
override val typeParameters by firRef.withFirAndCache { fir ->
|
||||||
fir.typeParameters.map { typeParameter ->
|
fir.typeParameters.map { typeParameter ->
|
||||||
builder.buildTypeParameterSymbol(typeParameter.symbol.fir)
|
builder.classifierBuilder.buildTypeParameterSymbol(typeParameter.symbol.fir)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
-6
@@ -57,13 +57,13 @@ internal class KtFirSymbolProvider(
|
|||||||
|
|
||||||
override fun getTypeParameterSymbol(psi: KtTypeParameter): KtTypeParameterSymbol = withValidityAssertion {
|
override fun getTypeParameterSymbol(psi: KtTypeParameter): KtTypeParameterSymbol = withValidityAssertion {
|
||||||
psi.withFirDeclarationOfType<FirTypeParameter, KtTypeParameterSymbol>(resolveState) {
|
psi.withFirDeclarationOfType<FirTypeParameter, KtTypeParameterSymbol>(resolveState) {
|
||||||
firSymbolBuilder.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.withFirDeclarationOfType<FirTypeAlias, KtTypeAliasSymbol>(resolveState) {
|
||||||
firSymbolBuilder.buildTypeAliasSymbol(it)
|
firSymbolBuilder.classifierBuilder.buildTypeAliasSymbol(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -94,20 +94,20 @@ internal class KtFirSymbolProvider(
|
|||||||
|
|
||||||
override fun getAnonymousObjectSymbol(psi: KtObjectLiteralExpression): KtAnonymousObjectSymbol = withValidityAssertion {
|
override fun getAnonymousObjectSymbol(psi: KtObjectLiteralExpression): KtAnonymousObjectSymbol = withValidityAssertion {
|
||||||
psi.objectDeclaration.withFirDeclarationOfType<FirAnonymousObject, KtAnonymousObjectSymbol>(resolveState) {
|
psi.objectDeclaration.withFirDeclarationOfType<FirAnonymousObject, KtAnonymousObjectSymbol>(resolveState) {
|
||||||
firSymbolBuilder.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.withFirDeclarationOfType<FirClass<*>, KtClassOrObjectSymbol>(resolveState) {
|
||||||
firSymbolBuilder.buildClassOrObjectSymbol(it)
|
firSymbolBuilder.classifierBuilder.buildClassOrObjectSymbol(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getNamedClassOrObjectSymbol(psi: KtClassOrObject): KtNamedClassOrObjectSymbol = withValidityAssertion {
|
override fun getNamedClassOrObjectSymbol(psi: KtClassOrObject): KtNamedClassOrObjectSymbol = withValidityAssertion {
|
||||||
require(psi !is KtObjectDeclaration || psi.parent !is KtObjectLiteralExpression)
|
require(psi !is KtObjectDeclaration || psi.parent !is KtObjectLiteralExpression)
|
||||||
psi.withFirDeclarationOfType<FirRegularClass, KtNamedClassOrObjectSymbol>(resolveState) {
|
psi.withFirDeclarationOfType<FirRegularClass, KtNamedClassOrObjectSymbol>(resolveState) {
|
||||||
firSymbolBuilder.buildNamedClassOrObjectSymbol(it)
|
firSymbolBuilder.classifierBuilder.buildNamedClassOrObjectSymbol(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -119,7 +119,7 @@ internal class KtFirSymbolProvider(
|
|||||||
|
|
||||||
override fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol? = withValidityAssertion {
|
override fun getClassOrObjectSymbolByClassId(classId: ClassId): KtClassOrObjectSymbol? = withValidityAssertion {
|
||||||
val symbol = firSymbolProvider.getClassLikeSymbolByFqName(classId) as? FirRegularClassSymbol ?: return null
|
val symbol = firSymbolProvider.getClassLikeSymbolByFqName(classId) as? FirRegularClassSymbol ?: return null
|
||||||
firSymbolBuilder.buildNamedClassOrObjectSymbol(symbol.fir)
|
firSymbolBuilder.classifierBuilder.buildNamedClassOrObjectSymbol(symbol.fir)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): Sequence<KtSymbol> {
|
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): Sequence<KtSymbol> {
|
||||||
|
|||||||
+1
-4
@@ -7,8 +7,6 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
|
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
|
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.fir.symbols.KtFirNamedClassOrObjectSymbol
|
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtClassOrObjectSymbol
|
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtNamedClassOrObjectSymbol
|
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtNamedClassOrObjectSymbol
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer
|
import org.jetbrains.kotlin.idea.frontend.api.symbols.pointers.KtSymbolPointer
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
@@ -16,7 +14,6 @@ import org.jetbrains.kotlin.name.ClassId
|
|||||||
class KtFirClassOrObjectInLibrarySymbolPointer(private val classId: ClassId) : KtSymbolPointer<KtNamedClassOrObjectSymbol>() {
|
class KtFirClassOrObjectInLibrarySymbolPointer(private val classId: ClassId) : KtSymbolPointer<KtNamedClassOrObjectSymbol>() {
|
||||||
override fun restoreSymbol(analysisSession: KtAnalysisSession): KtNamedClassOrObjectSymbol? {
|
override fun restoreSymbol(analysisSession: KtAnalysisSession): KtNamedClassOrObjectSymbol? {
|
||||||
require(analysisSession is KtFirAnalysisSession)
|
require(analysisSession is KtFirAnalysisSession)
|
||||||
val firClass = analysisSession.firSymbolBuilder.buildClassLikeSymbolByClassId(classId) ?: return null
|
return analysisSession.firSymbolBuilder.classifierBuilder.buildClassLikeSymbolByClassId(classId) as? KtNamedClassOrObjectSymbol
|
||||||
return analysisSession.firSymbolBuilder.buildNamedClassOrObjectSymbol(firClass)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+7
-3
@@ -7,6 +7,8 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.symbols.pointers
|
|||||||
|
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||||
|
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||||
|
import org.jetbrains.kotlin.fir.resolve.symbolProvider
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
|
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
|
import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession
|
||||||
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
|
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
|
||||||
@@ -18,9 +20,8 @@ internal abstract class KtFirMemberSymbolPointer<S : KtSymbol>(
|
|||||||
) : KtSymbolPointer<S>() {
|
) : KtSymbolPointer<S>() {
|
||||||
final override fun restoreSymbol(analysisSession: KtAnalysisSession): S? {
|
final override fun restoreSymbol(analysisSession: KtAnalysisSession): S? {
|
||||||
require(analysisSession is KtFirAnalysisSession)
|
require(analysisSession is KtFirAnalysisSession)
|
||||||
val owner = analysisSession.firSymbolBuilder.buildClassLikeSymbolByClassId(
|
val owner = analysisSession.getClassLikeSymbol(ownerClassId) as? FirRegularClass
|
||||||
ownerClassId
|
?: return null
|
||||||
) ?: return null
|
|
||||||
return analysisSession.chooseCandidateAndCreateSymbol(owner.declarations, owner.session)
|
return analysisSession.chooseCandidateAndCreateSymbol(owner.declarations, owner.session)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -30,3 +31,6 @@ internal abstract class KtFirMemberSymbolPointer<S : KtSymbol>(
|
|||||||
): S?
|
): S?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun KtFirAnalysisSession.getClassLikeSymbol(classId: ClassId) =
|
||||||
|
firResolveState.rootModuleSession.symbolProvider.getClassLikeSymbolByFqName(classId)?.fir
|
||||||
|
|
||||||
|
|||||||
+5
-3
@@ -34,7 +34,8 @@ internal class KtFirUsualClassType(
|
|||||||
|
|
||||||
override val classId: ClassId get() = withValidityAssertion { coneType.lookupTag.classId }
|
override val classId: ClassId get() = withValidityAssertion { coneType.lookupTag.classId }
|
||||||
override val classSymbol: KtClassLikeSymbol by cached {
|
override val classSymbol: KtClassLikeSymbol by cached {
|
||||||
firBuilder.buildClassLikeSymbolByLookupTag(coneType.lookupTag) ?: error("Class ${coneType.lookupTag} was not found")
|
firBuilder.classifierBuilder.buildClassLikeSymbolByLookupTag(coneType.lookupTag)
|
||||||
|
?: error("Class ${coneType.lookupTag} was not found")
|
||||||
}
|
}
|
||||||
override val typeArguments: List<KtTypeArgument> by cached {
|
override val typeArguments: List<KtTypeArgument> by cached {
|
||||||
coneType.typeArguments.map { typeArgument ->
|
coneType.typeArguments.map { typeArgument ->
|
||||||
@@ -58,7 +59,8 @@ internal class KtFirFunctionalType(
|
|||||||
|
|
||||||
override val classId: ClassId get() = withValidityAssertion { coneType.lookupTag.classId }
|
override val classId: ClassId get() = withValidityAssertion { coneType.lookupTag.classId }
|
||||||
override val classSymbol: KtClassLikeSymbol by cached {
|
override val classSymbol: KtClassLikeSymbol by cached {
|
||||||
firBuilder.buildClassLikeSymbolByLookupTag(coneType.lookupTag) ?: error("Class ${coneType.lookupTag} was not found")
|
firBuilder.classifierBuilder.buildClassLikeSymbolByLookupTag(coneType.lookupTag)
|
||||||
|
?: error("Class ${coneType.lookupTag} was not found")
|
||||||
}
|
}
|
||||||
override val typeArguments: List<KtTypeArgument> by cached {
|
override val typeArguments: List<KtTypeArgument> by cached {
|
||||||
coneType.typeArguments.map { typeArgument ->
|
coneType.typeArguments.map { typeArgument ->
|
||||||
@@ -113,7 +115,7 @@ internal class KtFirTypeParameterType(
|
|||||||
|
|
||||||
override val name: Name get() = withValidityAssertion { coneType.lookupTag.name }
|
override val name: Name get() = withValidityAssertion { coneType.lookupTag.name }
|
||||||
override val symbol: KtTypeParameterSymbol by cached {
|
override val symbol: KtTypeParameterSymbol by cached {
|
||||||
firBuilder.buildTypeParameterSymbolByLookupTag(coneType.lookupTag)
|
firBuilder.classifierBuilder.buildTypeParameterSymbolByLookupTag(coneType.lookupTag)
|
||||||
?: error("Type parameter ${coneType.lookupTag} was not found")
|
?: error("Type parameter ${coneType.lookupTag} was not found")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user