[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:
Dmitriy Novozhilov
2021-04-02 14:57:30 +03:00
committed by TeamCityServer
parent a600d18396
commit 3ef87d0265
33 changed files with 327 additions and 679 deletions
@@ -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(
@@ -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)