[FIR] Don't create synthetic overriden property if base property is invisible
^KT-62393 Fixed
This commit is contained in:
committed by
Space Team
parent
61ec143b74
commit
16ab36e167
@@ -306,19 +306,27 @@ fun isSubtypeForTypeMismatch(context: ConeInferenceContext, subtype: ConeKotlinT
|
|||||||
}
|
}
|
||||||
|
|
||||||
fun FirCallableDeclaration.isVisibleInClass(parentClass: FirClass): Boolean {
|
fun FirCallableDeclaration.isVisibleInClass(parentClass: FirClass): Boolean {
|
||||||
return symbol.isVisibleInClass(parentClass.symbol)
|
return symbol.isVisibleInClass(parentClass.symbol, symbol.resolvedStatus)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun FirBasedSymbol<*>.isVisibleInClass(parentClassSymbol: FirClassSymbol<*>): Boolean {
|
fun FirBasedSymbol<*>.isVisibleInClass(parentClassSymbol: FirClassSymbol<*>): Boolean {
|
||||||
val classPackage = parentClassSymbol.classId.packageFqName
|
val status = when (this) {
|
||||||
val (visibility, packageName) = when (this) {
|
is FirCallableSymbol<*> -> resolvedStatus
|
||||||
is FirCallableSymbol<*> -> visibility to callableId.packageName
|
is FirClassLikeSymbol -> resolvedStatus
|
||||||
is FirClassLikeSymbol<*> -> visibility to classId.packageFqName
|
|
||||||
else -> return true
|
else -> return true
|
||||||
}
|
}
|
||||||
if (visibility == Visibilities.Private ||
|
return isVisibleInClass(parentClassSymbol, status)
|
||||||
!visibility.visibleFromPackage(classPackage, packageName)
|
}
|
||||||
) return false
|
|
||||||
|
fun FirBasedSymbol<*>.isVisibleInClass(parentClassSymbol: FirClassSymbol<*>, status: FirDeclarationStatus): Boolean {
|
||||||
|
val classPackage = parentClassSymbol.classId.packageFqName
|
||||||
|
val packageName = when (this) {
|
||||||
|
is FirCallableSymbol<*> -> callableId.packageName
|
||||||
|
is FirClassLikeSymbol<*> -> classId.packageFqName
|
||||||
|
else -> return true
|
||||||
|
}
|
||||||
|
val visibility = status.visibility
|
||||||
|
if (visibility == Visibilities.Private || !visibility.visibleFromPackage(classPackage, packageName)) return false
|
||||||
if (
|
if (
|
||||||
visibility == Visibilities.Internal &&
|
visibility == Visibilities.Internal &&
|
||||||
(moduleData != parentClassSymbol.moduleData || parentClassSymbol.moduleData in moduleData.friendDependencies)
|
(moduleData != parentClassSymbol.moduleData || parentClassSymbol.moduleData in moduleData.friendDependencies)
|
||||||
|
|||||||
+9
-2
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.builtins.StandardNames
|
|||||||
import org.jetbrains.kotlin.descriptors.Modality
|
import org.jetbrains.kotlin.descriptors.Modality
|
||||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||||
import org.jetbrains.kotlin.fir.*
|
import org.jetbrains.kotlin.fir.*
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.isVisibleInClass
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunctionCopy
|
import org.jetbrains.kotlin.fir.declarations.builder.buildSimpleFunctionCopy
|
||||||
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
import org.jetbrains.kotlin.fir.declarations.impl.FirDeclarationStatusImpl
|
||||||
@@ -49,7 +50,7 @@ import org.jetbrains.kotlin.utils.addIfNotNull
|
|||||||
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
import org.jetbrains.kotlin.utils.addToStdlib.runIf
|
||||||
|
|
||||||
class JavaClassUseSiteMemberScope(
|
class JavaClassUseSiteMemberScope(
|
||||||
klass: FirJavaClass,
|
private val klass: FirJavaClass,
|
||||||
session: FirSession,
|
session: FirSession,
|
||||||
superTypeScopes: List<FirTypeScope>,
|
superTypeScopes: List<FirTypeScope>,
|
||||||
declaredMemberScope: FirContainingNamesAwareScope
|
declaredMemberScope: FirContainingNamesAwareScope
|
||||||
@@ -153,6 +154,9 @@ class JavaClassUseSiteMemberScope(
|
|||||||
|
|
||||||
internal fun syntheticPropertyFromOverride(overriddenProperty: ResultOfIntersection<FirPropertySymbol>): FirSyntheticPropertySymbol? {
|
internal fun syntheticPropertyFromOverride(overriddenProperty: ResultOfIntersection<FirPropertySymbol>): FirSyntheticPropertySymbol? {
|
||||||
val overrideInClass = overriddenProperty.overriddenMembers.firstNotNullOfOrNull { (symbol, _) ->
|
val overrideInClass = overriddenProperty.overriddenMembers.firstNotNullOfOrNull { (symbol, _) ->
|
||||||
|
// We may call this function at the STATUS phase, which means that using resolved status may lead to cycle
|
||||||
|
// So we need to use raw status here
|
||||||
|
if (!symbol.isVisibleInClass(klass.symbol, symbol.rawStatus)) return@firstNotNullOfOrNull null
|
||||||
symbol.createOverridePropertyIfExists(declaredMemberScope, takeModalityFromGetter = true)
|
symbol.createOverridePropertyIfExists(declaredMemberScope, takeModalityFromGetter = true)
|
||||||
?: superTypeScopes.firstNotNullOfOrNull { scope ->
|
?: superTypeScopes.firstNotNullOfOrNull { scope ->
|
||||||
symbol.createOverridePropertyIfExists(scope, takeModalityFromGetter = false)
|
symbol.createOverridePropertyIfExists(scope, takeModalityFromGetter = false)
|
||||||
@@ -260,7 +264,10 @@ class JavaClassUseSiteMemberScope(
|
|||||||
getProperties(propertyName).any l@{ propertySymbol ->
|
getProperties(propertyName).any l@{ propertySymbol ->
|
||||||
// TODO: add magic overrides from LazyJavaClassMemberScope.isVisibleAsFunctionInCurrentClass
|
// TODO: add magic overrides from LazyJavaClassMemberScope.isVisibleAsFunctionInCurrentClass
|
||||||
if (propertySymbol !is FirPropertySymbol) return@l false
|
if (propertySymbol !is FirPropertySymbol) return@l false
|
||||||
propertySymbol.isOverriddenInClassBy(this)
|
// We may call this function at the STATUS phase, which means that using resolved status may lead to cycle
|
||||||
|
// so we need to use raw status here
|
||||||
|
propertySymbol.isVisibleInClass(this@JavaClassUseSiteMemberScope.klass.symbol, propertySymbol.rawStatus) &&
|
||||||
|
propertySymbol.isOverriddenInClassBy(this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasCorrespondingProperty) return false
|
if (hasCorrespondingProperty) return false
|
||||||
|
|||||||
+2
-2
@@ -33,7 +33,7 @@ class FirJvmDelegatedMembersFilter(private val session: FirSession) : FirDelegat
|
|||||||
|
|
||||||
// If java interface method is not abstract, then it's a default method.
|
// If java interface method is not abstract, then it's a default method.
|
||||||
private fun FirCallableSymbol<*>.isNonAbstractJavaMethod(): Boolean {
|
private fun FirCallableSymbol<*>.isNonAbstractJavaMethod(): Boolean {
|
||||||
return origin == FirDeclarationOrigin.Enhancement && modality != Modality.ABSTRACT
|
return origin == FirDeclarationOrigin.Enhancement && fir.modality != Modality.ABSTRACT
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun FirCallableSymbol<*>.hasJvmDefaultAnnotation(): Boolean {
|
private fun FirCallableSymbol<*>.hasJvmDefaultAnnotation(): Boolean {
|
||||||
@@ -41,7 +41,7 @@ class FirJvmDelegatedMembersFilter(private val session: FirSession) : FirDelegat
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun FirCallableSymbol<*>.isBuiltInMemberMappedToJavaDefault(): Boolean {
|
private fun FirCallableSymbol<*>.isBuiltInMemberMappedToJavaDefault(): Boolean {
|
||||||
return modality != Modality.ABSTRACT &&
|
return fir.modality != Modality.ABSTRACT &&
|
||||||
annotations.hasAnnotation(PLATFORM_DEPENDENT_ANNOTATION_CLASS_ID, session)
|
annotations.hasAnnotation(PLATFORM_DEPENDENT_ANNOTATION_CLASS_ID, session)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user