diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 81de9f323d0..083946023c8 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -33872,6 +33872,18 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/visibility/lackOfInvisibleSetterOfJavaClassInSamePackage.kt"); } + @Test + @TestMetadata("notOverridingInternal.kt") + public void testNotOverridingInternal() throws Exception { + runTest("compiler/testData/diagnostics/tests/visibility/notOverridingInternal.kt"); + } + + @Test + @TestMetadata("notOverridingPackagePrivate.kt") + public void testNotOverridingPackagePrivate() throws Exception { + runTest("compiler/testData/diagnostics/tests/visibility/notOverridingPackagePrivate.kt"); + } + @Test @TestMetadata("overrideOfMemberInPackagePrivateClass.kt") public void testOverrideOfMemberInPackagePrivateClass() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index a67c621b4da..a331e7668a8 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -33872,6 +33872,18 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/visibility/lackOfInvisibleSetterOfJavaClassInSamePackage.kt"); } + @Test + @TestMetadata("notOverridingInternal.kt") + public void testNotOverridingInternal() throws Exception { + runTest("compiler/testData/diagnostics/tests/visibility/notOverridingInternal.kt"); + } + + @Test + @TestMetadata("notOverridingPackagePrivate.kt") + public void testNotOverridingPackagePrivate() throws Exception { + runTest("compiler/testData/diagnostics/tests/visibility/notOverridingPackagePrivate.kt"); + } + @Test @TestMetadata("overrideOfMemberInPackagePrivateClass.kt") public void testOverrideOfMemberInPackagePrivateClass() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index fbfcd2fd69d..442679d4105 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -33872,6 +33872,18 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/visibility/lackOfInvisibleSetterOfJavaClassInSamePackage.kt"); } + @Test + @TestMetadata("notOverridingInternal.kt") + public void testNotOverridingInternal() throws Exception { + runTest("compiler/testData/diagnostics/tests/visibility/notOverridingInternal.kt"); + } + + @Test + @TestMetadata("notOverridingPackagePrivate.kt") + public void testNotOverridingPackagePrivate() throws Exception { + runTest("compiler/testData/diagnostics/tests/visibility/notOverridingPackagePrivate.kt"); + } + @Test @TestMetadata("overrideOfMemberInPackagePrivateClass.kt") public void testOverrideOfMemberInPackagePrivateClass() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java index 34e985ed006..4ad7bfd283c 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/Fir2IrTextTestGenerated.java @@ -2596,6 +2596,12 @@ public class Fir2IrTextTestGenerated extends AbstractFir2IrTextTest { runTest("compiler/testData/ir/irText/firProblems/InnerClassInAnonymous.kt"); } + @Test + @TestMetadata("internalPotentialOverride.kt") + public void testInternalPotentialOverride() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/internalPotentialOverride.kt"); + } + @Test @TestMetadata("kt19251.kt") public void testKt19251() throws Exception { diff --git a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java index bfd824c7d5f..7569d7a6e88 100644 --- a/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java +++ b/compiler/fir/fir2ir/tests-gen/org/jetbrains/kotlin/test/runners/ir/LightTreeFir2IrTextTestGenerated.java @@ -2596,6 +2596,12 @@ public class LightTreeFir2IrTextTestGenerated extends AbstractLightTreeFir2IrTex runTest("compiler/testData/ir/irText/firProblems/InnerClassInAnonymous.kt"); } + @Test + @TestMetadata("internalPotentialOverride.kt") + public void testInternalPotentialOverride() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/internalPotentialOverride.kt"); + } + @Test @TestMetadata("kt19251.kt") public void testKt19251() throws Exception { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaVisibilityChecker.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaVisibilityChecker.kt index 4492c068da6..e21449eb4a1 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaVisibilityChecker.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaVisibilityChecker.kt @@ -17,6 +17,7 @@ import org.jetbrains.kotlin.fir.resolve.SupertypeSupplier import org.jetbrains.kotlin.fir.resolve.calls.FirSimpleSyntheticPropertySymbol import org.jetbrains.kotlin.fir.resolve.calls.ReceiverValue import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol +import org.jetbrains.kotlin.name.FqName @NoMutableState object FirJavaVisibilityChecker : FirVisibilityChecker() { @@ -50,17 +51,22 @@ object FirJavaVisibilityChecker : FirVisibilityChecker() { } } - JavaVisibilities.PackageVisibility -> { - if (symbol.packageFqName() == useSiteFile.packageFqName) { - true - } else if (symbol.fir is FirSyntheticPropertyAccessor) { - symbol.getOwnerLookupTag()?.classId?.packageFqName == useSiteFile.packageFqName - } else { - false - } - } - + JavaVisibilities.PackageVisibility -> symbol.isInPackage(useSiteFile.packageFqName) else -> true } } + + override fun platformOverrideVisibilityCheck( + session: FirSession, + candidateInDerivedClass: FirBasedSymbol<*>, + symbolInBaseClass: FirBasedSymbol<*>, + visibilityInBaseClass: Visibility, + ): Boolean = when (visibilityInBaseClass) { + JavaVisibilities.ProtectedAndPackage, JavaVisibilities.ProtectedStaticVisibility -> true + JavaVisibilities.PackageVisibility -> symbolInBaseClass.isInPackage(candidateInDerivedClass.packageFqName()) + else -> true + } + + private fun FirBasedSymbol<*>.isInPackage(expected: FqName): Boolean = + packageFqName() == expected || (fir is FirSyntheticPropertyAccessor && getOwnerLookupTag()?.classId?.packageFqName == expected) } diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt index 11c45c537ee..9ff09d5382d 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/FirVisibilityChecker.kt @@ -62,6 +62,15 @@ abstract class FirVisibilityChecker : FirSessionComponent { ): Boolean { return true } + + override fun platformOverrideVisibilityCheck( + session: FirSession, + candidateInDerivedClass: FirBasedSymbol<*>, + symbolInBaseClass: FirBasedSymbol<*>, + visibilityInBaseClass: Visibility, + ): Boolean { + return true + } } fun isVisible( @@ -107,6 +116,24 @@ abstract class FirVisibilityChecker : FirSessionComponent { } } + fun isVisibleForOverriding( + session: FirSession, + candidateInDerivedClass: FirMemberDeclaration, + candidateInBaseClass: FirMemberDeclaration + ): Boolean = when (candidateInBaseClass.visibility) { + Visibilities.Internal -> { + candidateInBaseClass.moduleData == candidateInDerivedClass.moduleData || + (candidateInDerivedClass.moduleData == session.moduleData && + session.moduleVisibilityChecker?.isInFriendModule(candidateInBaseClass) == true) + } + + Visibilities.Private, Visibilities.PrivateToThis -> false + Visibilities.Protected -> true + else -> platformOverrideVisibilityCheck( + session, candidateInDerivedClass.symbol, candidateInBaseClass.symbol, candidateInBaseClass.visibility + ) + } + private fun FirMemberDeclaration.containingNonLocalClass( session: FirSession, dispatchReceiverValue: ReceiverValue? @@ -226,6 +253,13 @@ abstract class FirVisibilityChecker : FirSessionComponent { supertypeSupplier: SupertypeSupplier ): Boolean + protected abstract fun platformOverrideVisibilityCheck( + session: FirSession, + candidateInDerivedClass: FirBasedSymbol<*>, + symbolInBaseClass: FirBasedSymbol<*>, + visibilityInBaseClass: Visibility, + ): Boolean + private fun canSeePrivateMemberOf( symbol: FirBasedSymbol<*>, containingDeclarationOfUseSite: List, @@ -357,7 +391,9 @@ abstract class FirVisibilityChecker : FirSessionComponent { stubTypesEqualToAnything = false ) if (AbstractTypeChecker.isSubtypeOf( - typeCheckerState, dispatchReceiverType.fullyExpandedType(session), containingUseSiteClass.symbol.constructStarProjectedType() + typeCheckerState, + dispatchReceiverType.fullyExpandedType(session), + containingUseSiteClass.symbol.constructStarProjectedType() ) ) { return true diff --git a/compiler/testData/diagnostics/tests/visibility/notOverridingInternal.kt b/compiler/testData/diagnostics/tests/visibility/notOverridingInternal.kt new file mode 100644 index 00000000000..6e7bc6edd53 --- /dev/null +++ b/compiler/testData/diagnostics/tests/visibility/notOverridingInternal.kt @@ -0,0 +1,24 @@ +// FIR_IDENTICAL +// MODULE: base +// FILE: Base.kt +package base + +abstract class Base { + fun foo() = internalFoo() + + internal fun internalFoo() {} +} + +// MODULE: impl(base) +// FILE: Impl.kt +package impl +import base.* + +class Impl : Base() { + fun internalFoo() { /*not an override*/ } +} + +fun foo() { + Impl().foo() + Impl().internalFoo() +} diff --git a/compiler/testData/diagnostics/tests/visibility/notOverridingInternal.txt b/compiler/testData/diagnostics/tests/visibility/notOverridingInternal.txt new file mode 100644 index 00000000000..5e3bbd43579 --- /dev/null +++ b/compiler/testData/diagnostics/tests/visibility/notOverridingInternal.txt @@ -0,0 +1,30 @@ +// -- Module: -- +package + +package base { + + public abstract class Base { + public constructor Base() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final fun foo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + internal final fun internalFoo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} + +// -- Module: -- +package + +package impl { + public fun foo(): kotlin.Unit + + public final class Impl : base.Base { + public constructor Impl() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public final override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final fun internalFoo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} diff --git a/compiler/testData/diagnostics/tests/visibility/notOverridingPackagePrivate.fir.kt b/compiler/testData/diagnostics/tests/visibility/notOverridingPackagePrivate.fir.kt new file mode 100644 index 00000000000..3a38fb1c46f --- /dev/null +++ b/compiler/testData/diagnostics/tests/visibility/notOverridingPackagePrivate.fir.kt @@ -0,0 +1,23 @@ +// FILE: base/Base.java +package base; + +public abstract class Base { + public void foo() { + packagePrivateFoo(); + } + + /* package-private */ void packagePrivateFoo() {}; +} + +// FILE: Impl.kt +package impl +import base.* + +class Impl : Base() { + fun packagePrivateFoo() { /*not an override*/ } +} + +fun foo() { + Impl().foo() + Impl().packagePrivateFoo() +} diff --git a/compiler/testData/diagnostics/tests/visibility/notOverridingPackagePrivate.kt b/compiler/testData/diagnostics/tests/visibility/notOverridingPackagePrivate.kt new file mode 100644 index 00000000000..94373ef1edd --- /dev/null +++ b/compiler/testData/diagnostics/tests/visibility/notOverridingPackagePrivate.kt @@ -0,0 +1,23 @@ +// FILE: base/Base.java +package base; + +public abstract class Base { + public void foo() { + packagePrivateFoo(); + } + + /* package-private */ void packagePrivateFoo() {}; +} + +// FILE: Impl.kt +package impl +import base.* + +class Impl : Base() { + fun packagePrivateFoo() { /*not an override*/ } +} + +fun foo() { + Impl().foo() + Impl().packagePrivateFoo() +} diff --git a/compiler/testData/diagnostics/tests/visibility/notOverridingPackagePrivate.txt b/compiler/testData/diagnostics/tests/visibility/notOverridingPackagePrivate.txt new file mode 100644 index 00000000000..021c6c9daaf --- /dev/null +++ b/compiler/testData/diagnostics/tests/visibility/notOverridingPackagePrivate.txt @@ -0,0 +1,26 @@ +package + +package base { + + public abstract class Base { + public constructor Base() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open fun foo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public/*package*/ open fun packagePrivateFoo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} + +package impl { + public fun foo(): kotlin.Unit + + public final class Impl : base.Base { + public constructor Impl() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public final fun packagePrivateFoo(): kotlin.Unit + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} diff --git a/compiler/testData/ir/irText/firProblems/internalPotentialOverride.fir.ir.txt b/compiler/testData/ir/irText/firProblems/internalPotentialOverride.fir.ir.txt new file mode 100644 index 00000000000..96c5e3985f8 --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/internalPotentialOverride.fir.ir.txt @@ -0,0 +1,54 @@ +Module: m1 +FILE fqName: fileName:/A.kt + CLASS CLASS name:A modality:OPEN visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.A + CONSTRUCTOR visibility:public <> () returnType:.A [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:A modality:OPEN visibility:public superTypes:[kotlin.Any]' + FUN name:foo visibility:internal modality:OPEN <> ($this:.A) returnType:kotlin.Int + $this: VALUE_PARAMETER name: type:.A + BLOCK_BODY + RETURN type=kotlin.Nothing from='internal open fun foo (): kotlin.Int declared in .A' + CONST Int type=kotlin.Int value=1 + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any +Module: m2 +FILE fqName: fileName:/B.kt + CLASS CLASS name:B modality:FINAL visibility:public superTypes:[.A] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.B + CONSTRUCTOR visibility:public <> () returnType:.B [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in .A' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:B modality:FINAL visibility:public superTypes:[.A]' + FUN name:foo visibility:internal modality:FINAL <> ($this:.B) returnType:kotlin.String + overridden: + internal open fun foo (): kotlin.Int declared in .A + $this: VALUE_PARAMETER name: type:.B + BLOCK_BODY + RETURN type=kotlin.Nothing from='internal final fun foo (): kotlin.String declared in .B' + CONST String type=kotlin.String value="OK" + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in .A + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int [fake_override] declared in .A + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String [fake_override] declared in .A + $this: VALUE_PARAMETER name: type:kotlin.Any diff --git a/compiler/testData/ir/irText/firProblems/internalPotentialOverride.fir.kt.txt b/compiler/testData/ir/irText/firProblems/internalPotentialOverride.fir.kt.txt new file mode 100644 index 00000000000..36be6f8e194 --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/internalPotentialOverride.fir.kt.txt @@ -0,0 +1,31 @@ +// MODULE: m1 +// FILE: A.kt + +open class A { + constructor() /* primary */ { + super/*Any*/() + /* () */ + + } + + internal open fun foo(): Int { + return 1 + } + +} + +// MODULE: m2 +// FILE: B.kt + +class B : A { + constructor() /* primary */ { + super/*A*/() + /* () */ + + } + + internal override fun foo(): String { + return "OK" + } + +} diff --git a/compiler/testData/ir/irText/firProblems/internalPotentialOverride.ir.txt b/compiler/testData/ir/irText/firProblems/internalPotentialOverride.ir.txt new file mode 100644 index 00000000000..161ff8a445e --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/internalPotentialOverride.ir.txt @@ -0,0 +1,52 @@ +Module: m1 +FILE fqName: fileName:/A.kt + CLASS CLASS name:A modality:OPEN visibility:public superTypes:[kotlin.Any] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.A + CONSTRUCTOR visibility:public <> () returnType:.A [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in kotlin.Any' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:A modality:OPEN visibility:public superTypes:[kotlin.Any]' + FUN name:foo visibility:internal modality:OPEN <> ($this:.A) returnType:kotlin.Int + $this: VALUE_PARAMETER name: type:.A + BLOCK_BODY + RETURN type=kotlin.Nothing from='internal open fun foo (): kotlin.Int declared in .A' + CONST Int type=kotlin.Int value=1 + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [operator] declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String declared in kotlin.Any + $this: VALUE_PARAMETER name: type:kotlin.Any +Module: m2 +FILE fqName: fileName:/B.kt + CLASS CLASS name:B modality:FINAL visibility:public superTypes:[.A] + $this: VALUE_PARAMETER INSTANCE_RECEIVER name: type:.B + CONSTRUCTOR visibility:public <> () returnType:.B [primary] + BLOCK_BODY + DELEGATING_CONSTRUCTOR_CALL 'public constructor () [primary] declared in .A' + INSTANCE_INITIALIZER_CALL classDescriptor='CLASS CLASS name:B modality:FINAL visibility:public superTypes:[.A]' + FUN name:foo visibility:public modality:FINAL <> ($this:.B) returnType:kotlin.String + $this: VALUE_PARAMETER name: type:.B + BLOCK_BODY + RETURN type=kotlin.Nothing from='public final fun foo (): kotlin.String declared in .B' + CONST String type=kotlin.String value="OK" + FUN FAKE_OVERRIDE name:equals visibility:public modality:OPEN <> ($this:kotlin.Any, other:kotlin.Any?) returnType:kotlin.Boolean [fake_override,operator] + overridden: + public open fun equals (other: kotlin.Any?): kotlin.Boolean [fake_override,operator] declared in .A + $this: VALUE_PARAMETER name: type:kotlin.Any + VALUE_PARAMETER name:other index:0 type:kotlin.Any? + FUN FAKE_OVERRIDE name:hashCode visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.Int [fake_override] + overridden: + public open fun hashCode (): kotlin.Int [fake_override] declared in .A + $this: VALUE_PARAMETER name: type:kotlin.Any + FUN FAKE_OVERRIDE name:toString visibility:public modality:OPEN <> ($this:kotlin.Any) returnType:kotlin.String [fake_override] + overridden: + public open fun toString (): kotlin.String [fake_override] declared in .A + $this: VALUE_PARAMETER name: type:kotlin.Any diff --git a/compiler/testData/ir/irText/firProblems/internalPotentialOverride.kt b/compiler/testData/ir/irText/firProblems/internalPotentialOverride.kt new file mode 100644 index 00000000000..fb045ece013 --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/internalPotentialOverride.kt @@ -0,0 +1,14 @@ +// TARGET_BACKEND: JVM_IR +// MODULE: m1 +// FILE: A.kt + +open class A { + internal open fun foo() : Int = 1 +} + +// MODULE: m2(m1) +// FILE: B.kt + +class B : A() { + fun foo() : String = "OK" +} diff --git a/compiler/testData/ir/irText/firProblems/internalPotentialOverride.kt.txt b/compiler/testData/ir/irText/firProblems/internalPotentialOverride.kt.txt new file mode 100644 index 00000000000..57994a2b4d7 --- /dev/null +++ b/compiler/testData/ir/irText/firProblems/internalPotentialOverride.kt.txt @@ -0,0 +1,31 @@ +// MODULE: m1 +// FILE: A.kt + +open class A { + constructor() /* primary */ { + super/*Any*/() + /* () */ + + } + + internal open fun foo(): Int { + return 1 + } + +} + +// MODULE: m2 +// FILE: B.kt + +class B : A { + constructor() /* primary */ { + super/*A*/() + /* () */ + + } + + fun foo(): String { + return "OK" + } + +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 20d94ce08db..a1622c5891b 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -33962,6 +33962,18 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/visibility/lackOfInvisibleSetterOfJavaClassInSamePackage.kt"); } + @Test + @TestMetadata("notOverridingInternal.kt") + public void testNotOverridingInternal() throws Exception { + runTest("compiler/testData/diagnostics/tests/visibility/notOverridingInternal.kt"); + } + + @Test + @TestMetadata("notOverridingPackagePrivate.kt") + public void testNotOverridingPackagePrivate() throws Exception { + runTest("compiler/testData/diagnostics/tests/visibility/notOverridingPackagePrivate.kt"); + } + @Test @TestMetadata("overrideOfMemberInPackagePrivateClass.kt") public void testOverrideOfMemberInPackagePrivateClass() throws Exception { diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java index 85263858561..db12669de6e 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/ir/IrTextTestGenerated.java @@ -2596,6 +2596,12 @@ public class IrTextTestGenerated extends AbstractIrTextTest { runTest("compiler/testData/ir/irText/firProblems/InnerClassInAnonymous.kt"); } + @Test + @TestMetadata("internalPotentialOverride.kt") + public void testInternalPotentialOverride() throws Exception { + runTest("compiler/testData/ir/irText/firProblems/internalPotentialOverride.kt"); + } + @Test @TestMetadata("kt19251.kt") public void testKt19251() throws Exception {