[FIR] Add effective visibility to resolved status
This commit includes: - introduce FirResolvedDeclarationStatus.effectiveVisibility - replace FirEffectiveVisibility with EffectiveVisibility - move calculation of effective visibility from FirEffectiveVisibilityResolver (which is deleted) to FirStatusResolver and FirDeserializer
This commit is contained in:
committed by
TeamCityServer
parent
a600d18396
commit
3ef87d0265
@@ -10,6 +10,7 @@ import com.intellij.openapi.project.Project
|
||||
import com.intellij.psi.search.GlobalSearchScope
|
||||
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.descriptors.EffectiveVisibility
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
@@ -24,7 +25,6 @@ import org.jetbrains.kotlin.fir.resolve.constructType
|
||||
import org.jetbrains.kotlin.fir.resolve.defaultType
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.ConeClassLikeType
|
||||
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||
@@ -35,13 +35,13 @@ import org.jetbrains.kotlin.load.java.JvmAnnotationNames
|
||||
import org.jetbrains.kotlin.load.java.structure.*
|
||||
import org.jetbrains.kotlin.load.java.structure.impl.JavaElementImpl
|
||||
import org.jetbrains.kotlin.load.kotlin.KotlinClassFinder
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.jvm.KotlinJavaPsiFacade
|
||||
import org.jetbrains.kotlin.types.Variance.INVARIANT
|
||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||
|
||||
@ThreadSafeMutableState
|
||||
class JavaSymbolProvider(
|
||||
@@ -56,7 +56,7 @@ class JavaSymbolProvider(
|
||||
private val classCache =
|
||||
session.firCachesFactory.createCacheWithPostCompute(
|
||||
createValue = ::findAndConvertJavaClass,
|
||||
postCompute = { _, classSymbol, javaClass, ->
|
||||
postCompute = { _, classSymbol, javaClass ->
|
||||
if (classSymbol != null && javaClass != null) {
|
||||
convertJavaClassToFir(classSymbol, javaClass)
|
||||
}
|
||||
@@ -69,6 +69,7 @@ class JavaSymbolProvider(
|
||||
|
||||
private val facade: KotlinJavaPsiFacade get() = KotlinJavaPsiFacade.getInstance(project)
|
||||
private val parentClassTypeParameterStackCache = mutableMapOf<FirRegularClassSymbol, JavaTypeParameterStack>()
|
||||
private val parentClassEffectiveVisibilityCache = mutableMapOf<FirRegularClassSymbol, EffectiveVisibility>()
|
||||
|
||||
private fun findClass(
|
||||
classId: ClassId,
|
||||
@@ -149,7 +150,10 @@ class JavaSymbolProvider(
|
||||
return classCache.getValue(classId, content)
|
||||
}
|
||||
|
||||
private fun findAndConvertJavaClass(classId: ClassId, content: KotlinClassFinder.Result.ClassFileContent?): Pair<FirRegularClassSymbol?, JavaClass?> {
|
||||
private fun findAndConvertJavaClass(
|
||||
classId: ClassId,
|
||||
content: KotlinClassFinder.Result.ClassFileContent?
|
||||
): Pair<FirRegularClassSymbol?, JavaClass?> {
|
||||
val foundClass = findClass(classId, content)
|
||||
return if (foundClass == null ||
|
||||
foundClass.hasDifferentRelativeClassName(classId) ||
|
||||
@@ -202,6 +206,7 @@ class JavaSymbolProvider(
|
||||
parentClassTypeParameterStackCache[classSymbol] = javaTypeParameterStack
|
||||
val firJavaClass = createFirJavaClass(javaClass, classSymbol, outerClassId, parentClassSymbol, classId, javaTypeParameterStack)
|
||||
parentClassTypeParameterStackCache.remove(classSymbol)
|
||||
parentClassEffectiveVisibilityCache.remove(classSymbol)
|
||||
firJavaClass.convertSuperTypes(javaClass, javaTypeParameterStack)
|
||||
firJavaClass.addAnnotationsFrom(this@JavaSymbolProvider.session, javaClass, javaTypeParameterStack)
|
||||
return firJavaClass
|
||||
@@ -233,7 +238,8 @@ class JavaSymbolProvider(
|
||||
session = this@JavaSymbolProvider.session
|
||||
symbol = classSymbol
|
||||
name = javaClass.name
|
||||
visibility = javaClass.visibility
|
||||
val visibility = javaClass.visibility
|
||||
this@buildJavaClass.visibility = visibility
|
||||
modality = javaClass.modality
|
||||
classKind = javaClass.classKind
|
||||
this.isTopLevel = outerClassId == null
|
||||
@@ -241,6 +247,14 @@ class JavaSymbolProvider(
|
||||
this.javaTypeParameterStack = javaTypeParameterStack
|
||||
existingNestedClassifierNames += javaClass.innerClassNames
|
||||
scopeProvider = this@JavaSymbolProvider.scopeProvider
|
||||
|
||||
val selfEffectiveVisibility = visibility.toEffectiveVisibility(parentClassSymbol?.toLookupTag())
|
||||
val parentEffectiveVisibility = parentClassSymbol?.let {
|
||||
parentClassEffectiveVisibilityCache[it] ?: it.fir.effectiveVisibility
|
||||
} ?: EffectiveVisibility.Public
|
||||
val effectiveVisibility = parentEffectiveVisibility.lowerBound(selfEffectiveVisibility, session.typeContext)
|
||||
parentClassEffectiveVisibilityCache[classSymbol] = effectiveVisibility
|
||||
|
||||
val classTypeParameters = javaClass.typeParameters.convertTypeParameters(javaTypeParameterStack)
|
||||
typeParameters += classTypeParameters
|
||||
if (!isStatic && parentClassSymbol != null) {
|
||||
@@ -252,8 +266,9 @@ class JavaSymbolProvider(
|
||||
val dispatchReceiver = classId.defaultType(typeParameters.map { it.symbol })
|
||||
|
||||
status = FirResolvedDeclarationStatusImpl(
|
||||
javaClass.visibility,
|
||||
javaClass.modality
|
||||
visibility,
|
||||
javaClass.modality,
|
||||
effectiveVisibility
|
||||
).apply {
|
||||
this.isInner = !isTopLevel && !this@buildJavaClass.isStatic
|
||||
isCompanion = false
|
||||
@@ -368,7 +383,8 @@ class JavaSymbolProvider(
|
||||
name = fieldName
|
||||
status = FirResolvedDeclarationStatusImpl(
|
||||
javaField.visibility,
|
||||
javaField.modality
|
||||
javaField.modality,
|
||||
javaField.visibility.toEffectiveVisibility(dispatchReceiver.lookupTag)
|
||||
).apply {
|
||||
isStatic = javaField.isStatic
|
||||
isExpect = false
|
||||
@@ -389,7 +405,8 @@ class JavaSymbolProvider(
|
||||
name = fieldName
|
||||
status = FirResolvedDeclarationStatusImpl(
|
||||
javaField.visibility,
|
||||
javaField.modality
|
||||
javaField.modality,
|
||||
javaField.visibility.toEffectiveVisibility(dispatchReceiver.lookupTag)
|
||||
).apply {
|
||||
isStatic = javaField.isStatic
|
||||
isExpect = false
|
||||
@@ -448,7 +465,8 @@ class JavaSymbolProvider(
|
||||
annotationBuilder = { javaMethod.annotations.map { it.toFirAnnotationCall(session, javaTypeParameterStack) } }
|
||||
status = FirResolvedDeclarationStatusImpl(
|
||||
javaMethod.visibility,
|
||||
javaMethod.modality
|
||||
javaMethod.modality,
|
||||
javaMethod.visibility.toEffectiveVisibility(dispatchReceiver.lookupTag)
|
||||
).apply {
|
||||
isStatic = javaMethod.isStatic
|
||||
isExpect = false
|
||||
@@ -476,7 +494,8 @@ class JavaSymbolProvider(
|
||||
|
||||
private fun convertJavaAnnotationMethodToValueParameter(javaMethod: JavaMethod, firJavaMethod: FirJavaMethod): FirJavaValueParameter =
|
||||
buildJavaValueParameter {
|
||||
source = (javaMethod as? JavaElementImpl<*>)?.psi?.toFirPsiSourceElement(FirFakeSourceElementKind.ImplicitJavaAnnotationConstructor)
|
||||
source = (javaMethod as? JavaElementImpl<*>)?.psi
|
||||
?.toFirPsiSourceElement(FirFakeSourceElementKind.ImplicitJavaAnnotationConstructor)
|
||||
session = this@JavaSymbolProvider.session
|
||||
returnTypeRef = firJavaMethod.returnTypeRef
|
||||
name = javaMethod.name
|
||||
@@ -502,7 +521,8 @@ class JavaSymbolProvider(
|
||||
val visibility = javaConstructor?.visibility ?: ownerClassBuilder.visibility
|
||||
status = FirResolvedDeclarationStatusImpl(
|
||||
visibility,
|
||||
Modality.FINAL
|
||||
Modality.FINAL,
|
||||
visibility.toEffectiveVisibility(ownerClassBuilder.symbol)
|
||||
).apply {
|
||||
isExpect = false
|
||||
isActual = false
|
||||
@@ -542,7 +562,7 @@ class JavaSymbolProvider(
|
||||
source = classSource
|
||||
session = this@JavaSymbolProvider.session
|
||||
symbol = FirConstructorSymbol(constructorId)
|
||||
status = FirResolvedDeclarationStatusImpl(Visibilities.Public, Modality.FINAL)
|
||||
status = FirResolvedDeclarationStatusImpl(Visibilities.Public, Modality.FINAL, EffectiveVisibility.Public)
|
||||
returnTypeRef = buildResolvedTypeRef {
|
||||
type = ownerClassBuilder.buildSelfTypeRef()
|
||||
}
|
||||
|
||||
@@ -25,11 +25,12 @@ import org.jetbrains.kotlin.fir.references.impl.FirReferencePlaceholderForResolv
|
||||
import org.jetbrains.kotlin.fir.resolve.bindSymbolToLookupTag
|
||||
import org.jetbrains.kotlin.fir.resolve.defaultType
|
||||
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedReferenceError
|
||||
import org.jetbrains.kotlin.fir.resolve.symbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.getClassDeclaredPropertySymbols
|
||||
import org.jetbrains.kotlin.fir.resolve.symbolProvider
|
||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.expectedConeType
|
||||
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.firUnsafe
|
||||
import org.jetbrains.kotlin.fir.symbols.ConeClassLikeLookupTag
|
||||
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.ConeClassLikeLookupTagImpl
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirRegularClassSymbol
|
||||
@@ -79,13 +80,16 @@ internal val JavaClass.classKind: ClassKind
|
||||
else -> ClassKind.CLASS
|
||||
}
|
||||
|
||||
internal fun ClassId.toLookupTag(): ConeClassLikeLookupTag {
|
||||
return ConeClassLikeLookupTagImpl(this)
|
||||
}
|
||||
|
||||
internal fun ClassId.toConeKotlinType(
|
||||
typeArguments: Array<ConeTypeProjection>,
|
||||
isNullable: Boolean,
|
||||
attributes: ConeAttributes = ConeAttributes.Empty
|
||||
): ConeLookupTagBasedType {
|
||||
val lookupTag = ConeClassLikeLookupTagImpl(this)
|
||||
return ConeClassLikeTypeImpl(lookupTag, typeArguments, isNullable, attributes)
|
||||
return ConeClassLikeTypeImpl(toLookupTag(), typeArguments, isNullable, attributes)
|
||||
}
|
||||
|
||||
internal fun FirTypeRef.toConeKotlinTypeProbablyFlexible(
|
||||
|
||||
+4
-4
@@ -5,7 +5,6 @@
|
||||
|
||||
package org.jetbrains.kotlin.fir.java.enhancement
|
||||
|
||||
import org.jetbrains.kotlin.builtins.jvm.JavaToKotlinClassMap
|
||||
import org.jetbrains.kotlin.descriptors.ClassKind
|
||||
import org.jetbrains.kotlin.descriptors.Modality
|
||||
import org.jetbrains.kotlin.fir.*
|
||||
@@ -22,13 +21,13 @@ import org.jetbrains.kotlin.fir.java.JavaTypeParameterStack
|
||||
import org.jetbrains.kotlin.fir.java.declarations.*
|
||||
import org.jetbrains.kotlin.fir.java.toConeKotlinTypeProbablyFlexible
|
||||
import org.jetbrains.kotlin.fir.scopes.jvm.computeJvmDescriptor
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.*
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.fir.types.jvm.FirJavaTypeRef
|
||||
import org.jetbrains.kotlin.load.java.AnnotationQualifierApplicabilityType
|
||||
import org.jetbrains.kotlin.load.java.typeEnhancement.*
|
||||
import org.jetbrains.kotlin.load.kotlin.SignatureBuildingComponents
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.utils.JavaTypeEnhancementState
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
@@ -230,8 +229,9 @@ class FirSignatureEnhancement(
|
||||
val resolvedStatus = firMethod.status.safeAs<FirResolvedDeclarationStatus>()
|
||||
status = if (resolvedStatus != null) {
|
||||
FirResolvedDeclarationStatusImpl(
|
||||
firMethod.visibility,
|
||||
Modality.FINAL
|
||||
resolvedStatus.visibility,
|
||||
Modality.FINAL,
|
||||
resolvedStatus.effectiveVisibility
|
||||
)
|
||||
} else {
|
||||
FirDeclarationStatusImpl(firMethod.visibility, Modality.FINAL)
|
||||
|
||||
Reference in New Issue
Block a user