FIR: Add FirTypeScope

^KT-35495 Relates
This commit is contained in:
Denis Zharkov
2020-06-09 14:35:45 +03:00
parent 38922a84f1
commit 0bd2a74542
15 changed files with 96 additions and 29 deletions
@@ -14,10 +14,13 @@ import org.jetbrains.kotlin.fir.java.scopes.JavaClassEnhancementScope
import org.jetbrains.kotlin.fir.java.scopes.JavaClassUseSiteMemberScope import org.jetbrains.kotlin.fir.java.scopes.JavaClassUseSiteMemberScope
import org.jetbrains.kotlin.fir.java.scopes.JavaOverrideChecker import org.jetbrains.kotlin.fir.java.scopes.JavaOverrideChecker
import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.impl.* import org.jetbrains.kotlin.fir.scopes.impl.*
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.types.ConeClassErrorType import org.jetbrains.kotlin.fir.types.ConeClassErrorType
@@ -34,7 +37,7 @@ class JavaScopeProvider(
klass: FirClass<*>, klass: FirClass<*>,
useSiteSession: FirSession, useSiteSession: FirSession,
scopeSession: ScopeSession scopeSession: ScopeSession
): FirScope = ): FirTypeScope =
buildJavaEnhancementScope(useSiteSession, klass.symbol as FirRegularClassSymbol, scopeSession, mutableSetOf()) buildJavaEnhancementScope(useSiteSession, klass.symbol as FirRegularClassSymbol, scopeSession, mutableSetOf())
private fun buildJavaEnhancementScope( private fun buildJavaEnhancementScope(
@@ -86,7 +89,7 @@ class JavaScopeProvider(
} }
JavaClassUseSiteMemberScope( JavaClassUseSiteMemberScope(
regularClass, useSiteSession, regularClass, useSiteSession,
FirSuperTypeScope.prepareSupertypeScope( FirSuperTypeScope.prepareOverrideAwareSupertypeScope(
useSiteSession, useSiteSession,
JavaOverrideChecker( JavaOverrideChecker(
useSiteSession, useSiteSession,
@@ -110,7 +113,14 @@ class JavaScopeProvider(
val wrappedDeclaredScope = declaredMemberScopeDecorator(klass, declaredScope, useSiteSession, scopeSession) val wrappedDeclaredScope = declaredMemberScopeDecorator(klass, declaredScope, useSiteSession, scopeSession)
JavaClassEnhancementScope( JavaClassEnhancementScope(
useSiteSession, JavaClassUseSiteMemberScope( useSiteSession, JavaClassUseSiteMemberScope(
klass, useSiteSession, superTypesScope = object : FirScope() {}, declaredMemberScope = wrappedDeclaredScope klass, useSiteSession,
superTypesScope = object : FirTypeScope() {
override fun processOverriddenFunctions(
functionSymbol: FirFunctionSymbol<*>,
processor: (FirFunctionSymbol<*>) -> ProcessorAction
): ProcessorAction = ProcessorAction.STOP
},
declaredMemberScope = wrappedDeclaredScope
) )
) )
} }
@@ -13,7 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.builder.FirConstructorBuilder
import org.jetbrains.kotlin.fir.declarations.builder.FirPrimaryConstructorBuilder import org.jetbrains.kotlin.fir.declarations.builder.FirPrimaryConstructorBuilder
import org.jetbrains.kotlin.fir.declarations.builder.FirSimpleFunctionBuilder import org.jetbrains.kotlin.fir.declarations.builder.FirSimpleFunctionBuilder
import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter import org.jetbrains.kotlin.fir.declarations.builder.buildValueParameter
import org.jetbrains.kotlin.fir.declarations.impl.* import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty
import org.jetbrains.kotlin.fir.expressions.FirConstKind import org.jetbrains.kotlin.fir.expressions.FirConstKind
@@ -24,7 +24,8 @@ import org.jetbrains.kotlin.fir.java.declarations.*
import org.jetbrains.kotlin.fir.java.enhancement.* import org.jetbrains.kotlin.fir.java.enhancement.*
import org.jetbrains.kotlin.fir.render import org.jetbrains.kotlin.fir.render
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.jvm.computeJvmDescriptor import org.jetbrains.kotlin.fir.scopes.jvm.computeJvmDescriptor
import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
@@ -42,7 +43,7 @@ import org.jetbrains.kotlin.utils.Jsr305State
class JavaClassEnhancementScope( class JavaClassEnhancementScope(
private val session: FirSession, private val session: FirSession,
private val useSiteMemberScope: JavaClassUseSiteMemberScope private val useSiteMemberScope: JavaClassUseSiteMemberScope
) : FirScope() { ) : FirTypeScope() {
private val owner: FirRegularClass = useSiteMemberScope.symbol.fir private val owner: FirRegularClass = useSiteMemberScope.symbol.fir
private val javaTypeParameterStack: JavaTypeParameterStack = private val javaTypeParameterStack: JavaTypeParameterStack =
@@ -9,7 +9,6 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.builder.FirSimpleFunctionBuilder import org.jetbrains.kotlin.fir.declarations.builder.FirSimpleFunctionBuilder
import org.jetbrains.kotlin.fir.declarations.builder.FirValueParameterBuilder import org.jetbrains.kotlin.fir.declarations.builder.FirValueParameterBuilder
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack
@@ -17,6 +16,7 @@ import org.jetbrains.kotlin.fir.java.declarations.*
import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertiesScope import org.jetbrains.kotlin.fir.resolve.calls.FirSyntheticPropertiesScope
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.impl.AbstractFirUseSiteMemberScope import org.jetbrains.kotlin.fir.scopes.impl.AbstractFirUseSiteMemberScope
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.name.Name
class JavaClassUseSiteMemberScope( class JavaClassUseSiteMemberScope(
klass: FirRegularClass, klass: FirRegularClass,
session: FirSession, session: FirSession,
superTypesScope: FirScope, superTypesScope: FirTypeScope,
declaredMemberScope: FirScope declaredMemberScope: FirScope
) : AbstractFirUseSiteMemberScope( ) : AbstractFirUseSiteMemberScope(
session, session,
@@ -8,7 +8,9 @@ package org.jetbrains.kotlin.fir.scopes.jvm
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSettings import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSettings
import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
@@ -19,7 +21,7 @@ class JvmMappedScope(
private val declaredMemberScope: FirScope, private val declaredMemberScope: FirScope,
private val javaMappedClassUseSiteScope: FirScope, private val javaMappedClassUseSiteScope: FirScope,
private val signatures: Signatures private val signatures: Signatures
) : FirScope() { ) : FirTypeScope() {
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) { override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) {
val whiteListSignatures = signatures.whiteListSignaturesByName[name] val whiteListSignatures = signatures.whiteListSignaturesByName[name]
@@ -37,6 +39,14 @@ class JvmMappedScope(
declaredMemberScope.processFunctionsByName(name, processor) declaredMemberScope.processFunctionsByName(name, processor)
} }
// JvmMappedScope is basically used as declaration scope but it's being wrapped into substitution scopes where
// a use-site (FirOverrideAwareScope) is expected
// So, we put here a stub implementation
override fun processOverriddenFunctions(
functionSymbol: FirFunctionSymbol<*>,
processor: (FirFunctionSymbol<*>) -> ProcessorAction
) = ProcessorAction.NONE
override fun processDeclaredConstructors(processor: (FirConstructorSymbol) -> Unit) { override fun processDeclaredConstructors(processor: (FirConstructorSymbol) -> Unit) {
val constructorBlackList = signatures.constructorBlackList val constructorBlackList = signatures.constructorBlackList
if (constructorBlackList.isNotEmpty()) { if (constructorBlackList.isNotEmpty()) {
@@ -116,4 +126,4 @@ class JvmMappedScope(
return Signatures(whiteListSignaturesByName, constructorBlackList) return Signatures(whiteListSignaturesByName, constructorBlackList)
} }
} }
} }
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.builder
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
@@ -16,7 +17,7 @@ object StubFirScopeProvider : FirScopeProvider() {
klass: FirClass<*>, klass: FirClass<*>,
useSiteSession: FirSession, useSiteSession: FirSession,
scopeSession: ScopeSession scopeSession: ScopeSession
): FirScope { ): FirTypeScope {
error("Stub") error("Stub")
} }
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.inferenceContext import org.jetbrains.kotlin.fir.inferenceContext
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope import org.jetbrains.kotlin.fir.scopes.impl.FirClassSubstitutionScope
import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope import org.jetbrains.kotlin.fir.scopes.unsubstitutedScope
@@ -43,7 +44,7 @@ inline fun <reified ID : Any, reified FS : FirScope> scopeSessionKey(): ScopeSes
return object : ScopeSessionKey<ID, FS>() {} return object : ScopeSessionKey<ID, FS>() {}
} }
val USE_SITE = scopeSessionKey<FirClassSymbol<*>, FirScope>() val USE_SITE = scopeSessionKey<FirClassSymbol<*>, FirTypeScope>()
data class SubstitutionScopeKey(val type: ConeClassLikeType) : ScopeSessionKey<FirClassLikeSymbol<*>, FirClassSubstitutionScope>() data class SubstitutionScopeKey(val type: ConeClassLikeType) : ScopeSessionKey<FirClassLikeSymbol<*>, FirClassSubstitutionScope>()
@@ -79,11 +80,11 @@ fun createSubstitution(
fun ConeClassLikeType.wrapSubstitutionScopeIfNeed( fun ConeClassLikeType.wrapSubstitutionScopeIfNeed(
session: FirSession, session: FirSession,
useSiteMemberScope: FirScope, useSiteMemberScope: FirTypeScope,
declaration: FirClassLikeDeclaration<*>, declaration: FirClassLikeDeclaration<*>,
builder: ScopeSession, builder: ScopeSession,
derivedClassId: ClassId? = null derivedClassId: ClassId? = null
): FirScope { ): FirTypeScope {
if (this.typeArguments.isEmpty()) return useSiteMemberScope if (this.typeArguments.isEmpty()) return useSiteMemberScope
return builder.getOrBuild(declaration.symbol, SubstitutionScopeKey(this)) { return builder.getOrBuild(declaration.symbol, SubstitutionScopeKey(this)) {
val typeParameters = (declaration as? FirTypeParameterRefsOwner)?.typeParameters.orEmpty() val typeParameters = (declaration as? FirTypeParameterRefsOwner)?.typeParameters.orEmpty()
@@ -38,7 +38,7 @@ class KotlinScopeProvider(
klass: FirClass<*>, klass: FirClass<*>,
useSiteSession: FirSession, useSiteSession: FirSession,
scopeSession: ScopeSession scopeSession: ScopeSession
): FirScope { ): FirTypeScope {
return scopeSession.getOrBuild(klass.symbol, USE_SITE) { return scopeSession.getOrBuild(klass.symbol, USE_SITE) {
val declaredScope = declaredMemberScope(klass) val declaredScope = declaredMemberScope(klass)
val decoratedDeclaredMemberScope = val decoratedDeclaredMemberScope =
@@ -52,14 +52,18 @@ class KotlinScopeProvider(
symbol.fir.scope( symbol.fir.scope(
substitutor(symbol, useSiteSuperType, useSiteSession), substitutor(symbol, useSiteSuperType, useSiteSession),
useSiteSession, scopeSession, skipPrivateMembers = true, klass.classId useSiteSession, scopeSession, skipPrivateMembers = true, klass.classId
) ).let {
it as? FirTypeScope ?: error("$it is expected to be FirOverrideAwareScope")
}
} else { } else {
null null
} }
} }
FirClassUseSiteMemberScope( FirClassUseSiteMemberScope(
useSiteSession, useSiteSession,
FirSuperTypeScope.prepareSupertypeScope(useSiteSession, FirStandardOverrideChecker(useSiteSession), scopes), FirSuperTypeScope.prepareOverrideAwareSupertypeScope(
useSiteSession, FirStandardOverrideChecker(useSiteSession), scopes
),
decoratedDeclaredMemberScope decoratedDeclaredMemberScope
) )
} }
@@ -8,12 +8,15 @@ package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.scopes.FirOverrideChecker import org.jetbrains.kotlin.fir.scopes.FirOverrideChecker
import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
abstract class AbstractFirOverrideScope(val session: FirSession, protected val overrideChecker: FirOverrideChecker) : FirScope() { abstract class AbstractFirOverrideScope(
val session: FirSession,
protected val overrideChecker: FirOverrideChecker
) : FirTypeScope() {
//base symbol as key, overridden as value //base symbol as key, overridden as value
val overrideByBase = mutableMapOf<FirCallableSymbol<*>, FirCallableSymbol<*>?>() val overrideByBase = mutableMapOf<FirCallableSymbol<*>, FirCallableSymbol<*>?>()
@@ -14,15 +14,17 @@ import org.jetbrains.kotlin.fir.declarations.builder.FirSimpleFunctionBuilder
import org.jetbrains.kotlin.fir.declarations.builder.FirValueParameterBuilder import org.jetbrains.kotlin.fir.declarations.builder.FirValueParameterBuilder
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.scopes.FirOverrideChecker import org.jetbrains.kotlin.fir.scopes.FirOverrideChecker
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
abstract class AbstractFirUseSiteMemberScope( abstract class AbstractFirUseSiteMemberScope(
session: FirSession, session: FirSession,
overrideChecker: FirOverrideChecker, overrideChecker: FirOverrideChecker,
protected val superTypesScope: FirScope, protected val superTypesScope: FirTypeScope,
protected val declaredMemberScope: FirScope protected val declaredMemberScope: FirScope
) : AbstractFirOverrideScope(session, overrideChecker) { ) : AbstractFirOverrideScope(session, overrideChecker) {
@@ -20,7 +20,8 @@ import org.jetbrains.kotlin.fir.resolve.substitution.chain
import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorForFullBodyResolve import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculatorForFullBodyResolve
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.symbols.CallableId import org.jetbrains.kotlin.fir.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
@@ -34,12 +35,12 @@ import org.jetbrains.kotlin.name.Name
class FirClassSubstitutionScope( class FirClassSubstitutionScope(
private val session: FirSession, private val session: FirSession,
private val useSiteMemberScope: FirScope, private val useSiteMemberScope: FirTypeScope,
scopeSession: ScopeSession, scopeSession: ScopeSession,
private val substitutor: ConeSubstitutor, private val substitutor: ConeSubstitutor,
private val skipPrivateMembers: Boolean, private val skipPrivateMembers: Boolean,
private val derivedClassId: ClassId? = null private val derivedClassId: ClassId? = null
) : FirScope() { ) : FirTypeScope() {
private val fakeOverrideFunctions = mutableMapOf<FirFunctionSymbol<*>, FirFunctionSymbol<*>>() private val fakeOverrideFunctions = mutableMapOf<FirFunctionSymbol<*>, FirFunctionSymbol<*>>()
private val fakeOverrideConstructors = mutableMapOf<FirConstructorSymbol, FirConstructorSymbol>() private val fakeOverrideConstructors = mutableMapOf<FirConstructorSymbol, FirConstructorSymbol>()
@@ -48,7 +49,7 @@ class FirClassSubstitutionScope(
private val fakeOverrideAccessors = mutableMapOf<FirAccessorSymbol, FirAccessorSymbol>() private val fakeOverrideAccessors = mutableMapOf<FirAccessorSymbol, FirAccessorSymbol>()
constructor( constructor(
session: FirSession, useSiteMemberScope: FirScope, scopeSession: ScopeSession, session: FirSession, useSiteMemberScope: FirTypeScope, scopeSession: ScopeSession,
substitution: Map<FirTypeParameterSymbol, ConeKotlinType>, substitution: Map<FirTypeParameterSymbol, ConeKotlinType>,
skipPrivateMembers: Boolean, derivedClassId: ClassId? = null skipPrivateMembers: Boolean, derivedClassId: ClassId? = null
) : this(session, useSiteMemberScope, scopeSession, substitutorByMap(substitution), skipPrivateMembers, derivedClassId) ) : this(session, useSiteMemberScope, scopeSession, substitutorByMap(substitution), skipPrivateMembers, derivedClassId)
@@ -6,13 +6,14 @@
package org.jetbrains.kotlin.fir.scopes.impl package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class FirClassUseSiteMemberScope( class FirClassUseSiteMemberScope(
session: FirSession, session: FirSession,
superTypesScope: FirScope, superTypesScope: FirTypeScope,
declaredMemberScope: FirScope declaredMemberScope: FirScope
) : AbstractFirUseSiteMemberScope(session, FirStandardOverrideChecker(session), superTypesScope, declaredMemberScope) { ) : AbstractFirUseSiteMemberScope(session, FirStandardOverrideChecker(session), superTypesScope, declaredMemberScope) {
@@ -11,8 +11,10 @@ import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration
import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.scopes.FirOverrideChecker import org.jetbrains.kotlin.fir.scopes.FirOverrideChecker
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.ConeFlexibleType import org.jetbrains.kotlin.fir.types.ConeFlexibleType
import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.ConeKotlinType
@@ -28,7 +30,7 @@ import kotlin.collections.HashSet
class FirSuperTypeScope private constructor( class FirSuperTypeScope private constructor(
session: FirSession, session: FirSession,
overrideChecker: FirOverrideChecker, overrideChecker: FirOverrideChecker,
val scopes: List<FirScope> private val scopes: List<FirScope>,
) : AbstractFirOverrideScope(session, overrideChecker) { ) : AbstractFirOverrideScope(session, overrideChecker) {
private val absentFunctions = mutableSetOf<Name>() private val absentFunctions = mutableSetOf<Name>()
@@ -260,5 +262,13 @@ class FirSuperTypeScope private constructor(
return FirSuperTypeScope(session, overrideChecker, scopes) return FirSuperTypeScope(session, overrideChecker, scopes)
} }
// This methods is needed just to preserve the possibility to move
// org.jetbrains.kotlin.fir.scopes.FirScope.processOverriddenFunctions to FirOverrideAwareScope
fun prepareOverrideAwareSupertypeScope(
session: FirSession,
overrideChecker: FirOverrideChecker,
scopes: List<FirTypeScope>
): FirTypeScope = prepareSupertypeScope(session, overrideChecker, scopes) as FirTypeScope
} }
} }
@@ -14,7 +14,7 @@ abstract class FirScopeProvider {
klass: FirClass<*>, klass: FirClass<*>,
useSiteSession: FirSession, useSiteSession: FirSession,
scopeSession: ScopeSession scopeSession: ScopeSession
): FirScope ): FirTypeScope
abstract fun getStaticMemberScopeForCallables( abstract fun getStaticMemberScopeForCallables(
klass: FirClass<*>, klass: FirClass<*>,
@@ -0,0 +1,22 @@
/*
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.scopes
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
abstract class FirTypeScope : FirScope() {
// Initially, this method is intended to belong only to this class, but not to FirScope
// But the main-use case (FirSyntheticPropertiesScope) uses it on arbitrary type (intersection and others) that currently use
// scope implementations for type-unrelated scopes as well
// One of the idea how to fix it is considered extracting it to the interface
//
// The idea behind this class and abstract override is to explicitly state that those implementations should implement this method properly
// and use other FirOverrideAwareScope when delegating to them (as in FirClassSubstitutionScope)
abstract override fun processOverriddenFunctions(
functionSymbol: FirFunctionSymbol<*>,
processor: (FirFunctionSymbol<*>) -> ProcessorAction
): ProcessorAction
}
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.declarations.FirFunction
import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.KtFunction
import org.jetbrains.kotlin.psi.KtTypeReference import org.jetbrains.kotlin.psi.KtTypeReference
@@ -163,7 +164,7 @@ object KtDeclarationAndFirDeclarationEqualityChecker {
} }
private object DummyScopeProvider : FirScopeProvider() { private object DummyScopeProvider : FirScopeProvider() {
override fun getUseSiteMemberScope(klass: FirClass<*>, useSiteSession: FirSession, scopeSession: ScopeSession): FirScope { override fun getUseSiteMemberScope(klass: FirClass<*>, useSiteSession: FirSession, scopeSession: ScopeSession): FirTypeScope {
shouldNotBeCalled() shouldNotBeCalled()
} }
@@ -182,4 +183,4 @@ object KtDeclarationAndFirDeclarationEqualityChecker {
private fun shouldNotBeCalled(): Nothing = private fun shouldNotBeCalled(): Nothing =
error("Should not be called in RawFirBuilder while converting KtTypeReference") error("Should not be called in RawFirBuilder while converting KtTypeReference")
} }
} }