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.JavaOverrideChecker
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.FirScopeProvider
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.impl.*
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.types.ConeClassErrorType
@@ -34,7 +37,7 @@ class JavaScopeProvider(
klass: FirClass<*>,
useSiteSession: FirSession,
scopeSession: ScopeSession
): FirScope =
): FirTypeScope =
buildJavaEnhancementScope(useSiteSession, klass.symbol as FirRegularClassSymbol, scopeSession, mutableSetOf())
private fun buildJavaEnhancementScope(
@@ -86,7 +89,7 @@ class JavaScopeProvider(
}
JavaClassUseSiteMemberScope(
regularClass, useSiteSession,
FirSuperTypeScope.prepareSupertypeScope(
FirSuperTypeScope.prepareOverrideAwareSupertypeScope(
useSiteSession,
JavaOverrideChecker(
useSiteSession,
@@ -110,7 +113,14 @@ class JavaScopeProvider(
val wrappedDeclaredScope = declaredMemberScopeDecorator(klass, declaredScope, useSiteSession, scopeSession)
JavaClassEnhancementScope(
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.FirSimpleFunctionBuilder
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.buildSyntheticProperty
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.render
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.symbols.CallableId
import org.jetbrains.kotlin.fir.symbols.impl.*
@@ -42,7 +43,7 @@ import org.jetbrains.kotlin.utils.Jsr305State
class JavaClassEnhancementScope(
private val session: FirSession,
private val useSiteMemberScope: JavaClassUseSiteMemberScope
) : FirScope() {
) : FirTypeScope() {
private val owner: FirRegularClass = useSiteMemberScope.symbol.fir
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.builder.FirSimpleFunctionBuilder
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.expressions.FirExpression
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.scopes.FirScope
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.impl.*
import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef
@@ -25,7 +25,7 @@ import org.jetbrains.kotlin.name.Name
class JavaClassUseSiteMemberScope(
klass: FirRegularClass,
session: FirSession,
superTypesScope: FirScope,
superTypesScope: FirTypeScope,
declaredMemberScope: FirScope
) : AbstractFirUseSiteMemberScope(
session,
@@ -8,7 +8,9 @@ package org.jetbrains.kotlin.fir.scopes.jvm
import org.jetbrains.kotlin.builtins.jvm.JvmBuiltInsSettings
import org.jetbrains.kotlin.fir.declarations.FirRegularClass
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.ProcessorAction
import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirConstructorSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
@@ -19,7 +21,7 @@ class JvmMappedScope(
private val declaredMemberScope: FirScope,
private val javaMappedClassUseSiteScope: FirScope,
private val signatures: Signatures
) : FirScope() {
) : FirTypeScope() {
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) {
val whiteListSignatures = signatures.whiteListSignaturesByName[name]
@@ -37,6 +39,14 @@ class JvmMappedScope(
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) {
val constructorBlackList = signatures.constructorBlackList
if (constructorBlackList.isNotEmpty()) {
@@ -116,4 +126,4 @@ class JvmMappedScope(
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.declarations.FirClass
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.FirScopeProvider
@@ -16,7 +17,7 @@ object StubFirScopeProvider : FirScopeProvider() {
klass: FirClass<*>,
useSiteSession: FirSession,
scopeSession: ScopeSession
): FirScope {
): FirTypeScope {
error("Stub")
}
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.descriptors.ClassKind
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.*
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.impl.FirClassSubstitutionScope
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>() {}
}
val USE_SITE = scopeSessionKey<FirClassSymbol<*>, FirScope>()
val USE_SITE = scopeSessionKey<FirClassSymbol<*>, FirTypeScope>()
data class SubstitutionScopeKey(val type: ConeClassLikeType) : ScopeSessionKey<FirClassLikeSymbol<*>, FirClassSubstitutionScope>()
@@ -79,11 +80,11 @@ fun createSubstitution(
fun ConeClassLikeType.wrapSubstitutionScopeIfNeed(
session: FirSession,
useSiteMemberScope: FirScope,
useSiteMemberScope: FirTypeScope,
declaration: FirClassLikeDeclaration<*>,
builder: ScopeSession,
derivedClassId: ClassId? = null
): FirScope {
): FirTypeScope {
if (this.typeArguments.isEmpty()) return useSiteMemberScope
return builder.getOrBuild(declaration.symbol, SubstitutionScopeKey(this)) {
val typeParameters = (declaration as? FirTypeParameterRefsOwner)?.typeParameters.orEmpty()
@@ -38,7 +38,7 @@ class KotlinScopeProvider(
klass: FirClass<*>,
useSiteSession: FirSession,
scopeSession: ScopeSession
): FirScope {
): FirTypeScope {
return scopeSession.getOrBuild(klass.symbol, USE_SITE) {
val declaredScope = declaredMemberScope(klass)
val decoratedDeclaredMemberScope =
@@ -52,14 +52,18 @@ class KotlinScopeProvider(
symbol.fir.scope(
substitutor(symbol, useSiteSuperType, useSiteSession),
useSiteSession, scopeSession, skipPrivateMembers = true, klass.classId
)
).let {
it as? FirTypeScope ?: error("$it is expected to be FirOverrideAwareScope")
}
} else {
null
}
}
FirClassUseSiteMemberScope(
useSiteSession,
FirSuperTypeScope.prepareSupertypeScope(useSiteSession, FirStandardOverrideChecker(useSiteSession), scopes),
FirSuperTypeScope.prepareOverrideAwareSupertypeScope(
useSiteSession, FirStandardOverrideChecker(useSiteSession), scopes
),
decoratedDeclaredMemberScope
)
}
@@ -8,12 +8,15 @@ package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.fir.FirSession
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.FirScope
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
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
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.expressions.FirExpression
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.FirScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.name.Name
abstract class AbstractFirUseSiteMemberScope(
session: FirSession,
overrideChecker: FirOverrideChecker,
protected val superTypesScope: FirScope,
protected val superTypesScope: FirTypeScope,
protected val declaredMemberScope: FirScope
) : 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.transformers.ReturnTypeCalculator
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.impl.*
import org.jetbrains.kotlin.fir.types.ConeKotlinType
@@ -34,12 +35,12 @@ import org.jetbrains.kotlin.name.Name
class FirClassSubstitutionScope(
private val session: FirSession,
private val useSiteMemberScope: FirScope,
private val useSiteMemberScope: FirTypeScope,
scopeSession: ScopeSession,
private val substitutor: ConeSubstitutor,
private val skipPrivateMembers: Boolean,
private val derivedClassId: ClassId? = null
) : FirScope() {
) : FirTypeScope() {
private val fakeOverrideFunctions = mutableMapOf<FirFunctionSymbol<*>, FirFunctionSymbol<*>>()
private val fakeOverrideConstructors = mutableMapOf<FirConstructorSymbol, FirConstructorSymbol>()
@@ -48,7 +49,7 @@ class FirClassSubstitutionScope(
private val fakeOverrideAccessors = mutableMapOf<FirAccessorSymbol, FirAccessorSymbol>()
constructor(
session: FirSession, useSiteMemberScope: FirScope, scopeSession: ScopeSession,
session: FirSession, useSiteMemberScope: FirTypeScope, scopeSession: ScopeSession,
substitution: Map<FirTypeParameterSymbol, ConeKotlinType>,
skipPrivateMembers: Boolean, derivedClassId: ClassId? = null
) : this(session, useSiteMemberScope, scopeSession, substitutorByMap(substitution), skipPrivateMembers, derivedClassId)
@@ -6,13 +6,14 @@
package org.jetbrains.kotlin.fir.scopes.impl
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.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.name.Name
class FirClassUseSiteMemberScope(
session: FirSession,
superTypesScope: FirScope,
superTypesScope: FirTypeScope,
declaredMemberScope: FirScope
) : 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.FirSimpleFunction
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.FirScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.fir.types.ConeFlexibleType
import org.jetbrains.kotlin.fir.types.ConeKotlinType
@@ -28,7 +30,7 @@ import kotlin.collections.HashSet
class FirSuperTypeScope private constructor(
session: FirSession,
overrideChecker: FirOverrideChecker,
val scopes: List<FirScope>
private val scopes: List<FirScope>,
) : AbstractFirOverrideScope(session, overrideChecker) {
private val absentFunctions = mutableSetOf<Name>()
@@ -260,5 +262,13 @@ class FirSuperTypeScope private constructor(
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<*>,
useSiteSession: FirSession,
scopeSession: ScopeSession
): FirScope
): FirTypeScope
abstract fun getStaticMemberScopeForCallables(
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.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.FirScopeProvider
import org.jetbrains.kotlin.fir.scopes.FirTypeScope
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.psi.KtFunction
import org.jetbrains.kotlin.psi.KtTypeReference
@@ -163,7 +164,7 @@ object KtDeclarationAndFirDeclarationEqualityChecker {
}
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()
}
@@ -182,4 +183,4 @@ object KtDeclarationAndFirDeclarationEqualityChecker {
private fun shouldNotBeCalled(): Nothing =
error("Should not be called in RawFirBuilder while converting KtTypeReference")
}
}
}