FIR: Require FirJavaClass in JavaScopeProvider

This commit is contained in:
Denis.Zharkov
2021-02-03 20:41:27 +03:00
parent 04f53d6a23
commit 5d5228cfc5
2 changed files with 12 additions and 22 deletions
@@ -11,13 +11,10 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.java.declarations.FirJavaClass
import org.jetbrains.kotlin.fir.java.scopes.*
import org.jetbrains.kotlin.fir.resolve.*
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.scopes.*
import org.jetbrains.kotlin.fir.scopes.impl.*
import org.jetbrains.kotlin.fir.symbols.impl.FirClassLikeSymbol
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
import org.jetbrains.kotlin.fir.types.ConeClassErrorType
import org.jetbrains.kotlin.utils.DFS
import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult
@@ -54,10 +51,14 @@ class JavaScopeProvider(
scopeSession: ScopeSession
): JavaClassMembersEnhancementScope {
return scopeSession.getOrBuild(symbol, JAVA_ENHANCEMENT) {
val firJavaClass = symbol.fir
require(firJavaClass is FirJavaClass) {
"${firJavaClass.classId} is expected to be FirJavaClass, but ${firJavaClass::class} found"
}
JavaClassMembersEnhancementScope(
useSiteSession,
symbol,
buildUseSiteMemberScopeWithJavaTypes(symbol.fir, useSiteSession, scopeSession)
buildUseSiteMemberScopeWithJavaTypes(firJavaClass, useSiteSession, scopeSession)
)
}
}
@@ -71,7 +72,7 @@ class JavaScopeProvider(
}
private fun buildUseSiteMemberScopeWithJavaTypes(
regularClass: FirRegularClass,
regularClass: FirJavaClass,
useSiteSession: FirSession,
scopeSession: ScopeSession,
): JavaClassUseSiteMemberScope {
@@ -93,8 +94,7 @@ class JavaScopeProvider(
useSiteSession,
JavaOverrideChecker(
useSiteSession,
if (regularClass is FirJavaClass) regularClass.javaTypeParameterStack
else JavaTypeParameterStack.EMPTY
regularClass.javaTypeParameterStack
),
superTypeScopes,
regularClass.defaultType(),
@@ -10,7 +10,6 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty
import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack
import org.jetbrains.kotlin.fir.java.declarations.*
import org.jetbrains.kotlin.fir.resolve.FirJavaSyntheticNamesProvider
import org.jetbrains.kotlin.fir.resolve.calls.syntheticNamesProvider
@@ -28,18 +27,16 @@ import org.jetbrains.kotlin.load.java.structure.impl.JavaPrimitiveTypeImpl
import org.jetbrains.kotlin.name.Name
class JavaClassUseSiteMemberScope(
klass: FirRegularClass,
klass: FirJavaClass,
session: FirSession,
superTypesScope: FirTypeScope,
declaredMemberScope: FirScope
) : AbstractFirUseSiteMemberScope(
session,
JavaOverrideChecker(session, if (klass is FirJavaClass) klass.javaTypeParameterStack else JavaTypeParameterStack.EMPTY),
JavaOverrideChecker(session, klass.javaTypeParameterStack),
superTypesScope,
declaredMemberScope
) {
internal val symbol = klass.symbol
internal fun bindOverrides(name: Name) {
val overrideCandidates = mutableSetOf<FirNamedFunctionSymbol>()
declaredMemberScope.processFunctionsByName(name) {
@@ -141,18 +138,11 @@ class JavaClassUseSiteMemberScope(
}
override fun processPropertiesByName(name: Name, processor: (FirVariableSymbol<*>) -> Unit) {
val getterNames = if (symbol.fir is FirJavaClass) {
FirJavaSyntheticNamesProvider.possibleGetterNamesByPropertyName(name)
} else {
emptyList()
}
val getterNames = FirJavaSyntheticNamesProvider.possibleGetterNamesByPropertyName(name)
return processAccessorFunctionsAndPropertiesByName(name, getterNames, processor)
}
override fun processFunctionsByName(name: Name, processor: (FirNamedFunctionSymbol) -> Unit) {
if (symbol.fir !is FirJavaClass) {
return super.processFunctionsByName(name, processor)
}
val potentialPropertyNames = session.syntheticNamesProvider.possiblePropertyNamesByAccessorName(name)
val accessors = mutableListOf<FirAccessorSymbol>()
val getterName by lazy { session.syntheticNamesProvider.getterNameBySetterName(name) ?: name }