Refactor FIR symbols to make them and their FIR element types more clear
This commit also fixes work with Java synthetic properties
This commit is contained in:
+1
-2
@@ -8,7 +8,6 @@ package org.jetbrains.kotlin.fir.deserialization
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirClassImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirEnumEntryImpl
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTagImpl
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl
|
||||
@@ -57,7 +56,7 @@ fun deserializeClassToSymbol(
|
||||
classId, classProto, nameResolver, session,
|
||||
defaultAnnotationDeserializer ?: FirBuiltinAnnotationDeserializer(session)
|
||||
)
|
||||
typeParameters += context.typeDeserializer.ownTypeParameters.map { it.firUnsafe() }
|
||||
typeParameters += context.typeDeserializer.ownTypeParameters.map { it.fir }
|
||||
annotations += context.annotationDeserializer.loadClassAnnotations(classProto, context.nameResolver)
|
||||
|
||||
val typeDeserializer = context.typeDeserializer
|
||||
|
||||
+6
-10
@@ -11,12 +11,8 @@ import org.jetbrains.kotlin.fir.declarations.*
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.*
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirExpressionStub
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe
|
||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||
@@ -146,7 +142,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
|
||||
emptyList() /* TODO */
|
||||
)
|
||||
).apply {
|
||||
typeParameters += local.typeDeserializer.ownTypeParameters.map { it.firUnsafe() }
|
||||
typeParameters += local.typeDeserializer.ownTypeParameters.map { it.fir }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -183,7 +179,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
|
||||
} else null,
|
||||
delegate = null
|
||||
).apply {
|
||||
typeParameters += local.typeDeserializer.ownTypeParameters.map { it.firUnsafe() }
|
||||
typeParameters += local.typeDeserializer.ownTypeParameters.map { it.fir }
|
||||
annotations += c.annotationDeserializer.loadPropertyAnnotations(proto, local.nameResolver)
|
||||
}
|
||||
}
|
||||
@@ -200,7 +196,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
|
||||
c.versionRequirementTable
|
||||
|
||||
val callableName = c.nameResolver.getName(proto.name)
|
||||
val symbol = FirFunctionSymbol(CallableId(c.packageFqName, c.relativeClassName, callableName))
|
||||
val symbol = FirNamedFunctionSymbol(CallableId(c.packageFqName, c.relativeClassName, callableName))
|
||||
val local = c.childContext(proto.typeParameterList)
|
||||
|
||||
// TODO: support contracts
|
||||
@@ -223,7 +219,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
|
||||
receiverTypeRef = proto.receiverType(local.typeTable)?.toTypeRef(local),
|
||||
returnTypeRef = proto.returnType(local.typeTable).toTypeRef(local)
|
||||
).apply {
|
||||
typeParameters += local.typeDeserializer.ownTypeParameters.map { it.firUnsafe() }
|
||||
typeParameters += local.typeDeserializer.ownTypeParameters.map { it.fir }
|
||||
valueParameters += local.memberDeserializer.valueParameters(proto.valueParameterList)
|
||||
annotations += local.annotationDeserializer.loadFunctionAnnotations(proto, local.nameResolver)
|
||||
}
|
||||
@@ -232,7 +228,7 @@ class FirMemberDeserializer(private val c: FirDeserializationContext) {
|
||||
fun loadConstructor(proto: ProtoBuf.Constructor, klass: FirRegularClass): FirConstructor {
|
||||
val flags = proto.flags
|
||||
val relativeClassName = c.relativeClassName!!
|
||||
val symbol = FirFunctionSymbol(CallableId(c.packageFqName, relativeClassName, relativeClassName.shortName()))
|
||||
val symbol = FirConstructorSymbol(CallableId(c.packageFqName, relativeClassName, relativeClassName.shortName()))
|
||||
val local = c.childContext(emptyList())
|
||||
val isPrimary = !Flags.IS_SECONDARY.get(flags)
|
||||
|
||||
|
||||
+8
-16
@@ -8,10 +8,8 @@ package org.jetbrains.kotlin.fir.deserialization
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirTypeParameterImpl
|
||||
import org.jetbrains.kotlin.fir.resolve.toTypeProjection
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe
|
||||
import org.jetbrains.kotlin.fir.symbols.*
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeAbbreviatedTypeImpl
|
||||
@@ -68,11 +66,11 @@ class FirTypeDeserializer(
|
||||
}
|
||||
}
|
||||
|
||||
private val typeParameterDescriptors =
|
||||
private val typeParameterDescriptors: Map<Int, FirTypeParameterSymbol> =
|
||||
if (typeParameterProtos.isEmpty()) {
|
||||
mapOf<Int, ConeTypeParameterSymbol>()
|
||||
mapOf()
|
||||
} else {
|
||||
val result = LinkedHashMap<Int, ConeTypeParameterSymbol>()
|
||||
val result = LinkedHashMap<Int, FirTypeParameterSymbol>()
|
||||
for ((index, proto) in typeParameterProtos.withIndex()) {
|
||||
if (!proto.hasId()) continue
|
||||
val name = nameResolver.getName(proto.name)
|
||||
@@ -94,8 +92,8 @@ class FirTypeDeserializer(
|
||||
init {
|
||||
for ((index, proto) in typeParameterProtos.withIndex()) {
|
||||
if (!proto.hasId()) continue
|
||||
val symbol = typeParameterDescriptors[proto.id] as FirTypeParameterSymbol
|
||||
val declaration = symbol.firUnsafe<FirTypeParameterImpl>()
|
||||
val symbol = typeParameterDescriptors[proto.id]!!
|
||||
val declaration = symbol.fir as FirTypeParameterImpl
|
||||
declaration.apply {
|
||||
proto.upperBoundList.mapTo(bounds) {
|
||||
FirResolvedTypeRefImpl(session, null, type(it), emptyList())
|
||||
@@ -104,17 +102,11 @@ class FirTypeDeserializer(
|
||||
}
|
||||
}
|
||||
|
||||
val ownTypeParameters: List<ConeTypeParameterSymbol>
|
||||
val ownTypeParameters: List<FirTypeParameterSymbol>
|
||||
get() = typeParameterDescriptors.values.toList()
|
||||
|
||||
|
||||
fun ConeClassLikeSymbol.typeParameters(): List<ConeTypeParameterSymbol> = when (this) {
|
||||
is FirTypeAliasSymbol -> fir.typeParameters
|
||||
is FirClassSymbol -> fir.typeParameters
|
||||
else -> error("?!id:2")
|
||||
}.map {
|
||||
it.symbol
|
||||
}
|
||||
fun FirClassLikeSymbol<*>.typeParameters(): List<ConeTypeParameterSymbol> = fir.typeParameters.map { it.symbol }
|
||||
|
||||
fun simpleType(proto: ProtoBuf.Type): ConeLookupTagBasedType? {
|
||||
|
||||
|
||||
+4
-4
@@ -7,16 +7,16 @@ package org.jetbrains.kotlin.fir.resolve
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirElement
|
||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.fir.visitors.FirTransformer
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
|
||||
abstract class AbstractFirSymbolProvider : FirSymbolProvider() {
|
||||
protected val classCache = HashMap<ClassId, ConeClassLikeSymbol?>()
|
||||
protected val topLevelCallableCache = HashMap<CallableId, List<ConeCallableSymbol>>()
|
||||
protected val classCache = HashMap<ClassId, FirClassLikeSymbol<*>?>()
|
||||
protected val topLevelCallableCache = HashMap<CallableId, List<FirCallableSymbol<*>>>()
|
||||
protected val packageCache = HashMap<FqName, FqName?>()
|
||||
|
||||
protected inline fun <K, V : Any?> MutableMap<K, V>.lookupCacheOrCalculate(key: K, crossinline l: (K) -> V): V? {
|
||||
|
||||
@@ -10,7 +10,8 @@ import org.jetbrains.kotlin.fir.declarations.FirFile
|
||||
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
||||
import org.jetbrains.kotlin.fir.service
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -18,9 +19,9 @@ import org.jetbrains.kotlin.name.Name
|
||||
abstract class FirProvider : FirSymbolProvider() {
|
||||
abstract fun getFirClassifierByFqName(fqName: ClassId): FirMemberDeclaration?
|
||||
|
||||
abstract override fun getClassLikeSymbolByFqName(classId: ClassId): ConeClassLikeSymbol?
|
||||
abstract override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>?
|
||||
|
||||
abstract override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<ConeCallableSymbol>
|
||||
abstract override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<FirCallableSymbol<*>>
|
||||
|
||||
override fun getPackage(fqName: FqName): FqName? {
|
||||
if (getFirFilesByPackage(fqName).isNotEmpty()) return fqName
|
||||
|
||||
@@ -11,13 +11,15 @@ import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.service
|
||||
import org.jetbrains.kotlin.fir.symbols.*
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
abstract class FirSymbolProvider {
|
||||
|
||||
abstract fun getClassLikeSymbolByFqName(classId: ClassId): ConeClassLikeSymbol?
|
||||
abstract fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>?
|
||||
|
||||
fun getSymbolByLookupTag(lookupTag: ConeClassifierLookupTag): ConeClassifierSymbol? {
|
||||
return when (lookupTag) {
|
||||
@@ -35,7 +37,7 @@ abstract class FirSymbolProvider {
|
||||
}
|
||||
}
|
||||
|
||||
abstract fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<ConeCallableSymbol>
|
||||
abstract fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<FirCallableSymbol<*>>
|
||||
|
||||
abstract fun getClassDeclaredMemberScope(classId: ClassId): FirScope?
|
||||
abstract fun getClassUseSiteMemberScope(
|
||||
|
||||
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.render
|
||||
import org.jetbrains.kotlin.fir.service
|
||||
import org.jetbrains.kotlin.fir.symbols.*
|
||||
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.impl.ConeAbbreviatedTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl
|
||||
@@ -52,6 +53,8 @@ fun ConeClassifierLookupTag.toSymbol(useSiteSession: FirSession): ConeClassifier
|
||||
else -> error("sealed ${this::class}")
|
||||
}
|
||||
|
||||
fun ConeTypeParameterLookupTag.toSymbol(): FirTypeParameterSymbol = this.symbol as FirTypeParameterSymbol
|
||||
|
||||
fun ConeClassLikeLookupTag.constructClassType(typeArguments: Array<ConeKotlinTypeProjection>, isNullable: Boolean): ConeLookupTagBasedType {
|
||||
return ConeClassTypeImpl(this, typeArguments, isNullable)
|
||||
}
|
||||
|
||||
@@ -7,14 +7,11 @@ package org.jetbrains.kotlin.fir.resolve
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeParameter
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.firSafeNullable
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirCompositeScope
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeClassTypeImpl
|
||||
@@ -33,8 +30,7 @@ fun ConeKotlinType.scope(useSiteSession: FirSession, scopeSession: ScopeSession)
|
||||
}
|
||||
is ConeTypeParameterType -> {
|
||||
// TODO: support LibraryTypeParameterSymbol or get rid of it
|
||||
val toSymbol = this.lookupTag.toSymbol(useSiteSession)?.takeIf { it is FirBasedSymbol<*> } ?: return null
|
||||
val fir = toSymbol.firUnsafe<FirTypeParameter>()
|
||||
val fir = lookupTag.toSymbol().fir
|
||||
FirCompositeScope(
|
||||
fir.bounds.mapNotNullTo(mutableListOf()) {
|
||||
it.coneTypeUnsafe<ConeKotlinType>().scope(useSiteSession, scopeSession)
|
||||
|
||||
@@ -85,7 +85,7 @@ fun FirRegularClass.buildDefaultUseSiteScope(useSiteSession: FirSession, builder
|
||||
private fun ConeClassLikeType.wrapSubstitutionScopeIfNeed(
|
||||
session: FirSession,
|
||||
useSiteScope: FirScope,
|
||||
declaration: FirClassLikeDeclaration,
|
||||
declaration: FirClassLikeDeclaration<*>,
|
||||
builder: ScopeSession
|
||||
): FirScope {
|
||||
if (this.typeArguments.isEmpty()) return useSiteScope
|
||||
|
||||
@@ -13,7 +13,6 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl
|
||||
import org.jetbrains.kotlin.fir.expressions.FirExpression
|
||||
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirQualifiedAccessExpressionImpl
|
||||
import org.jetbrains.kotlin.fir.references.FirResolvedCallableReferenceImpl
|
||||
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.constructClassType
|
||||
@@ -29,9 +28,7 @@ import org.jetbrains.kotlin.fir.scopes.impl.FirExplicitSimpleImportingScope
|
||||
import org.jetbrains.kotlin.fir.scopes.processClassifiersByNameWithAction
|
||||
import org.jetbrains.kotlin.fir.service
|
||||
import org.jetbrains.kotlin.fir.symbols.*
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -93,7 +90,7 @@ class CheckerSinkImpl(override val components: InferenceComponents, var continua
|
||||
|
||||
|
||||
class Candidate(
|
||||
val symbol: ConeSymbol,
|
||||
val symbol: FirBasedSymbol<*>,
|
||||
val dispatchReceiverValue: ClassDispatchReceiverValue?,
|
||||
val implicitExtensionReceiverValue: ImplicitReceiverValue?,
|
||||
val explicitReceiverKind: ExplicitReceiverKind,
|
||||
@@ -136,14 +133,14 @@ enum class TowerDataKind {
|
||||
|
||||
interface TowerScopeLevel {
|
||||
|
||||
sealed class Token<out T : ConeSymbol> {
|
||||
object Properties : Token<ConePropertySymbol>()
|
||||
sealed class Token<out T : FirBasedSymbol<*>> {
|
||||
object Properties : Token<FirPropertySymbol>()
|
||||
|
||||
object Functions : Token<ConeFunctionSymbol>()
|
||||
object Objects : Token<ConeClassifierSymbol>()
|
||||
object Functions : Token<FirFunctionSymbol<*>>()
|
||||
object Objects : Token<FirBasedSymbol<*>>()
|
||||
}
|
||||
|
||||
fun <T : ConeSymbol> processElementsByName(
|
||||
fun <T : FirBasedSymbol<*>> processElementsByName(
|
||||
token: Token<T>,
|
||||
name: Name,
|
||||
explicitReceiver: ExpressionReceiverValue?,
|
||||
@@ -159,7 +156,7 @@ interface TowerScopeLevel {
|
||||
}
|
||||
|
||||
object Empty : TowerScopeLevel {
|
||||
override fun <T : ConeSymbol> processElementsByName(
|
||||
override fun <T : FirBasedSymbol<*>> processElementsByName(
|
||||
token: Token<T>,
|
||||
name: Name,
|
||||
explicitReceiver: ExpressionReceiverValue?,
|
||||
@@ -169,15 +166,15 @@ interface TowerScopeLevel {
|
||||
}
|
||||
|
||||
abstract class SessionBasedTowerLevel(val session: FirSession) : TowerScopeLevel {
|
||||
protected fun ConeSymbol.dispatchReceiverValue(): ClassDispatchReceiverValue? {
|
||||
protected fun FirBasedSymbol<*>.dispatchReceiverValue(): ClassDispatchReceiverValue? {
|
||||
return when (this) {
|
||||
is FirFunctionSymbol -> fir.dispatchReceiverValue(session)
|
||||
is FirNamedFunctionSymbol -> fir.dispatchReceiverValue(session)
|
||||
is FirClassSymbol -> ClassDispatchReceiverValue(fir.symbol)
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
|
||||
protected fun ConeCallableSymbol.hasConsistentExtensionReceiver(extensionReceiver: ReceiverValue?): Boolean {
|
||||
protected fun FirCallableSymbol<*>.hasConsistentExtensionReceiver(extensionReceiver: ReceiverValue?): Boolean {
|
||||
val hasExtensionReceiver = hasExtensionReceiver()
|
||||
return hasExtensionReceiver == (extensionReceiver != null)
|
||||
}
|
||||
@@ -196,7 +193,7 @@ class MemberScopeTowerLevel(
|
||||
val scopeSession: ScopeSession
|
||||
) : SessionBasedTowerLevel(session) {
|
||||
|
||||
private fun <T : ConeSymbol> processMembers(
|
||||
private fun <T : FirBasedSymbol<*>> processMembers(
|
||||
output: TowerScopeLevel.TowerScopeLevelProcessor<T>,
|
||||
explicitExtensionReceiver: ExpressionReceiverValue?,
|
||||
processScopeMembers: FirScope.(processor: (T) -> ProcessorAction) -> ProcessorAction
|
||||
@@ -205,11 +202,11 @@ class MemberScopeTowerLevel(
|
||||
val extensionReceiver = implicitExtensionReceiver ?: explicitExtensionReceiver
|
||||
val scope = dispatchReceiver.type.scope(session, scopeSession) ?: return ProcessorAction.NEXT
|
||||
if (scope.processScopeMembers { candidate ->
|
||||
if (candidate is ConeCallableSymbol && candidate.hasConsistentExtensionReceiver(extensionReceiver)) {
|
||||
if (candidate is FirCallableSymbol<*> && candidate.hasConsistentExtensionReceiver(extensionReceiver)) {
|
||||
// NB: we do not check dispatchReceiverValue != null here,
|
||||
// because of objects & constructors (see comments in dispatchReceiverValue() implementation)
|
||||
output.consumeCandidate(candidate, candidate.dispatchReceiverValue(), implicitExtensionReceiver)
|
||||
} else if (candidate is ConeClassLikeSymbol) {
|
||||
} else if (candidate is FirClassLikeSymbol<*>) {
|
||||
output.consumeCandidate(candidate, null, implicitExtensionReceiver)
|
||||
} else {
|
||||
ProcessorAction.NEXT
|
||||
@@ -222,7 +219,7 @@ class MemberScopeTowerLevel(
|
||||
}
|
||||
}
|
||||
|
||||
override fun <T : ConeSymbol> processElementsByName(
|
||||
override fun <T : FirBasedSymbol<*>> processElementsByName(
|
||||
token: TowerScopeLevel.Token<T>,
|
||||
name: Name,
|
||||
explicitReceiver: ExpressionReceiverValue?,
|
||||
@@ -244,7 +241,7 @@ class MemberScopeTowerLevel(
|
||||
|
||||
}
|
||||
|
||||
private fun ConeCallableSymbol.hasExtensionReceiver(): Boolean = (this as? FirCallableSymbol)?.fir?.receiverTypeRef != null
|
||||
private fun FirCallableSymbol<*>.hasExtensionReceiver(): Boolean = this.fir.receiverTypeRef != null
|
||||
|
||||
// This is more like "scope-based tower level"
|
||||
// We can access here members of currently accessible scope which is not influenced by explicit receiver
|
||||
@@ -258,7 +255,7 @@ class ScopeTowerLevel(
|
||||
val scope: FirScope,
|
||||
val implicitExtensionReceiver: ImplicitReceiverValue? = null
|
||||
) : SessionBasedTowerLevel(session) {
|
||||
override fun <T : ConeSymbol> processElementsByName(
|
||||
override fun <T : FirBasedSymbol<*>> processElementsByName(
|
||||
token: TowerScopeLevel.Token<T>,
|
||||
name: Name,
|
||||
explicitReceiver: ExpressionReceiverValue?,
|
||||
@@ -305,7 +302,7 @@ class ScopeTowerLevel(
|
||||
* Handles only statics and top-levels, DOES NOT handle objects/companions members
|
||||
*/
|
||||
class QualifiedReceiverTowerLevel(session: FirSession) : SessionBasedTowerLevel(session) {
|
||||
override fun <T : ConeSymbol> processElementsByName(
|
||||
override fun <T : FirBasedSymbol<*>> processElementsByName(
|
||||
token: TowerScopeLevel.Token<T>,
|
||||
name: Name,
|
||||
explicitReceiver: ExpressionReceiverValue?,
|
||||
@@ -329,8 +326,8 @@ class QualifiedReceiverTowerLevel(session: FirSession) : SessionBasedTowerLevel(
|
||||
}
|
||||
} else {
|
||||
scope.processCallables(name, token.cast()) {
|
||||
val fir = it.firUnsafe<FirCallableMemberDeclaration>()
|
||||
if (fir.isStatic || it.callableId.classId == null) {
|
||||
val fir = it.fir
|
||||
if (fir is FirCallableMemberDeclaration<*> && fir.isStatic || it.callableId.classId == null) {
|
||||
processor.consumeCandidate(it as T, null, null)
|
||||
} else {
|
||||
ProcessorAction.NEXT
|
||||
@@ -341,7 +338,7 @@ class QualifiedReceiverTowerLevel(session: FirSession) : SessionBasedTowerLevel(
|
||||
|
||||
}
|
||||
|
||||
class QualifiedReceiverTowerDataConsumer<T : ConeSymbol>(
|
||||
class QualifiedReceiverTowerDataConsumer<T : FirBasedSymbol<*>>(
|
||||
val session: FirSession,
|
||||
val name: Name,
|
||||
val token: TowerScopeLevel.Token<T>,
|
||||
@@ -599,7 +596,7 @@ class MultiplexerTowerDataConsumer(
|
||||
}
|
||||
|
||||
|
||||
class ExplicitReceiverTowerDataConsumer<T : ConeSymbol>(
|
||||
class ExplicitReceiverTowerDataConsumer<T : FirBasedSymbol<*>>(
|
||||
val session: FirSession,
|
||||
val name: Name,
|
||||
val token: TowerScopeLevel.Token<T>,
|
||||
@@ -657,11 +654,11 @@ class ExplicitReceiverTowerDataConsumer<T : ConeSymbol>(
|
||||
dispatchReceiverValue: ClassDispatchReceiverValue?,
|
||||
implicitExtensionReceiverValue: ImplicitReceiverValue?
|
||||
): ProcessorAction {
|
||||
if (symbol is FirFunctionSymbol && symbol.callableId.packageName.startsWith(defaultPackage)) {
|
||||
if (symbol is FirNamedFunctionSymbol && symbol.callableId.packageName.startsWith(defaultPackage)) {
|
||||
val explicitReceiverType = explicitReceiver.type
|
||||
if (dispatchReceiverValue == null && explicitReceiverType is ConeClassType) {
|
||||
val declarationReceiverTypeRef =
|
||||
(symbol as? FirCallableSymbol)?.fir?.receiverTypeRef as? FirResolvedTypeRef
|
||||
(symbol as? FirCallableSymbol<*>)?.fir?.receiverTypeRef as? FirResolvedTypeRef
|
||||
val declarationReceiverType = declarationReceiverTypeRef?.type
|
||||
if (declarationReceiverType is ConeClassType) {
|
||||
if (!AbstractTypeChecker.isSubtypeOf(
|
||||
@@ -699,7 +696,7 @@ class ExplicitReceiverTowerDataConsumer<T : ConeSymbol>(
|
||||
|
||||
}
|
||||
|
||||
class NoExplicitReceiverTowerDataConsumer<T : ConeSymbol>(
|
||||
class NoExplicitReceiverTowerDataConsumer<T : FirBasedSymbol<*>>(
|
||||
val session: FirSession,
|
||||
val name: Name,
|
||||
val token: TowerScopeLevel.Token<T>,
|
||||
@@ -962,7 +959,7 @@ class InvokeCandidateCollector(
|
||||
}
|
||||
}
|
||||
|
||||
fun FirCallableDeclaration.dispatchReceiverValue(session: FirSession): ClassDispatchReceiverValue? {
|
||||
fun FirCallableDeclaration<*>.dispatchReceiverValue(session: FirSession): ClassDispatchReceiverValue? {
|
||||
// TODO: this is not true at least for inner class constructors
|
||||
if (this is FirConstructor) return null
|
||||
val id = (this.symbol as ConeCallableSymbol).callableId.classId ?: return null
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
package org.jetbrains.kotlin.fir.resolve.calls
|
||||
|
||||
import org.jetbrains.kotlin.fir.expressions.*
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.resolve.calls.components.PostponedArgumentsAnalyzer
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.model.ConstraintStorage
|
||||
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
|
||||
@@ -28,7 +28,7 @@ class CandidateFactory(
|
||||
}
|
||||
|
||||
fun createCandidate(
|
||||
symbol: ConeSymbol,
|
||||
symbol: FirBasedSymbol<*>,
|
||||
dispatchReceiverValue: ClassDispatchReceiverValue?,
|
||||
implicitExtensionReceiverValue: ImplicitReceiverValue?,
|
||||
explicitReceiverKind: ExplicitReceiverKind
|
||||
|
||||
+3
-5
@@ -6,12 +6,10 @@
|
||||
package org.jetbrains.kotlin.fir.resolve.calls
|
||||
|
||||
import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirDeclaration
|
||||
import org.jetbrains.kotlin.fir.renderWithType
|
||||
import org.jetbrains.kotlin.fir.resolve.constructType
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe
|
||||
import org.jetbrains.kotlin.fir.service
|
||||
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
|
||||
import org.jetbrains.kotlin.fir.symbols.invoke
|
||||
@@ -23,8 +21,8 @@ import org.jetbrains.kotlin.resolve.calls.inference.model.SimpleConstraintSystem
|
||||
|
||||
internal object CreateFreshTypeVariableSubstitutorStage : ResolutionStage() {
|
||||
override suspend fun check(candidate: Candidate, sink: CheckerSink, callInfo: CallInfo) {
|
||||
val declaration = candidate.symbol.firUnsafe<FirDeclaration>()
|
||||
if (declaration !is FirCallableMemberDeclaration || declaration.typeParameters.isEmpty()) {
|
||||
val declaration = candidate.symbol.fir
|
||||
if (declaration !is FirCallableMemberDeclaration<*> || declaration.typeParameters.isEmpty()) {
|
||||
candidate.substitutor = ConeSubstitutor.Empty
|
||||
return
|
||||
}
|
||||
@@ -85,7 +83,7 @@ internal object CreateFreshTypeVariableSubstitutorStage : ResolutionStage() {
|
||||
}
|
||||
|
||||
fun createToFreshVariableSubstitutorAndAddInitialConstraints(
|
||||
declaration: FirCallableMemberDeclaration,
|
||||
declaration: FirCallableMemberDeclaration<*>,
|
||||
candidate: Candidate,
|
||||
csBuilder: ConstraintSystemOperation
|
||||
): Pair<ConeSubstitutor, List<ConeTypeVariable>> {
|
||||
|
||||
+1
-4
@@ -5,11 +5,9 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.resolve.calls
|
||||
|
||||
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
|
||||
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
||||
import org.jetbrains.kotlin.fir.declarations.FirNamedFunction
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.coneTypeUnsafe
|
||||
@@ -51,8 +49,7 @@ class ConeOverloadConflictResolver(
|
||||
}
|
||||
|
||||
private fun createFlatSignature(call: Candidate): FlatSignature<Candidate> {
|
||||
val declaration = call.symbol.firUnsafe<FirCallableDeclaration>()
|
||||
return when (declaration) {
|
||||
return when (val declaration = call.symbol.fir) {
|
||||
is FirNamedFunction -> createFlatSignature(call, declaration)
|
||||
is FirConstructor -> createFlatSignature(call, declaration)
|
||||
else -> error("Not supported: $declaration")
|
||||
|
||||
@@ -6,12 +6,9 @@
|
||||
package org.jetbrains.kotlin.fir.resolve.calls
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.FirMemberDeclaration
|
||||
import org.jetbrains.kotlin.fir.expressions.FirResolvedQualifier
|
||||
import org.jetbrains.kotlin.fir.resolve.FirProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.firSafeNullable
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe
|
||||
import org.jetbrains.kotlin.fir.service
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol
|
||||
@@ -24,7 +21,6 @@ import org.jetbrains.kotlin.load.java.JavaVisibilities
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind
|
||||
import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind.*
|
||||
import java.lang.IllegalStateException
|
||||
|
||||
|
||||
abstract class ResolutionStage {
|
||||
@@ -80,7 +76,7 @@ internal sealed class CheckReceivers : ResolutionStage() {
|
||||
}
|
||||
|
||||
override fun Candidate.getReceiverValue(): ReceiverValue? {
|
||||
val callableSymbol = symbol as? FirCallableSymbol ?: return null
|
||||
val callableSymbol = symbol as? FirCallableSymbol<*> ?: return null
|
||||
val callable = callableSymbol.fir
|
||||
val type = (callable.receiverTypeRef as FirResolvedTypeRef?)?.type ?: return null
|
||||
return object : ReceiverValue {
|
||||
@@ -136,8 +132,8 @@ internal sealed class CheckReceivers : ResolutionStage() {
|
||||
|
||||
internal object MapArguments : ResolutionStage() {
|
||||
override suspend fun check(candidate: Candidate, sink: CheckerSink, callInfo: CallInfo) {
|
||||
val symbol = candidate.symbol as? FirFunctionSymbol ?: return sink.reportApplicability(CandidateApplicability.HIDDEN)
|
||||
val function = symbol.firUnsafe<FirFunction>()
|
||||
val symbol = candidate.symbol as? FirFunctionSymbol<*> ?: return sink.reportApplicability(CandidateApplicability.HIDDEN)
|
||||
val function = symbol.fir
|
||||
val processor = FirCallArgumentsProcessor(function, callInfo.arguments)
|
||||
val mappingResult = processor.process()
|
||||
candidate.argumentMapping = mappingResult.argumentMapping
|
||||
@@ -190,8 +186,8 @@ internal object CheckVisibility : CheckerStage() {
|
||||
|
||||
override suspend fun check(candidate: Candidate, sink: CheckerSink, callInfo: CallInfo) {
|
||||
val symbol = candidate.symbol
|
||||
val declaration = symbol.firSafeNullable<FirMemberDeclaration>()
|
||||
if (declaration != null && !declaration.visibility.isPublicAPI) {
|
||||
val declaration = symbol.fir
|
||||
if (declaration is FirMemberDeclaration && !declaration.visibility.isPublicAPI) {
|
||||
val visible = when (declaration.visibility) {
|
||||
JavaVisibilities.PACKAGE_VISIBILITY ->
|
||||
symbol.packageFqName() == callInfo.containingFile.packageFqName
|
||||
|
||||
@@ -11,10 +11,11 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertyGetter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDefaultPropertySetter
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirMemberPropertyImpl
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.firSafeNullable
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.symbols.*
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
@@ -33,10 +34,10 @@ class FirSyntheticPropertiesScope(
|
||||
|
||||
private fun checkGetAndCreateSynthetic(
|
||||
name: Name,
|
||||
symbol: ConeFunctionSymbol,
|
||||
processor: (ConeVariableSymbol) -> ProcessorAction
|
||||
symbol: FirFunctionSymbol<*>,
|
||||
processor: (FirCallableSymbol<*>) -> ProcessorAction
|
||||
): ProcessorAction {
|
||||
val fir = symbol.firSafeNullable<FirNamedFunction>() ?: return ProcessorAction.NEXT
|
||||
val fir = symbol.fir as? FirNamedFunction ?: return ProcessorAction.NEXT
|
||||
|
||||
if (fir.typeParameters.isNotEmpty()) return ProcessorAction.NEXT
|
||||
if (fir.valueParameters.isNotEmpty()) return ProcessorAction.NEXT
|
||||
@@ -67,7 +68,7 @@ class FirSyntheticPropertiesScope(
|
||||
return processor(synthetic)
|
||||
}
|
||||
|
||||
override fun processPropertiesByName(name: Name, processor: (ConeVariableSymbol) -> ProcessorAction): ProcessorAction {
|
||||
override fun processPropertiesByName(name: Name, processor: (FirCallableSymbol<*>) -> ProcessorAction): ProcessorAction {
|
||||
if (name.isSpecial) return ProcessorAction.NEXT
|
||||
if (baseScope.processFunctionsByName(Name.guessByFirstCharacter("get${name.identifier.capitalize()}")) {
|
||||
checkGetAndCreateSynthetic(name, it, processor)
|
||||
|
||||
+4
-4
@@ -9,8 +9,8 @@ import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -25,7 +25,7 @@ class FirCompositeSymbolProvider(val providers: List<FirSymbolProvider>) : FirSy
|
||||
return providers.firstNotNullResult { it.getClassUseSiteMemberScope(classId, useSiteSession, scopeSession) }
|
||||
}
|
||||
|
||||
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<ConeCallableSymbol> {
|
||||
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<FirCallableSymbol<*>> {
|
||||
return providers.flatMap { it.getTopLevelCallableSymbols(packageFqName, name) }
|
||||
}
|
||||
|
||||
@@ -35,7 +35,7 @@ class FirCompositeSymbolProvider(val providers: List<FirSymbolProvider>) : FirSy
|
||||
return providers.firstNotNullResult { it.getPackage(fqName) }
|
||||
}
|
||||
|
||||
override fun getClassLikeSymbolByFqName(classId: ClassId): ConeClassLikeSymbol? {
|
||||
override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? {
|
||||
return providers.firstNotNullResult { it.getClassLikeSymbolByFqName(classId) }
|
||||
}
|
||||
|
||||
|
||||
+4
-4
@@ -13,8 +13,8 @@ import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.service
|
||||
import org.jetbrains.kotlin.fir.symbols.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
@@ -28,7 +28,7 @@ class FirDependenciesSymbolProviderImpl(val session: FirSession) : AbstractFirSy
|
||||
}.toList()
|
||||
}
|
||||
|
||||
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<ConeCallableSymbol> {
|
||||
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<FirCallableSymbol<*>> {
|
||||
return topLevelCallableCache.lookupCacheOrCalculate(CallableId(packageFqName, null, name)) {
|
||||
dependencyProviders.flatMap { provider -> provider.getTopLevelCallableSymbols(packageFqName, name) }
|
||||
} ?: emptyList()
|
||||
@@ -37,7 +37,7 @@ class FirDependenciesSymbolProviderImpl(val session: FirSession) : AbstractFirSy
|
||||
override fun getClassDeclaredMemberScope(classId: ClassId) =
|
||||
dependencyProviders.firstNotNullResult { it.getClassDeclaredMemberScope(classId) }
|
||||
|
||||
override fun getClassLikeSymbolByFqName(classId: ClassId): ConeClassLikeSymbol? {
|
||||
override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? {
|
||||
return classCache.lookupCacheOrCalculate(classId) {
|
||||
for (provider in dependencyProviders) {
|
||||
provider.getClassLikeSymbolByFqName(classId)?.let {
|
||||
|
||||
+10
-10
@@ -20,12 +20,12 @@ import org.jetbrains.kotlin.fir.deserialization.FirBuiltinAnnotationDeserializer
|
||||
import org.jetbrains.kotlin.fir.deserialization.FirDeserializationContext
|
||||
import org.jetbrains.kotlin.fir.deserialization.deserializeClassToSymbol
|
||||
import org.jetbrains.kotlin.fir.resolve.*
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScope
|
||||
import org.jetbrains.kotlin.fir.symbols.*
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.types.impl.ConeTypeParameterTypeImpl
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
@@ -76,7 +76,7 @@ class FirLibrarySymbolProviderImpl(val session: FirSession) : FirSymbolProvider(
|
||||
|
||||
val lookup = mutableMapOf<ClassId, FirClassSymbol>()
|
||||
|
||||
fun getClassLikeSymbolByFqName(classId: ClassId): ConeClassLikeSymbol? =
|
||||
fun getClassLikeSymbolByFqName(classId: ClassId): FirClassSymbol? =
|
||||
findAndDeserializeClass(classId)
|
||||
|
||||
private fun findAndDeserializeClass(
|
||||
@@ -109,7 +109,7 @@ class FirLibrarySymbolProviderImpl(val session: FirSession) : FirSymbolProvider(
|
||||
}
|
||||
}
|
||||
|
||||
fun getTopLevelCallableSymbols(name: Name): List<ConeCallableSymbol> {
|
||||
fun getTopLevelCallableSymbols(name: Name): List<FirCallableSymbol<*>> {
|
||||
return packageProto.`package`.functionList.filter { nameResolver.getName(it.name) == name }.map {
|
||||
memberDeserializer.loadFunction(it).symbol
|
||||
}
|
||||
@@ -130,7 +130,7 @@ class FirLibrarySymbolProviderImpl(val session: FirSession) : FirSymbolProvider(
|
||||
scopeSession: ScopeSession
|
||||
): FirScope? {
|
||||
val symbol = this.getClassLikeSymbolByFqName(classId) ?: return null
|
||||
return symbol.firUnsafe<FirRegularClass>().buildDefaultUseSiteScope(useSiteSession, scopeSession)
|
||||
return symbol.fir.buildDefaultUseSiteScope(useSiteSession, scopeSession)
|
||||
}
|
||||
|
||||
override fun getPackage(fqName: FqName): FqName? {
|
||||
@@ -152,9 +152,9 @@ class FirLibrarySymbolProviderImpl(val session: FirSession) : FirSymbolProvider(
|
||||
|
||||
private val allPackageFragments = loadBuiltIns().groupBy { it.fqName }
|
||||
|
||||
private val fictitiousFunctionSymbols = mutableMapOf<Int, ConeClassSymbol>()
|
||||
private val fictitiousFunctionSymbols = mutableMapOf<Int, FirClassSymbol>()
|
||||
|
||||
override fun getClassLikeSymbolByFqName(classId: ClassId): ConeClassLikeSymbol? {
|
||||
override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassSymbol? {
|
||||
return allPackageFragments[classId.packageFqName]?.firstNotNullResult {
|
||||
it.getClassLikeSymbolByFqName(classId)
|
||||
} ?: with(classId) {
|
||||
@@ -204,7 +204,7 @@ class FirLibrarySymbolProviderImpl(val session: FirSession) : FirSymbolProvider(
|
||||
FirMemberFunctionImpl(
|
||||
session,
|
||||
null,
|
||||
FirFunctionSymbol(CallableId(packageFqName, relativeClassName, name)),
|
||||
FirNamedFunctionSymbol(CallableId(packageFqName, relativeClassName, name)),
|
||||
name,
|
||||
Visibilities.PUBLIC,
|
||||
Modality.ABSTRACT,
|
||||
@@ -251,7 +251,7 @@ class FirLibrarySymbolProviderImpl(val session: FirSession) : FirSymbolProvider(
|
||||
}
|
||||
}
|
||||
|
||||
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<ConeCallableSymbol> {
|
||||
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<FirCallableSymbol<*>> {
|
||||
return allPackageFragments[packageFqName]?.flatMap {
|
||||
it.getTopLevelCallableSymbols(name)
|
||||
} ?: emptyList()
|
||||
@@ -273,7 +273,7 @@ class FirLibrarySymbolProviderImpl(val session: FirSession) : FirSymbolProvider(
|
||||
}
|
||||
|
||||
override fun getAllCallableNamesInClass(classId: ClassId): Set<Name> {
|
||||
return getClassDeclarations(classId).filterIsInstance<FirCallableMemberDeclaration>().mapTo(mutableSetOf()) { it.name }
|
||||
return getClassDeclarations(classId).filterIsInstance<FirCallableMemberDeclaration<*>>().mapTo(mutableSetOf()) { it.name }
|
||||
}
|
||||
|
||||
private fun getClassDeclarations(classId: ClassId): List<FirDeclaration> {
|
||||
|
||||
@@ -15,6 +15,8 @@ import org.jetbrains.kotlin.fir.resolve.buildDefaultUseSiteScope
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirClassDeclaredMemberScope
|
||||
import org.jetbrains.kotlin.fir.symbols.*
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
|
||||
import org.jetbrains.kotlin.fir.types.ConeLookupTagBasedType
|
||||
@@ -29,11 +31,11 @@ class FirProviderImpl(val session: FirSession) : FirProvider() {
|
||||
return state.callableContainerMap[symbol]
|
||||
}
|
||||
|
||||
override fun getClassLikeSymbolByFqName(classId: ClassId): ConeClassLikeSymbol? {
|
||||
return (getFirClassifierByFqName(classId) as? FirSymbolOwner<*>)?.symbol as? ConeClassLikeSymbol
|
||||
override fun getClassLikeSymbolByFqName(classId: ClassId): FirClassLikeSymbol<*>? {
|
||||
return getFirClassifierByFqName(classId)?.symbol
|
||||
}
|
||||
|
||||
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<ConeCallableSymbol> {
|
||||
override fun getTopLevelCallableSymbols(packageFqName: FqName, name: Name): List<FirCallableSymbol<*>> {
|
||||
return (state.callableMap[CallableId(packageFqName, null, name)] ?: emptyList())
|
||||
}
|
||||
|
||||
@@ -71,8 +73,10 @@ class FirProviderImpl(val session: FirSession) : FirProvider() {
|
||||
state.classifierContainerFileMap[classId] = file
|
||||
}
|
||||
|
||||
override fun visitCallableMemberDeclaration(callableMemberDeclaration: FirCallableMemberDeclaration) {
|
||||
val symbol = callableMemberDeclaration.symbol as ConeCallableSymbol
|
||||
override fun <F : FirCallableMemberDeclaration<F>> visitCallableMemberDeclaration(
|
||||
callableMemberDeclaration: FirCallableMemberDeclaration<F>
|
||||
) {
|
||||
val symbol = callableMemberDeclaration.symbol
|
||||
val callableId = symbol.callableId
|
||||
state.callableMap.merge(callableId, listOf(symbol)) { a, b -> a + b }
|
||||
state.callableContainerMap[symbol] = file
|
||||
@@ -96,9 +100,9 @@ class FirProviderImpl(val session: FirSession) : FirProvider() {
|
||||
|
||||
private class State {
|
||||
val fileMap = mutableMapOf<FqName, List<FirFile>>()
|
||||
val classifierMap = mutableMapOf<ClassId, FirClassLikeDeclaration>()
|
||||
val classifierMap = mutableMapOf<ClassId, FirClassLikeDeclaration<*>>()
|
||||
val classifierContainerFileMap = mutableMapOf<ClassId, FirFile>()
|
||||
val callableMap = mutableMapOf<CallableId, List<ConeCallableSymbol>>()
|
||||
val callableMap = mutableMapOf<CallableId, List<FirCallableSymbol<*>>>()
|
||||
val callableContainerMap = mutableMapOf<ConeCallableSymbol, FirFile>()
|
||||
|
||||
fun setFrom(other: State) {
|
||||
@@ -120,7 +124,7 @@ class FirProviderImpl(val session: FirSession) : FirProvider() {
|
||||
return state.fileMap[fqName].orEmpty()
|
||||
}
|
||||
|
||||
override fun getFirClassifierByFqName(fqName: ClassId): FirClassLikeDeclaration? {
|
||||
override fun getFirClassifierByFqName(fqName: ClassId): FirClassLikeDeclaration<*>? {
|
||||
return state.classifierMap[fqName]
|
||||
}
|
||||
|
||||
|
||||
+4
-3
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassifierSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.*
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
@@ -29,13 +30,13 @@ class FirTypeResolverImpl(private val session: FirSession) : FirTypeResolver {
|
||||
|
||||
private data class ClassIdInSession(val session: FirSession, val id: ClassId)
|
||||
|
||||
private val implicitBuiltinTypeSymbols = mutableMapOf<ClassIdInSession, ConeClassLikeSymbol>()
|
||||
private val implicitBuiltinTypeSymbols = mutableMapOf<ClassIdInSession, FirClassLikeSymbol<*>>()
|
||||
|
||||
// TODO: get rid of session used here, and may be also of the cache above (see KT-30275)
|
||||
private fun resolveBuiltInQualified(id: ClassId, session: FirSession): ConeClassLikeSymbol {
|
||||
private fun resolveBuiltInQualified(id: ClassId, session: FirSession): FirClassLikeSymbol<*> {
|
||||
val nameInSession = ClassIdInSession(session, id)
|
||||
return implicitBuiltinTypeSymbols.getOrPut(nameInSession) {
|
||||
symbolProvider.getClassLikeSymbolByFqName(id) as ConeClassLikeSymbol
|
||||
symbolProvider.getClassLikeSymbolByFqName(id)!!
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+14
-13
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.fir.scopes.impl.FirTopLevelDeclaredMemberScope
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.withReplacedConeType
|
||||
import org.jetbrains.kotlin.fir.symbols.*
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirBackingFieldSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.impl.*
|
||||
import org.jetbrains.kotlin.fir.visitors.CompositeTransformResult
|
||||
@@ -205,8 +206,8 @@ open class FirBodyResolveTransformer(
|
||||
FirErrorTypeRefImpl(session, access.psi, newCallee.errorReason)
|
||||
is FirResolvedCallableReference -> {
|
||||
val symbol = newCallee.coneSymbol
|
||||
if (symbol is ConeCallableSymbol) {
|
||||
val returnType = jump.tryCalculateReturnType(symbol.firUnsafe())
|
||||
if (symbol is FirCallableSymbol<*>) {
|
||||
val returnType = jump.tryCalculateReturnType(symbol.fir)
|
||||
if (access.safe && access.explicitReceiver!!.resultType.coneTypeUnsafe<ConeKotlinType>().isNullable) {
|
||||
returnType.withReplacedConeType(
|
||||
session,
|
||||
@@ -215,11 +216,11 @@ open class FirBodyResolveTransformer(
|
||||
} else {
|
||||
returnType
|
||||
}
|
||||
} else if (symbol is ConeClassifierSymbol) {
|
||||
val firUnsafe = symbol.firUnsafe<FirElement>()
|
||||
} else if (symbol is ConeClassifierSymbol && symbol is FirBasedSymbol<*>) {
|
||||
val fir = symbol.fir
|
||||
// TODO: unhack
|
||||
if (firUnsafe is FirEnumEntry) {
|
||||
(firUnsafe.superTypeRefs.firstOrNull() as? FirResolvedTypeRef) ?: FirErrorTypeRefImpl(
|
||||
if (fir is FirEnumEntry) {
|
||||
(fir.superTypeRefs.firstOrNull() as? FirResolvedTypeRef) ?: FirErrorTypeRefImpl(
|
||||
session,
|
||||
null,
|
||||
"no enum item supertype"
|
||||
@@ -275,7 +276,7 @@ open class FirBodyResolveTransformer(
|
||||
val resultType = resolvedQualifier.resultType
|
||||
if (classId != null) {
|
||||
val classSymbol = symbolProvider.getClassLikeSymbolByFqName(classId)!!
|
||||
val declaration = classSymbol.firUnsafe<FirClassLikeDeclaration>()
|
||||
val declaration = classSymbol.fir
|
||||
if (declaration is FirClass) {
|
||||
if (declaration.classKind == ClassKind.OBJECT) {
|
||||
return resultType.resolvedTypeFromPrototype(
|
||||
@@ -851,7 +852,7 @@ open class FirBodyResolveTransformer(
|
||||
val expectedType = data as FirTypeRef?
|
||||
|
||||
val kind = constExpression.kind
|
||||
if (expectedType == null || expectedType is FirImplicitTypeRef || expectedType == null ||
|
||||
if (expectedType == null || expectedType is FirImplicitTypeRef ||
|
||||
kind == IrConstKind.Null || kind == IrConstKind.Boolean || kind == IrConstKind.Char
|
||||
) {
|
||||
val symbol = when (kind) {
|
||||
@@ -968,7 +969,7 @@ open class FirBodyResolveTransformer(
|
||||
}
|
||||
}
|
||||
|
||||
private fun storeVariableReturnType(variable: FirVariable) {
|
||||
private fun storeVariableReturnType(variable: FirVariable<*>) {
|
||||
val initializer = variable.initializer
|
||||
if (variable.returnTypeRef is FirImplicitTypeRef) {
|
||||
when {
|
||||
@@ -1021,8 +1022,8 @@ open class FirBodyResolveTransformer(
|
||||
}
|
||||
}
|
||||
|
||||
override fun transformVariable(variable: FirVariable, data: Any?): CompositeTransformResult<FirDeclaration> {
|
||||
val variable = super.transformVariable(variable, variable.returnTypeRef).single as FirVariable
|
||||
override fun <F : FirVariable<F>> transformVariable(variable: FirVariable<F>, data: Any?): CompositeTransformResult<FirDeclaration> {
|
||||
val variable = super.transformVariable(variable, variable.returnTypeRef).single as FirVariable<*>
|
||||
storeVariableReturnType(variable)
|
||||
if (variable !is FirProperty) {
|
||||
localScopes.lastOrNull()?.storeDeclaration(variable)
|
||||
@@ -1085,7 +1086,7 @@ open class FirBodyResolveTransformer(
|
||||
val symbol = symbolProvider.getClassLikeSymbolByFqName(classId)!!
|
||||
// TODO: Unify logic?
|
||||
symbol.constructType(
|
||||
Array(symbol.firUnsafe<FirClassLikeDeclaration>().typeParameters.size) {
|
||||
Array(symbol.fir.typeParameters.size) {
|
||||
ConeStarProjection
|
||||
},
|
||||
isNullable = false
|
||||
@@ -1161,7 +1162,7 @@ class ReturnTypeCalculatorWithJump(val session: FirSession, val scopeSession: Sc
|
||||
val returnTypeRef = declaration.returnTypeRef
|
||||
if (returnTypeRef is FirResolvedTypeRef) return returnTypeRef
|
||||
cycleErrorType(declaration)?.let { return it }
|
||||
require(declaration is FirCallableMemberDeclaration) { "${declaration::class}: ${declaration.render()}" }
|
||||
require(declaration is FirCallableMemberDeclaration<*>) { "${declaration::class}: ${declaration.render()}" }
|
||||
|
||||
|
||||
val symbol = declaration.symbol as ConeCallableSymbol
|
||||
|
||||
+1
-1
@@ -68,7 +68,7 @@ class FirCallCompleterTransformer(
|
||||
val functionCall = functionCall.transformArguments(this, data) as FirFunctionCall
|
||||
|
||||
val subCandidate = calleeReference.candidate
|
||||
val declaration = subCandidate.symbol.firUnsafe<FirCallableMemberDeclaration>()
|
||||
val declaration = subCandidate.symbol.firUnsafe<FirCallableMemberDeclaration<*>>()
|
||||
val newTypeParameters = declaration.typeParameters.map { ConeTypeParameterTypeImpl(it.symbol.toLookupTag(), false) }
|
||||
.map { subCandidate.substitutor.substituteOrSelf(it) }
|
||||
.map { finalSubstitutor.substituteOrSelf(it) }
|
||||
|
||||
+1
-1
@@ -33,7 +33,7 @@ class FirStatusResolveTransformer : FirAbstractTreeTransformer() {
|
||||
return when (this) {
|
||||
is FirEnumEntry -> Modality.FINAL
|
||||
is FirRegularClass -> if (classKind == ClassKind.INTERFACE) Modality.ABSTRACT else Modality.FINAL
|
||||
is FirCallableMemberDeclaration -> {
|
||||
is FirCallableMemberDeclaration<*> -> {
|
||||
val containingClass = classes.lastOrNull()
|
||||
when {
|
||||
containingClass == null -> Modality.FINAL
|
||||
|
||||
+3
-3
@@ -59,7 +59,7 @@ class FirSupertypeResolverTransformer : FirAbstractTreeTransformer() {
|
||||
return property.compose()
|
||||
}
|
||||
|
||||
private fun resolveSupertypesOrExpansions(classLikeDeclaration: FirClassLikeDeclaration): FirDeclaration {
|
||||
private fun resolveSupertypesOrExpansions(classLikeDeclaration: FirClassLikeDeclaration<*>): FirDeclaration {
|
||||
val classId = classLikeDeclaration.symbol.classId
|
||||
|
||||
if (classId in fullyComputed) return classLikeDeclaration
|
||||
@@ -76,7 +76,7 @@ class FirSupertypeResolverTransformer : FirAbstractTreeTransformer() {
|
||||
file: FirFile,
|
||||
private val currentlyComputing: MutableSet<ClassId>,
|
||||
private val fullyComputed: MutableSet<ClassId>,
|
||||
private val knownFirClassLikeDeclaration: FirClassLikeDeclaration? = null
|
||||
private val knownFirClassLikeDeclaration: FirClassLikeDeclaration<*>? = null
|
||||
) : FirAbstractTreeTransformerWithSuperTypes(reversedScopePriority = true) {
|
||||
|
||||
lateinit var resultingClass: FirDeclaration
|
||||
@@ -108,7 +108,7 @@ class FirSupertypeResolverTransformer : FirAbstractTreeTransformer() {
|
||||
return resolveNestedClassesSupertypes(transformedClass, data)
|
||||
}
|
||||
|
||||
private fun FirClassLikeDeclaration.matchesRequestedDeclaration(): Boolean {
|
||||
private fun FirClassLikeDeclaration<*>.matchesRequestedDeclaration(): Boolean {
|
||||
if (knownFirClassLikeDeclaration != null) return knownFirClassLikeDeclaration == this
|
||||
return symbol.classId == requestedClassId
|
||||
}
|
||||
|
||||
@@ -11,9 +11,9 @@ import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.buildUseSiteScope
|
||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.*
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
|
||||
import org.jetbrains.kotlin.fir.types.ConeAbbreviatedType
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||
@@ -38,8 +38,7 @@ fun FirCompositeScope.addImportingScopes(file: FirFile, session: FirSession) {
|
||||
}
|
||||
|
||||
private fun finalExpansionName(symbol: FirTypeAliasSymbol, session: FirSession): Name? {
|
||||
val expandedType = symbol.fir.expandedTypeRef.coneTypeUnsafe<ConeClassLikeType>()
|
||||
return when (expandedType) {
|
||||
return when (val expandedType = symbol.fir.expandedTypeRef.coneTypeUnsafe<ConeClassLikeType>()) {
|
||||
is ConeAbbreviatedType ->
|
||||
expandedType.abbreviationLookupTag.toSymbol(session)?.safeAs<FirTypeAliasSymbol>()?.let {
|
||||
finalExpansionName(it, session)
|
||||
@@ -50,8 +49,8 @@ private fun finalExpansionName(symbol: FirTypeAliasSymbol, session: FirSession):
|
||||
}
|
||||
|
||||
fun processConstructors(
|
||||
matchedSymbol: ConeClassLikeSymbol?,
|
||||
processor: (ConeFunctionSymbol) -> ProcessorAction,
|
||||
matchedSymbol: FirClassLikeSymbol<*>?,
|
||||
processor: (FirFunctionSymbol<*>) -> ProcessorAction,
|
||||
session: FirSession,
|
||||
scopeSession: ScopeSession,
|
||||
name: Name
|
||||
@@ -61,13 +60,12 @@ fun processConstructors(
|
||||
val scope = when (matchedSymbol) {
|
||||
is FirTypeAliasSymbol -> matchedSymbol.fir.buildUseSiteScope(session, scopeSession)
|
||||
is FirClassSymbol -> matchedSymbol.fir.buildUseSiteScope(session, scopeSession)
|
||||
else -> null
|
||||
}
|
||||
|
||||
|
||||
val constructorName = when (matchedSymbol) {
|
||||
is FirTypeAliasSymbol -> finalExpansionName(matchedSymbol, session) ?: return ProcessorAction.NEXT
|
||||
else -> name
|
||||
is FirClassSymbol -> name
|
||||
}
|
||||
|
||||
//TODO: why don't we use declared member scope at this point?
|
||||
|
||||
+3
-3
@@ -61,7 +61,7 @@ abstract class AbstractFirOverrideScope(val session: FirSession) : FirScope() {
|
||||
protected fun ConeCallableSymbol.isOverridden(seen: Set<ConeCallableSymbol>): ConeCallableSymbol? {
|
||||
if (overrides.containsKey(this)) return overrides[this]
|
||||
|
||||
fun similarFunctionsOrBothProperties(declaration: FirCallableDeclaration, self: FirCallableDeclaration): Boolean {
|
||||
fun similarFunctionsOrBothProperties(declaration: FirCallableDeclaration<*>, self: FirCallableDeclaration<*>): Boolean {
|
||||
return when (declaration) {
|
||||
is FirNamedFunction -> self is FirNamedFunction && isOverriddenFunCheck(declaration, self)
|
||||
is FirConstructor -> false
|
||||
@@ -75,9 +75,9 @@ abstract class AbstractFirOverrideScope(val session: FirSession) : FirScope() {
|
||||
}
|
||||
}
|
||||
|
||||
val self = (this as AbstractFirBasedSymbol<*>).fir as FirCallableMemberDeclaration
|
||||
val self = (this as AbstractFirBasedSymbol<*>).fir as FirCallableMemberDeclaration<*>
|
||||
val overriding = seen.firstOrNull {
|
||||
val member = (it as AbstractFirBasedSymbol<*>).fir as FirCallableMemberDeclaration
|
||||
val member = (it as AbstractFirBasedSymbol<*>).fir as FirCallableMemberDeclaration<*>
|
||||
self.modality != Modality.FINAL
|
||||
&& similarFunctionsOrBothProperties(member, self)
|
||||
} // TODO: two or more overrides for one fun?
|
||||
|
||||
+13
-12
@@ -7,16 +7,17 @@ package org.jetbrains.kotlin.fir.scopes.impl
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirResolvedImport
|
||||
import org.jetbrains.kotlin.fir.declarations.FirTypeAlias
|
||||
import org.jetbrains.kotlin.fir.declarations.expandedConeType
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.TowerScopeLevel
|
||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.scopes.processConstructors
|
||||
import org.jetbrains.kotlin.fir.symbols.*
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirTypeAliasSymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.cast
|
||||
@@ -32,9 +33,9 @@ abstract class FirAbstractImportingScope(session: FirSession, lookupInFir: Boole
|
||||
|
||||
|
||||
val symbol = provider.getClassLikeSymbolByFqName(classId) ?: error("No scope/symbol for $classId")
|
||||
if (symbol is ConeTypeAliasSymbol) {
|
||||
val expansionSymbol = symbol.firUnsafe<FirTypeAlias>().expandedConeType?.lookupTag?.toSymbol(session)
|
||||
if (expansionSymbol as? ConeClassLikeSymbol != null) {
|
||||
if (symbol is FirTypeAliasSymbol) {
|
||||
val expansionSymbol = symbol.fir.expandedConeType?.lookupTag?.toSymbol(session)
|
||||
if (expansionSymbol is ConeClassLikeSymbol) {
|
||||
return getStaticsScope(expansionSymbol.classId)
|
||||
}
|
||||
}
|
||||
@@ -42,11 +43,11 @@ abstract class FirAbstractImportingScope(session: FirSession, lookupInFir: Boole
|
||||
return null
|
||||
}
|
||||
|
||||
protected fun <T : ConeCallableSymbol> processCallables(
|
||||
protected fun <T : FirCallableSymbol<*>> processCallables(
|
||||
import: FirResolvedImport,
|
||||
name: Name,
|
||||
token: TowerScopeLevel.Token<T>,
|
||||
processor: (ConeCallableSymbol) -> ProcessorAction
|
||||
processor: (FirCallableSymbol<*>) -> ProcessorAction
|
||||
): ProcessorAction {
|
||||
val callableId = CallableId(import.packageFqName, import.relativeClassName, name)
|
||||
|
||||
@@ -95,20 +96,20 @@ abstract class FirAbstractImportingScope(session: FirSession, lookupInFir: Boole
|
||||
return ProcessorAction.NEXT
|
||||
}
|
||||
|
||||
abstract fun <T : ConeCallableSymbol> processCallables(
|
||||
abstract fun <T : FirCallableSymbol<*>> processCallables(
|
||||
name: Name,
|
||||
token: TowerScopeLevel.Token<T>,
|
||||
processor: (ConeCallableSymbol) -> ProcessorAction
|
||||
processor: (FirCallableSymbol<*>) -> ProcessorAction
|
||||
): ProcessorAction
|
||||
|
||||
final override fun processFunctionsByName(name: Name, processor: (ConeFunctionSymbol) -> ProcessorAction): ProcessorAction {
|
||||
final override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> ProcessorAction): ProcessorAction {
|
||||
return processCallables(
|
||||
name,
|
||||
TowerScopeLevel.Token.Functions
|
||||
) { if (it is ConeFunctionSymbol) processor(it) else ProcessorAction.NEXT }
|
||||
) { if (it is FirFunctionSymbol<*>) processor(it) else ProcessorAction.NEXT }
|
||||
}
|
||||
|
||||
final override fun processPropertiesByName(name: Name, processor: (ConeVariableSymbol) -> ProcessorAction): ProcessorAction {
|
||||
final override fun processPropertiesByName(name: Name, processor: (FirCallableSymbol<*>) -> ProcessorAction): ProcessorAction {
|
||||
return processCallables(
|
||||
name,
|
||||
TowerScopeLevel.Token.Properties
|
||||
|
||||
+3
-3
@@ -10,9 +10,9 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirResolvedImportImpl
|
||||
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.TowerScopeLevel
|
||||
import org.jetbrains.kotlin.fir.scopes.FirPosition
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.symbols.*
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
@@ -41,10 +41,10 @@ abstract class FirAbstractSimpleImportingScope(session: FirSession) : FirAbstrac
|
||||
return true
|
||||
}
|
||||
|
||||
override fun <T : ConeCallableSymbol> processCallables(
|
||||
override fun <T : FirCallableSymbol<*>> processCallables(
|
||||
name: Name,
|
||||
token: TowerScopeLevel.Token<T>,
|
||||
processor: (ConeCallableSymbol) -> ProcessorAction
|
||||
processor: (FirCallableSymbol<*>) -> ProcessorAction
|
||||
): ProcessorAction {
|
||||
|
||||
|
||||
|
||||
+3
-2
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.resolve.calls.TowerScopeLevel
|
||||
import org.jetbrains.kotlin.fir.scopes.FirPosition
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.symbols.*
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
@@ -41,10 +42,10 @@ abstract class FirAbstractStarImportingScope(
|
||||
}
|
||||
|
||||
|
||||
override fun <T : ConeCallableSymbol> processCallables(
|
||||
override fun <T : FirCallableSymbol<*>> processCallables(
|
||||
name: Name,
|
||||
token: TowerScopeLevel.Token<T>,
|
||||
processor: (ConeCallableSymbol) -> ProcessorAction
|
||||
processor: (FirCallableSymbol<*>) -> ProcessorAction
|
||||
): ProcessorAction {
|
||||
for (import in starImports) {
|
||||
if (processCallables(import, name, token, processor).stop()) {
|
||||
|
||||
+8
-7
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.service
|
||||
import org.jetbrains.kotlin.fir.symbols.*
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class FirClassDeclaredMemberScopeProvider {
|
||||
@@ -37,11 +38,11 @@ fun declaredMemberScope(klass: FirRegularClass): FirClassDeclaredMemberScope {
|
||||
}
|
||||
|
||||
class FirClassDeclaredMemberScope(klass: FirRegularClass) : FirScope() {
|
||||
private val callablesIndex: Map<Name, List<FirCallableSymbol>> = run {
|
||||
val result = mutableMapOf<Name, MutableList<FirCallableSymbol>>()
|
||||
private val callablesIndex: Map<Name, List<FirCallableSymbol<*>>> = run {
|
||||
val result = mutableMapOf<Name, MutableList<FirCallableSymbol<*>>>()
|
||||
for (declaration in klass.declarations) {
|
||||
when (declaration) {
|
||||
is FirCallableMemberDeclaration -> {
|
||||
is FirCallableMemberDeclaration<*> -> {
|
||||
val name = if (declaration is FirConstructor) klass.name else declaration.name
|
||||
result.getOrPut(name) { mutableListOf() } += declaration.symbol
|
||||
}
|
||||
@@ -66,20 +67,20 @@ class FirClassDeclaredMemberScope(klass: FirRegularClass) : FirScope() {
|
||||
result
|
||||
}
|
||||
|
||||
override fun processFunctionsByName(name: Name, processor: (ConeFunctionSymbol) -> ProcessorAction): ProcessorAction {
|
||||
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> ProcessorAction): ProcessorAction {
|
||||
val symbols = callablesIndex[name] ?: emptyList()
|
||||
for (symbol in symbols) {
|
||||
if (symbol is ConeFunctionSymbol && !processor(symbol)) {
|
||||
if (symbol is FirFunctionSymbol<*> && !processor(symbol)) {
|
||||
return STOP
|
||||
}
|
||||
}
|
||||
return NEXT
|
||||
}
|
||||
|
||||
override fun processPropertiesByName(name: Name, processor: (ConeVariableSymbol) -> ProcessorAction): ProcessorAction {
|
||||
override fun processPropertiesByName(name: Name, processor: (FirCallableSymbol<*>) -> ProcessorAction): ProcessorAction {
|
||||
val symbols = callablesIndex[name] ?: emptyList()
|
||||
for (symbol in symbols) {
|
||||
if (symbol is ConePropertySymbol && !processor(symbol)) {
|
||||
if (symbol is ConeVariableSymbol && !processor(symbol)) {
|
||||
return STOP
|
||||
}
|
||||
}
|
||||
|
||||
+20
-20
@@ -6,8 +6,6 @@
|
||||
package org.jetbrains.kotlin.fir.scopes.impl
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirConstructor
|
||||
import org.jetbrains.kotlin.fir.declarations.FirFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.FirNamedFunction
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||
import org.jetbrains.kotlin.fir.declarations.impl.FirMemberFunctionImpl
|
||||
@@ -15,13 +13,14 @@ import org.jetbrains.kotlin.fir.declarations.impl.FirValueParameterImpl
|
||||
import org.jetbrains.kotlin.fir.resolve.ScopeSession
|
||||
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorWithJump
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.firUnsafe
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.symbols.*
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeTypeParameterSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.FirTypeRef
|
||||
import org.jetbrains.kotlin.fir.types.coneTypeUnsafe
|
||||
import org.jetbrains.kotlin.fir.types.impl.FirResolvedTypeRefImpl
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
@@ -32,22 +31,22 @@ class FirClassSubstitutionScope(
|
||||
substitution: Map<ConeTypeParameterSymbol, ConeKotlinType>
|
||||
) : FirScope() {
|
||||
|
||||
private val fakeOverrides = mutableMapOf<ConeCallableSymbol, ConeCallableSymbol>()
|
||||
private val fakeOverrides = mutableMapOf<FirFunctionSymbol<*>, FirFunctionSymbol<*>>()
|
||||
|
||||
private val substitutor = ConeSubstitutorByMap(substitution)
|
||||
|
||||
override fun processFunctionsByName(name: Name, processor: (ConeFunctionSymbol) -> ProcessorAction): ProcessorAction {
|
||||
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> ProcessorAction): ProcessorAction {
|
||||
useSiteScope.processFunctionsByName(name) process@{ original ->
|
||||
|
||||
val function = fakeOverrides.getOrPut(original) { createFakeOverride(original) }
|
||||
processor(function as ConeFunctionSymbol)
|
||||
processor(function)
|
||||
}
|
||||
|
||||
|
||||
return super.processFunctionsByName(name, processor)
|
||||
}
|
||||
|
||||
override fun processPropertiesByName(name: Name, processor: (ConeVariableSymbol) -> ProcessorAction): ProcessorAction {
|
||||
override fun processPropertiesByName(name: Name, processor: (FirCallableSymbol<*>) -> ProcessorAction): ProcessorAction {
|
||||
return useSiteScope.processPropertiesByName(name, processor)
|
||||
}
|
||||
|
||||
@@ -57,11 +56,12 @@ class FirClassSubstitutionScope(
|
||||
return substitutor.substituteOrNull(this)
|
||||
}
|
||||
|
||||
private fun createFakeOverride(original: ConeFunctionSymbol): FirFunctionSymbol {
|
||||
|
||||
val member = original.firUnsafe<FirFunction>()
|
||||
if (member is FirConstructor) return original as FirFunctionSymbol // TODO: substitution for constructors
|
||||
member as FirNamedFunction
|
||||
private fun createFakeOverride(original: FirFunctionSymbol<*>): FirFunctionSymbol<*> {
|
||||
val member = when (original) {
|
||||
is FirNamedFunctionSymbol -> original.fir
|
||||
is FirConstructorSymbol -> return original
|
||||
is FirAccessorSymbol -> throw AssertionError("Should not be here")
|
||||
}
|
||||
|
||||
val receiverType = member.receiverTypeRef?.coneTypeUnsafe<ConeKotlinType>()
|
||||
val newReceiverType = receiverType?.substitute()
|
||||
@@ -73,19 +73,19 @@ class FirClassSubstitutionScope(
|
||||
it.returnTypeRef.coneTypeUnsafe<ConeKotlinType>().substitute()
|
||||
}
|
||||
|
||||
return createFakeOverride(session, member, original as FirFunctionSymbol, newReceiverType, newReturnType, newParameterTypes)
|
||||
return createFakeOverride(session, member, original, newReceiverType, newReturnType, newParameterTypes)
|
||||
}
|
||||
|
||||
companion object {
|
||||
fun createFakeOverride(
|
||||
session: FirSession,
|
||||
baseFunction: FirNamedFunction,
|
||||
baseSymbol: FirFunctionSymbol,
|
||||
baseSymbol: FirNamedFunctionSymbol,
|
||||
newReceiverType: ConeKotlinType? = null,
|
||||
newReturnType: ConeKotlinType? = null,
|
||||
newParameterTypes: List<ConeKotlinType?>? = null
|
||||
): FirFunctionSymbol {
|
||||
val symbol = FirFunctionSymbol(baseSymbol.callableId, true, baseSymbol)
|
||||
): FirNamedFunctionSymbol {
|
||||
val symbol = FirNamedFunctionSymbol(baseSymbol.callableId, true, baseSymbol)
|
||||
with(baseFunction) {
|
||||
// TODO: consider using here some light-weight functions instead of pseudo-real FirMemberFunctionImpl
|
||||
// As second alternative, we can invent some light-weight kind of FirRegularClass
|
||||
|
||||
+4
-2
@@ -12,6 +12,8 @@ import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.NEXT
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.STOP
|
||||
import org.jetbrains.kotlin.fir.symbols.*
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class FirClassUseSiteScope(
|
||||
@@ -20,7 +22,7 @@ class FirClassUseSiteScope(
|
||||
private val declaredMemberScope: FirScope
|
||||
) : AbstractFirOverrideScope(session) {
|
||||
|
||||
override fun processFunctionsByName(name: Name, processor: (ConeFunctionSymbol) -> ProcessorAction): ProcessorAction {
|
||||
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> ProcessorAction): ProcessorAction {
|
||||
val seen = mutableSetOf<ConeCallableSymbol>()
|
||||
if (!declaredMemberScope.processFunctionsByName(name) {
|
||||
seen += it
|
||||
@@ -39,7 +41,7 @@ class FirClassUseSiteScope(
|
||||
}
|
||||
}
|
||||
|
||||
override fun processPropertiesByName(name: Name, processor: (ConeVariableSymbol) -> ProcessorAction): ProcessorAction {
|
||||
override fun processPropertiesByName(name: Name, processor: (FirCallableSymbol<*>) -> ProcessorAction): ProcessorAction {
|
||||
val seen = mutableSetOf<ConeCallableSymbol>()
|
||||
if (!declaredMemberScope.processPropertiesByName(name) {
|
||||
seen += it
|
||||
|
||||
@@ -11,9 +11,9 @@ import org.jetbrains.kotlin.fir.scopes.FirTypeParameterScope
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.NEXT
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.STOP
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassifierSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class FirCompositeScope(
|
||||
@@ -57,11 +57,11 @@ class FirCompositeScope(
|
||||
return NEXT
|
||||
}
|
||||
|
||||
override fun processFunctionsByName(name: Name, processor: (ConeFunctionSymbol) -> ProcessorAction): ProcessorAction {
|
||||
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> ProcessorAction): ProcessorAction {
|
||||
return processComposite(FirScope::processFunctionsByName, name, processor)
|
||||
}
|
||||
|
||||
override fun processPropertiesByName(name: Name, processor: (ConeVariableSymbol) -> ProcessorAction): ProcessorAction {
|
||||
override fun processPropertiesByName(name: Name, processor: (FirCallableSymbol<*>) -> ProcessorAction): ProcessorAction {
|
||||
return processComposite(FirScope::processPropertiesByName, name, processor)
|
||||
}
|
||||
|
||||
|
||||
@@ -12,20 +12,21 @@ import org.jetbrains.kotlin.fir.declarations.FirProperty
|
||||
import org.jetbrains.kotlin.fir.expressions.FirVariable
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class FirLocalScope : FirScope() {
|
||||
|
||||
val properties = mutableMapOf<Name, ConeVariableSymbol>()
|
||||
val functions = mutableMapOf<Name, ConeFunctionSymbol>()
|
||||
val properties = mutableMapOf<Name, FirVariableSymbol<*>>()
|
||||
val functions = mutableMapOf<Name, FirFunctionSymbol<*>>()
|
||||
|
||||
fun storeDeclaration(declaration: FirNamedDeclaration) {
|
||||
when (declaration) {
|
||||
is FirVariable -> properties[declaration.name] = declaration.symbol
|
||||
is FirNamedFunction -> functions[declaration.name] = declaration.symbol as FirFunctionSymbol
|
||||
is FirVariable<*> -> properties[declaration.name] = declaration.symbol
|
||||
is FirNamedFunction -> functions[declaration.name] = declaration.symbol as FirNamedFunctionSymbol
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,7 +34,7 @@ class FirLocalScope : FirScope() {
|
||||
properties[FirBackingFieldReference.NAME] = property.backingFieldSymbol
|
||||
}
|
||||
|
||||
override fun processFunctionsByName(name: Name, processor: (ConeFunctionSymbol) -> ProcessorAction): ProcessorAction {
|
||||
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> ProcessorAction): ProcessorAction {
|
||||
val prop = functions[name]
|
||||
if (prop != null) {
|
||||
return processor(prop)
|
||||
@@ -41,7 +42,7 @@ class FirLocalScope : FirScope() {
|
||||
return ProcessorAction.NEXT
|
||||
}
|
||||
|
||||
override fun processPropertiesByName(name: Name, processor: (ConeVariableSymbol) -> ProcessorAction): ProcessorAction {
|
||||
override fun processPropertiesByName(name: Name, processor: (FirCallableSymbol<*>) -> ProcessorAction): ProcessorAction {
|
||||
val prop = properties[name]
|
||||
if (prop != null) {
|
||||
return processor(prop)
|
||||
|
||||
@@ -8,9 +8,9 @@ package org.jetbrains.kotlin.fir.scopes.impl
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.scopes.FirScope
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class FirSuperTypeScope(
|
||||
@@ -18,7 +18,7 @@ class FirSuperTypeScope(
|
||||
val scopes: List<FirScope>
|
||||
) : AbstractFirOverrideScope(session) {
|
||||
|
||||
override fun processFunctionsByName(name: Name, processor: (ConeFunctionSymbol) -> ProcessorAction): ProcessorAction {
|
||||
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> ProcessorAction): ProcessorAction {
|
||||
val accepted = HashSet<ConeFunctionSymbol>()
|
||||
val pending = mutableListOf<ConeFunctionSymbol>()
|
||||
for (scope in scopes) {
|
||||
@@ -40,9 +40,9 @@ class FirSuperTypeScope(
|
||||
return super.processFunctionsByName(name, processor)
|
||||
}
|
||||
|
||||
override fun processPropertiesByName(name: Name, processor: (ConeVariableSymbol) -> ProcessorAction): ProcessorAction {
|
||||
val accepted = HashSet<ConeCallableSymbol>()
|
||||
val pending = mutableListOf<ConeVariableSymbol>()
|
||||
override fun processPropertiesByName(name: Name, processor: (FirCallableSymbol<*>) -> ProcessorAction): ProcessorAction {
|
||||
val accepted = HashSet<FirCallableSymbol<*>>()
|
||||
val pending = mutableListOf<FirCallableSymbol<*>>()
|
||||
for (scope in scopes) {
|
||||
if (scope.processPropertiesByName(name) {
|
||||
if (it !in accepted && it.isOverridden(accepted) == null) {
|
||||
|
||||
+5
-5
@@ -12,9 +12,9 @@ import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.NEXT
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.STOP
|
||||
import org.jetbrains.kotlin.fir.scopes.processConstructors
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ConePropertySymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
@@ -25,7 +25,7 @@ class FirTopLevelDeclaredMemberScope(
|
||||
) : FirAbstractProviderBasedScope(session, lookupInFir) {
|
||||
private val packageFqName = file.packageFqName
|
||||
|
||||
override fun processFunctionsByName(name: Name, processor: (ConeFunctionSymbol) -> ProcessorAction): ProcessorAction {
|
||||
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> ProcessorAction): ProcessorAction {
|
||||
val matchedClass = provider.getClassLikeSymbolByFqName(ClassId(packageFqName, name))
|
||||
|
||||
if (processConstructors(
|
||||
@@ -40,14 +40,14 @@ class FirTopLevelDeclaredMemberScope(
|
||||
}
|
||||
val symbols = provider.getTopLevelCallableSymbols(packageFqName, name)
|
||||
for (symbol in symbols) {
|
||||
if (symbol is ConeFunctionSymbol && !processor(symbol)) {
|
||||
if (symbol is FirFunctionSymbol<*> && !processor(symbol)) {
|
||||
return STOP
|
||||
}
|
||||
}
|
||||
return NEXT
|
||||
}
|
||||
|
||||
override fun processPropertiesByName(name: Name, processor: (ConeVariableSymbol) -> ProcessorAction): ProcessorAction {
|
||||
override fun processPropertiesByName(name: Name, processor: (FirCallableSymbol<*>) -> ProcessorAction): ProcessorAction {
|
||||
val symbols = provider.getTopLevelCallableSymbols(packageFqName, name)
|
||||
for (symbol in symbols) {
|
||||
if (symbol is ConePropertySymbol && !processor(symbol)) {
|
||||
|
||||
@@ -6,13 +6,14 @@
|
||||
package org.jetbrains.kotlin.fir.symbols
|
||||
|
||||
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
|
||||
|
||||
val FirSymbolProvider.Any: ConeClassLikeSymbol get() = this.getClassLikeSymbolByFqName(StandardClassIds.Any)!!
|
||||
val FirSymbolProvider.Nothing: ConeClassLikeSymbol get() = this.getClassLikeSymbolByFqName(StandardClassIds.Nothing)!!
|
||||
val FirSymbolProvider.Any: FirClassLikeSymbol<*> get() = this.getClassLikeSymbolByFqName(StandardClassIds.Any)!!
|
||||
val FirSymbolProvider.Nothing: FirClassLikeSymbol<*> get() = this.getClassLikeSymbolByFqName(StandardClassIds.Nothing)!!
|
||||
|
||||
|
||||
operator fun ClassId.invoke(symbolProvider: FirSymbolProvider): ConeClassLikeSymbol {
|
||||
operator fun ClassId.invoke(symbolProvider: FirSymbolProvider): FirClassLikeSymbol<*> {
|
||||
return symbolProvider.getClassLikeSymbolByFqName(this)!!
|
||||
}
|
||||
@@ -277,8 +277,8 @@ interface ConeTypeContext : TypeSystemContext, TypeSystemOptimizationContext {
|
||||
}
|
||||
|
||||
override fun TypeConstructorMarker.isCommonFinalClassConstructor(): Boolean {
|
||||
val classSymbol = this as? ConeClassSymbol ?: return false
|
||||
val fir = (classSymbol as FirClassSymbol).fir
|
||||
val classSymbol = this as? FirClassSymbol ?: return false
|
||||
val fir = classSymbol.fir
|
||||
return fir.modality == Modality.FINAL &&
|
||||
fir.classKind != ClassKind.ENUM_ENTRY &&
|
||||
fir.classKind != ClassKind.ANNOTATION_CLASS
|
||||
|
||||
+1
-2
@@ -9,7 +9,6 @@ import com.intellij.psi.search.GlobalSearchScope
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
|
||||
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.jvm.compiler.LoadDescriptorUtil.compileKotlinToDirAndGetModule
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
@@ -66,7 +65,7 @@ abstract class AbstractFirLoadCompiledKotlin : AbstractFirResolveWithSessionTest
|
||||
|
||||
for (name in provider.getAllCallableNamesInPackage(packageFqName)) {
|
||||
for (symbol in provider.getTopLevelCallableSymbols(packageFqName, name)) {
|
||||
(symbol as FirCallableSymbol).fir.accept(firRenderer)
|
||||
symbol.fir.accept(firRenderer)
|
||||
builder.appendln()
|
||||
}
|
||||
}
|
||||
|
||||
+1
-2
@@ -9,7 +9,6 @@ import com.intellij.psi.search.GlobalSearchScope
|
||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
||||
import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment
|
||||
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
@@ -42,7 +41,7 @@ class BuiltInsDeserializationForFirTestCase : AbstractFirResolveWithSessionTestC
|
||||
|
||||
for (name in provider.getAllCallableNamesInPackage(packageFqName)) {
|
||||
for (symbol in provider.getTopLevelCallableSymbols(packageFqName, name)) {
|
||||
(symbol as FirCallableSymbol).fir.accept(firRenderer)
|
||||
symbol.fir.accept(firRenderer)
|
||||
builder.appendln()
|
||||
}
|
||||
}
|
||||
|
||||
+8
-7
@@ -34,7 +34,8 @@ import org.jetbrains.kotlin.fir.resolve.impl.FirCompositeSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
|
||||
import org.jetbrains.kotlin.fir.scopes.impl.FirCompositeScope
|
||||
import org.jetbrains.kotlin.fir.service
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
@@ -190,8 +191,8 @@ abstract class AbstractFirTypeEnhancementTest : KtUsefulTestCase() {
|
||||
if (declaration in renderedDeclarations) continue
|
||||
when (declaration) {
|
||||
is FirJavaConstructor -> enhancementScope.processFunctionsByName(javaClass.name) { symbol ->
|
||||
val enhanced = (symbol as? FirFunctionSymbol)?.fir
|
||||
if (enhanced != null && enhanced !in renderedDeclarations) {
|
||||
val enhanced = symbol.fir
|
||||
if (enhanced !in renderedDeclarations) {
|
||||
enhanced.accept(renderer, null)
|
||||
renderer.newLine()
|
||||
renderedDeclarations += enhanced
|
||||
@@ -199,8 +200,8 @@ abstract class AbstractFirTypeEnhancementTest : KtUsefulTestCase() {
|
||||
ProcessorAction.NEXT
|
||||
}
|
||||
is FirJavaMethod -> enhancementScope.processFunctionsByName(declaration.name) { symbol ->
|
||||
val enhanced = (symbol as? FirFunctionSymbol)?.fir
|
||||
if (enhanced != null && enhanced !in renderedDeclarations) {
|
||||
val enhanced = symbol.fir
|
||||
if (enhanced !in renderedDeclarations) {
|
||||
enhanced.accept(renderer, null)
|
||||
renderer.newLine()
|
||||
renderedDeclarations += enhanced
|
||||
@@ -208,8 +209,8 @@ abstract class AbstractFirTypeEnhancementTest : KtUsefulTestCase() {
|
||||
ProcessorAction.NEXT
|
||||
}
|
||||
is FirJavaField -> enhancementScope.processPropertiesByName(declaration.name) { symbol ->
|
||||
val enhanced = (symbol as? FirPropertySymbol)?.fir
|
||||
if (enhanced != null && enhanced !in renderedDeclarations) {
|
||||
val enhanced = symbol.fir
|
||||
if (enhanced !in renderedDeclarations) {
|
||||
enhanced.accept(renderer, null)
|
||||
renderer.newLine()
|
||||
renderedDeclarations += enhanced
|
||||
|
||||
Reference in New Issue
Block a user