Revert "K2: fix internal visibility checks for overrides #KT-53197 Fixed"

This reverts commit 166965e559.
This commit is contained in:
Mikhail Glukhikh
2022-08-05 18:26:59 +02:00
parent 14b13a2f17
commit 2598ecf23f
15 changed files with 33 additions and 172 deletions
@@ -22866,12 +22866,6 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag
runTest("compiler/testData/diagnostics/tests/override/Generics.kt"); runTest("compiler/testData/diagnostics/tests/override/Generics.kt");
} }
@Test
@TestMetadata("InternalPotentialOverride.kt")
public void testInternalPotentialOverride() throws Exception {
runTest("compiler/testData/diagnostics/tests/override/InternalPotentialOverride.kt");
}
@Test @Test
@TestMetadata("InvisiblePotentialOverride.kt") @TestMetadata("InvisiblePotentialOverride.kt")
public void testInvisiblePotentialOverride() throws Exception { public void testInvisiblePotentialOverride() throws Exception {
@@ -22866,12 +22866,6 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti
runTest("compiler/testData/diagnostics/tests/override/Generics.kt"); runTest("compiler/testData/diagnostics/tests/override/Generics.kt");
} }
@Test
@TestMetadata("InternalPotentialOverride.kt")
public void testInternalPotentialOverride() throws Exception {
runTest("compiler/testData/diagnostics/tests/override/InternalPotentialOverride.kt");
}
@Test @Test
@TestMetadata("InvisiblePotentialOverride.kt") @TestMetadata("InvisiblePotentialOverride.kt")
public void testInvisiblePotentialOverride() throws Exception { public void testInvisiblePotentialOverride() throws Exception {
@@ -22866,12 +22866,6 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac
runTest("compiler/testData/diagnostics/tests/override/Generics.kt"); runTest("compiler/testData/diagnostics/tests/override/Generics.kt");
} }
@Test
@TestMetadata("InternalPotentialOverride.kt")
public void testInternalPotentialOverride() throws Exception {
runTest("compiler/testData/diagnostics/tests/override/InternalPotentialOverride.kt");
}
@Test @Test
@TestMetadata("InvisiblePotentialOverride.kt") @TestMetadata("InvisiblePotentialOverride.kt")
public void testInvisiblePotentialOverride() throws Exception { public void testInvisiblePotentialOverride() throws Exception {
@@ -205,7 +205,7 @@ class FakeOverrideGenerator(
// But they are treated differently in IR (real declarations have already been declared before) and such methods are present among realDeclarationSymbols // But they are treated differently in IR (real declarations have already been declared before) and such methods are present among realDeclarationSymbols
if (originalSymbol in realDeclarationSymbols) return if (originalSymbol in realDeclarationSymbols) return
if (!originalDeclaration.isVisibleFromDerivedClass(klass.moduleData)) return if (originalDeclaration.visibility == Visibilities.Private) return
val origin = IrDeclarationOrigin.FAKE_OVERRIDE val origin = IrDeclarationOrigin.FAKE_OVERRIDE
val baseSymbol = originalSymbol.unwrapSubstitutionAndIntersectionOverrides() as S val baseSymbol = originalSymbol.unwrapSubstitutionAndIntersectionOverrides() as S
@@ -80,7 +80,7 @@ private fun wrapSubstitutionScopeIfNeed(
FirClassSubstitutionScope( FirClassSubstitutionScope(
session, useSiteMemberScope, PLATFORM_TYPE_PARAMETERS_SUBSTITUTION_SCOPE_KEY, substitutor, session, useSiteMemberScope, PLATFORM_TYPE_PARAMETERS_SUBSTITUTION_SCOPE_KEY, substitutor,
dispatchReceiverTypeForSubstitutedMembers = derivedClass.defaultType(), dispatchReceiverTypeForSubstitutedMembers = derivedClass.defaultType(),
skipInvisibleMembers = true, skipPrivateMembers = true,
) )
} }
} }
@@ -484,16 +484,3 @@ fun FirClassLikeSymbol<*>.getContainingClassLookupTag(): ConeClassLikeLookupTag?
fun FirBasedSymbol<*>.isVariableOrNamedFunction(): Boolean { fun FirBasedSymbol<*>.isVariableOrNamedFunction(): Boolean {
return this is FirVariableSymbol || this is FirNamedFunctionSymbol || this is FirPropertyAccessorSymbol return this is FirVariableSymbol || this is FirNamedFunctionSymbol || this is FirPropertyAccessorSymbol
} }
fun FirCallableDeclaration.isVisibleFromDerivedClass(derivedClassModuleData: FirModuleData): Boolean {
return when (visibility) {
Visibilities.Private, Visibilities.PrivateToThis ->
false
Visibilities.Internal ->
derivedClassModuleData == this@isVisibleFromDerivedClass.moduleData
else ->
true
}
}
@@ -10,6 +10,7 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSessionComponent import org.jetbrains.kotlin.fir.FirSessionComponent
import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirClass
import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.declarations.utils.classId
import org.jetbrains.kotlin.fir.declarations.utils.delegateFields import org.jetbrains.kotlin.fir.declarations.utils.delegateFields
import org.jetbrains.kotlin.fir.declarations.utils.isExpect import org.jetbrains.kotlin.fir.declarations.utils.isExpect
import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.*
@@ -111,7 +112,7 @@ fun FirClass.scopeForClass(
scopeSession: ScopeSession scopeSession: ScopeSession
): FirTypeScope = scopeForClassImpl( ): FirTypeScope = scopeForClassImpl(
substitutor, useSiteSession, scopeSession, substitutor, useSiteSession, scopeSession,
skipInvisibleMembers = false, skipPrivateMembers = false,
classFirDispatchReceiver = this, classFirDispatchReceiver = this,
// TODO: why it's always false? // TODO: why it's always false?
isFromExpectClass = false isFromExpectClass = false
@@ -130,7 +131,7 @@ fun ConeKotlinType.scopeForSupertype(
substitutor(symbol, this, useSiteSession), substitutor(symbol, this, useSiteSession),
useSiteSession, useSiteSession,
scopeSession, scopeSession,
skipInvisibleMembers = true, skipPrivateMembers = true,
classFirDispatchReceiver = subClass, classFirDispatchReceiver = subClass,
isFromExpectClass = (subClass as? FirRegularClass)?.isExpect == true isFromExpectClass = (subClass as? FirRegularClass)?.isExpect == true
) )
@@ -149,7 +150,7 @@ private fun FirClass.scopeForClassImpl(
substitutor: ConeSubstitutor, substitutor: ConeSubstitutor,
useSiteSession: FirSession, useSiteSession: FirSession,
scopeSession: ScopeSession, scopeSession: ScopeSession,
skipInvisibleMembers: Boolean, skipPrivateMembers: Boolean,
classFirDispatchReceiver: FirClass, classFirDispatchReceiver: FirClass,
isFromExpectClass: Boolean isFromExpectClass: Boolean
): FirTypeScope { ): FirTypeScope {
@@ -165,7 +166,7 @@ private fun FirClass.scopeForClassImpl(
basicScope, basicScope,
key, substitutor, key, substitutor,
substitutor.substituteOrSelf(classFirDispatchReceiver.defaultType()) as ConeClassLikeType, substitutor.substituteOrSelf(classFirDispatchReceiver.defaultType()) as ConeClassLikeType,
skipInvisibleMembers, skipPrivateMembers,
makeExpect = isFromExpectClass makeExpect = isFromExpectClass
) )
} }
@@ -5,10 +5,15 @@
package org.jetbrains.kotlin.fir.scopes.impl package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.fir.* import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSessionComponent
import org.jetbrains.kotlin.fir.caches.* import org.jetbrains.kotlin.fir.caches.*
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty
import org.jetbrains.kotlin.fir.declarations.utils.visibility
import org.jetbrains.kotlin.fir.dispatchReceiverClassOrNull
import org.jetbrains.kotlin.fir.originalForSubstitutionOverride
import org.jetbrains.kotlin.fir.resolve.ScopeSessionKey import org.jetbrains.kotlin.fir.resolve.ScopeSessionKey
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.substitution.chain import org.jetbrains.kotlin.fir.resolve.substitution.chain
@@ -28,7 +33,7 @@ class FirClassSubstitutionScope(
key: ScopeSessionKey<*, *>, key: ScopeSessionKey<*, *>,
private val substitutor: ConeSubstitutor, private val substitutor: ConeSubstitutor,
private val dispatchReceiverTypeForSubstitutedMembers: ConeClassLikeType, private val dispatchReceiverTypeForSubstitutedMembers: ConeClassLikeType,
private val skipInvisibleMembers: Boolean, private val skipPrivateMembers: Boolean,
private val makeExpect: Boolean = false private val makeExpect: Boolean = false
) : FirTypeScope() { ) : FirTypeScope() {
companion object { companion object {
@@ -119,7 +124,7 @@ class FirClassSubstitutionScope(
fun createSubstitutionOverrideFunction(original: FirNamedFunctionSymbol): FirNamedFunctionSymbol { fun createSubstitutionOverrideFunction(original: FirNamedFunctionSymbol): FirNamedFunctionSymbol {
if (substitutor == ConeSubstitutor.Empty) return original if (substitutor == ConeSubstitutor.Empty) return original
val member = original.fir val member = original.fir
if (skipInvisibleMembers && !member.isVisibleInThisScope()) return original if (skipPrivateMembers && member.visibility == Visibilities.Private) return original
val symbolForOverride = FirFakeOverrideGenerator.createSymbolForSubstitutionOverride(original, newOwnerClassId) val symbolForOverride = FirFakeOverrideGenerator.createSymbolForSubstitutionOverride(original, newOwnerClassId)
@@ -219,7 +224,7 @@ class FirClassSubstitutionScope(
fun createSubstitutionOverrideProperty(original: FirPropertySymbol): FirPropertySymbol { fun createSubstitutionOverrideProperty(original: FirPropertySymbol): FirPropertySymbol {
if (substitutor == ConeSubstitutor.Empty) return original if (substitutor == ConeSubstitutor.Empty) return original
val member = original.fir val member = original.fir
if (skipInvisibleMembers && !member.isVisibleInThisScope()) return original if (skipPrivateMembers && member.visibility == Visibilities.Private) return original
val symbolForOverride = FirFakeOverrideGenerator.createSymbolForSubstitutionOverride(original, newOwnerClassId) val symbolForOverride = FirFakeOverrideGenerator.createSymbolForSubstitutionOverride(original, newOwnerClassId)
@@ -305,7 +310,7 @@ class FirClassSubstitutionScope(
fun createSubstitutionOverrideField(original: FirFieldSymbol): FirFieldSymbol { fun createSubstitutionOverrideField(original: FirFieldSymbol): FirFieldSymbol {
if (substitutor == ConeSubstitutor.Empty) return original if (substitutor == ConeSubstitutor.Empty) return original
val member = original.fir val member = original.fir
if (skipInvisibleMembers && !member.isVisibleInThisScope()) return original if (skipPrivateMembers && member.visibility == Visibilities.Private) return original
member.symbol.ensureResolved(FirResolvePhase.STATUS) member.symbol.ensureResolved(FirResolvePhase.STATUS)
val returnType = member.returnTypeRef.coneTypeSafe<ConeKotlinType>() val returnType = member.returnTypeRef.coneTypeSafe<ConeKotlinType>()
@@ -318,7 +323,7 @@ class FirClassSubstitutionScope(
fun createSubstitutionOverrideSyntheticProperty(original: FirSyntheticPropertySymbol): FirSyntheticPropertySymbol { fun createSubstitutionOverrideSyntheticProperty(original: FirSyntheticPropertySymbol): FirSyntheticPropertySymbol {
if (substitutor == ConeSubstitutor.Empty) return original if (substitutor == ConeSubstitutor.Empty) return original
val member = original.fir as FirSyntheticProperty val member = original.fir as FirSyntheticProperty
if (skipInvisibleMembers && !member.isVisibleInThisScope()) return original if (skipPrivateMembers && member.visibility == Visibilities.Private) return original
member.symbol.ensureResolved(FirResolvePhase.STATUS) member.symbol.ensureResolved(FirResolvePhase.STATUS)
val returnType = member.returnTypeRef.coneTypeSafe<ConeKotlinType>() val returnType = member.returnTypeRef.coneTypeSafe<ConeKotlinType>()
@@ -375,10 +380,6 @@ class FirClassSubstitutionScope(
override fun toString(): String { override fun toString(): String {
return "Substitution scope for [$useSiteMemberScope] for type $dispatchReceiverTypeForSubstitutedMembers" return "Substitution scope for [$useSiteMemberScope] for type $dispatchReceiverTypeForSubstitutedMembers"
} }
private fun FirCallableDeclaration.isVisibleInThisScope(): Boolean {
return isVisibleFromDerivedClass(this@FirClassSubstitutionScope.session.moduleData)
}
} }
class FirSubstitutionOverrideStorage(val session: FirSession) : FirSessionComponent { class FirSubstitutionOverrideStorage(val session: FirSession) : FirSessionComponent {
@@ -5,9 +5,10 @@
package org.jetbrains.kotlin.fir.scopes.impl package org.jetbrains.kotlin.fir.scopes.impl
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.isVisibleFromDerivedClass import org.jetbrains.kotlin.fir.declarations.utils.visibility
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.resolve.transformers.ensureResolvedTypeDeclaration import org.jetbrains.kotlin.fir.resolve.transformers.ensureResolvedTypeDeclaration
import org.jetbrains.kotlin.fir.symbols.ensureResolved import org.jetbrains.kotlin.fir.symbols.ensureResolved
@@ -121,7 +122,8 @@ class FirStandardOverrideChecker(private val session: FirSession) : FirAbstractO
} }
override fun isOverriddenFunction(overrideCandidate: FirSimpleFunction, baseDeclaration: FirSimpleFunction): Boolean { override fun isOverriddenFunction(overrideCandidate: FirSimpleFunction, baseDeclaration: FirSimpleFunction): Boolean {
if (!baseDeclaration.isVisibleFromDerivedClass(overrideCandidate.moduleData)) return false if (Visibilities.isPrivate(baseDeclaration.visibility)) return false
if (overrideCandidate.valueParameters.size != baseDeclaration.valueParameters.size) return false if (overrideCandidate.valueParameters.size != baseDeclaration.valueParameters.size) return false
val substitutor = buildTypeParametersSubstitutorIfCompatible(overrideCandidate, baseDeclaration) ?: return false val substitutor = buildTypeParametersSubstitutorIfCompatible(overrideCandidate, baseDeclaration) ?: return false
@@ -139,7 +141,8 @@ class FirStandardOverrideChecker(private val session: FirSession) : FirAbstractO
overrideCandidate: FirCallableDeclaration, overrideCandidate: FirCallableDeclaration,
baseDeclaration: FirProperty baseDeclaration: FirProperty
): Boolean { ): Boolean {
if (!baseDeclaration.isVisibleFromDerivedClass(overrideCandidate.moduleData)) return false if (Visibilities.isPrivate(baseDeclaration.visibility)) return false
if (overrideCandidate !is FirProperty) return false if (overrideCandidate !is FirProperty) return false
val substitutor = buildTypeParametersSubstitutorIfCompatible(overrideCandidate, baseDeclaration) ?: return false val substitutor = buildTypeParametersSubstitutorIfCompatible(overrideCandidate, baseDeclaration) ?: return false
overrideCandidate.ensureResolved(FirResolvePhase.TYPES) overrideCandidate.ensureResolved(FirResolvePhase.TYPES)
@@ -1,22 +0,0 @@
// FIR_IDENTICAL
// MODULE: m1
// FILE: A.kt
open class A {
internal open fun foo() : Int = 1
}
open class AG<T> {
internal open fun bar(arg: T) = arg
}
// MODULE: m2(m1)
// FILE: B.kt
class B : A() {
fun foo() : String = ""
}
class BG : AG<String>() {
fun bar(arg: Int) = arg
}
@@ -1,39 +0,0 @@
// -- Module: <m1> --
package
public open class A {
public constructor A()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
internal open fun foo(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public open class AG</*0*/ T> {
public constructor AG</*0*/ T>()
internal open fun bar(/*0*/ arg: T): T
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
// -- Module: <m2> --
package
public final class B : A {
public constructor B()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final fun foo(): kotlin.String
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class BG : AG<kotlin.String> {
public constructor BG()
public final fun bar(/*0*/ arg: kotlin.Int): kotlin.Int
invisible_fake open override /*1*/ /*fake_override*/ fun bar(/*0*/ arg: kotlin.String): kotlin.String
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -1,47 +0,0 @@
// !LANGUAGE: +ProhibitInvisibleAbstractMethodsInSuperclasses
// MODULE: base
// FILE: Base.kt
package base
abstract class Base {
fun foo(): String {
return internalFoo()
}
internal abstract fun internalFoo(): String
}
open class BaseWithOverride : Base() {
override fun internalFoo(): String = ""
}
// MODULE: intermediate(base)
// FILE: Intermediate.kt
package intermediate
import base.*
abstract class Intermediate : Base()
// MODULE: impl(base, intermediate)
// FILE: Impl.kt
package impl
import base.*
import intermediate.*
<!INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER_ERROR!>class ImplDirectFromBase<!> : Base()
<!INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER_ERROR!>object ImplObjDirectFromBase<!> : Base()
class ImplDirectFromBaseWithOverride : BaseWithOverride()
<!INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER_ERROR!>class ImplDirectFromBaseWithOverrid<!> : Base() {
<!NOTHING_TO_OVERRIDE!>override<!> fun internalFoo(): String = ""
}
<!INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER_ERROR!>class ImplViaIntermediate<!> : Intermediate()
fun foo() {
ImplDirectFromBase().foo()
ImplObjDirectFromBase.foo()
ImplDirectFromBaseWithOverride().foo()
ImplViaIntermediate().foo()
}
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
// !LANGUAGE: +ProhibitInvisibleAbstractMethodsInSuperclasses // !LANGUAGE: +ProhibitInvisibleAbstractMethodsInSuperclasses
// MODULE: base // MODULE: base
// FILE: Base.kt // FILE: Base.kt
@@ -22872,12 +22872,6 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/tests/override/Generics.kt"); runTest("compiler/testData/diagnostics/tests/override/Generics.kt");
} }
@Test
@TestMetadata("InternalPotentialOverride.kt")
public void testInternalPotentialOverride() throws Exception {
runTest("compiler/testData/diagnostics/tests/override/InternalPotentialOverride.kt");
}
@Test @Test
@TestMetadata("InvisiblePotentialOverride.kt") @TestMetadata("InvisiblePotentialOverride.kt")
public void testInvisiblePotentialOverride() throws Exception { public void testInvisiblePotentialOverride() throws Exception {
@@ -26,16 +26,16 @@ import base.*
// TESTCASE NUMBER: 1 // TESTCASE NUMBER: 1
<!INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER_ERROR!>class Case1<!> : BaseKotlin() { class Case1 : BaseKotlin() {
<!NOTHING_TO_OVERRIDE!>override<!> fun foo(b: Boolean?) {} <!CANNOT_OVERRIDE_INVISIBLE_MEMBER!>override<!> fun foo(b: Boolean?) {}
} }
fun case1() { fun case1() {
val v = Case1() val v = Case1()
v.boo(true) v.boo(true)
val o = <!INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER_ERROR!>object<!> : BaseKotlin() { val o = object : BaseKotlin() {
<!NOTHING_TO_OVERRIDE!>override<!> fun foo(b: Boolean?) {} <!CANNOT_OVERRIDE_INVISIBLE_MEMBER!>override<!> fun foo(b: Boolean?) {}
} }
} }
@@ -44,16 +44,16 @@ fun case1() {
*/ */
abstract class AbstractClassCase2 : BaseKotlin() {} abstract class AbstractClassCase2 : BaseKotlin() {}
<!INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER_ERROR!>class Case2<!>: AbstractClassCase2() { class Case2: AbstractClassCase2() {
<!NOTHING_TO_OVERRIDE!>override<!> fun foo(b: Boolean?) {} <!CANNOT_OVERRIDE_INVISIBLE_MEMBER!>override<!> fun foo(b: Boolean?) {}
} }
fun case2() { fun case2() {
val v = Case2() val v = Case2()
v.boo(true) v.boo(true)
val o = <!INVISIBLE_ABSTRACT_MEMBER_FROM_SUPER_ERROR!>object<!> : AbstractClassCase2() { val o = object : AbstractClassCase2() {
<!NOTHING_TO_OVERRIDE!>override<!> fun foo(b: Boolean?) {} <!CANNOT_OVERRIDE_INVISIBLE_MEMBER!>override<!> fun foo(b: Boolean?) {}
} }
} }