From 8f8c7fe7cf6f17c5435653b88ee2c3f608259f5d Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Fri, 19 Jan 2024 12:44:09 +0200 Subject: [PATCH] [FIR] Properly calculate visibilities `testIntersectionOfPrimitiveBasedFunctions` is fine, because we deprecate this already in ^KT-63243. `CANNOT_INFER_VISIBILITY` is positioned as `DECLARATION_NAME`, just in case we decide for some reason that we do want to report it along with `MANY_*_NOT_IMPLEMENTED`. In that case, we'd get a problem that their bounds overlap, but not completely contain one another. ^KT-63741 Fixed ^KT-59400 Fixed --- .../diagnostics/KtFirDataClassConverters.kt | 7 +++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 5 ++ .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 6 +++ ...mplicitTypeInsideAnonymousObject.after.txt | 10 ++-- ...plicitTypeInsideAnonymousObject.before.txt | 10 ++-- ...tTypeInsideAnonymousObjectScript.after.txt | 10 ++-- ...TypeInsideAnonymousObjectScript.before.txt | 10 ++-- ...mplicitTypeInsideAnonymousObject.after.txt | 6 +-- ...plicitTypeInsideAnonymousObject.before.txt | 6 +-- ...tTypeInsideAnonymousObjectScript.after.txt | 6 +-- ...TypeInsideAnonymousObjectScript.before.txt | 6 +-- ...CompilerTestFE10TestdataTestGenerated.java | 12 ++--- ...sticCompilerFE10TestDataTestGenerated.java | 12 ++--- ...eeOldFrontendDiagnosticsTestGenerated.java | 12 ++--- ...siOldFrontendDiagnosticsTestGenerated.java | 12 ++--- .../diagnostics/FirDiagnosticsList.kt | 3 ++ .../fir/analysis/diagnostics/FirErrors.kt | 1 + .../FirNonSuppressibleErrorNames.kt | 1 + .../declaration/FirOverrideChecker.kt | 15 ++++-- .../diagnostics/FirErrorsDefaultMessages.kt | 6 +++ .../impl/FirTypeIntersectionScopeContext.kt | 44 +++++++++++++-- .../kotlin/fir/EffectiveVisibilityUtils.kt | 4 ++ ...ibleTypeAndSubstitution4.fir.overrides.txt | 2 +- .../diagnostics/tests/override/kt2491.fir.kt | 11 ---- .../diagnostics/tests/override/kt2491.kt | 11 ---- .../diagnostics/tests/override/kt2491.txt | 26 --------- .../diagnostics/tests/override/kt4785.fir.kt | 6 ++- .../diagnostics/tests/override/kt4785.kt | 2 + .../diagnostics/tests/phantomIntersections.kt | 14 +++++ .../test/runners/DiagnosticTestGenerated.java | 12 ++--- .../kotlin/descriptors/EffectiveVisibility.kt | 54 +++++++++++++------ 31 files changed, 203 insertions(+), 139 deletions(-) delete mode 100644 compiler/testData/diagnostics/tests/override/kt2491.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/override/kt2491.kt delete mode 100644 compiler/testData/diagnostics/tests/override/kt2491.txt create mode 100644 compiler/testData/diagnostics/tests/phantomIntersections.kt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index a143d387f88..8a03011cb09 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -2718,6 +2718,13 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.CANNOT_INFER_VISIBILITY) { firDiagnostic -> + CannotInferVisibilityImpl( + firSymbolBuilder.callableBuilder.buildCallableSymbol(firDiagnostic.a), + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES) { firDiagnostic -> MultipleDefaultsInheritedFromSupertypesImpl( firDiagnostic.a, diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index c9f2f10abd2..6ab2ae96e79 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -1927,6 +1927,11 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { val containingClassName: Name } + interface CannotInferVisibility : KtFirDiagnostic { + override val diagnosticClass get() = CannotInferVisibility::class + val callable: KtCallableSymbol + } + interface MultipleDefaultsInheritedFromSupertypes : KtFirDiagnostic { override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypes::class val name: Name diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index f01358b1a91..dc6231d8bad 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -2315,6 +2315,12 @@ internal class CannotChangeAccessPrivilegeImpl( token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.CannotChangeAccessPrivilege +internal class CannotInferVisibilityImpl( + override val callable: KtCallableSymbol, + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.CannotInferVisibility + internal class MultipleDefaultsInheritedFromSupertypesImpl( override val name: Name, override val valueParameter: KtSymbol, diff --git a/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithImplicitTypeInsideAnonymousObject.after.txt b/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithImplicitTypeInsideAnonymousObject.after.txt index 0fc08fcf683..b6fe61c032c 100644 --- a/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithImplicitTypeInsideAnonymousObject.after.txt +++ b/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithImplicitTypeInsideAnonymousObject.after.txt @@ -1,10 +1,10 @@ -public open override [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|kotlin/String|): R|kotlin/Unit| { +public? open override [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|kotlin/String|): R|kotlin/Unit| { ^foo Q|kotlin/Unit| } -public open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/B.foo] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|@R|second/Anno|(str = (String(object ), R|second/constant|)) kotlin/String|): R|kotlin/Unit| +public? open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/B.foo] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|@R|second/Anno|(str = (String(object ), R|second/constant|)) kotlin/String|): R|kotlin/Unit| -public open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|T|): R|kotlin/Unit| +public? open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|T|): R|kotlin/Unit| public open override [ResolvedTo(BODY_RESOLVE)] [SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|T|): R|kotlin/Unit| @@ -18,11 +18,11 @@ public open [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|F ^foo Q|kotlin/Unit| } -public open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.bar, SubstitutedOverrideOriginalKey=second/B.bar] var bar: R|@R|second/Anno|(str = (String(object ), R|second/constant|)) kotlin/String| +public? open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.bar, SubstitutedOverrideOriginalKey=second/B.bar] var bar: R|@R|second/Anno|(str = (String(object ), R|second/constant|)) kotlin/String| -public open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.bar, SubstitutedOverrideOriginalKey=second/C.bar] var bar: R|T & Any| +public? open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.bar, SubstitutedOverrideOriginalKey=second/C.bar] var bar: R|T & Any| diff --git a/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithImplicitTypeInsideAnonymousObject.before.txt b/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithImplicitTypeInsideAnonymousObject.before.txt index 188fd0bb600..200f048650a 100644 --- a/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithImplicitTypeInsideAnonymousObject.before.txt +++ b/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithImplicitTypeInsideAnonymousObject.before.txt @@ -1,10 +1,10 @@ -public open override [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|kotlin/String|): R|kotlin/Unit| { +public? open override [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|kotlin/String|): R|kotlin/Unit| { ^foo Q|kotlin/Unit| } -public open override [ResolvedTo(STATUS)] [CallableCopyDeferredReturnTypeCalculationKey=CallableCopySubstitution(substitutor={T -> @R|second/Anno|(str = (String(object ), R|second/constant|)) kotlin/String}, baseSymbol=FirIntersectionOverrideFunctionSymbol second/B.foo), IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/B.foo] fun foo([ResolvedTo(STATUS)] x: R|@R|second/Anno|(str = (String(object ), R|second/constant|)) kotlin/String|): +public? open override [ResolvedTo(STATUS)] [CallableCopyDeferredReturnTypeCalculationKey=CallableCopySubstitution(substitutor={T -> @R|second/Anno|(str = (String(object ), R|second/constant|)) kotlin/String}, baseSymbol=FirIntersectionOverrideFunctionSymbol second/B.foo), IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/B.foo] fun foo([ResolvedTo(STATUS)] x: R|@R|second/Anno|(str = (String(object ), R|second/constant|)) kotlin/String|): -public open override [ResolvedTo(STATUS)] [CallableCopyDeferredReturnTypeCalculationKey=CallableCopyIntersection(mostSpecific=[FirNamedFunctionSymbol second/B.foo, FirNamedFunctionSymbol second/B.foo]), IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(STATUS)] x: R|T|): +public? open override [ResolvedTo(STATUS)] [CallableCopyDeferredReturnTypeCalculationKey=CallableCopyIntersection(mostSpecific=[FirNamedFunctionSymbol second/B.foo, FirNamedFunctionSymbol second/B.foo]), IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(STATUS)] x: R|T|): public open override [ResolvedTo(STATUS)] [CallableCopyDeferredReturnTypeCalculationKey=CallableCopySubstitution(substitutor={T -> T}, baseSymbol=FirNamedFunctionSymbol second/C.foo), SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(STATUS)] x: R|T|): @@ -14,11 +14,11 @@ public open override [ResolvedTo(STATUS)] [CallableCopyDeferredReturnTypeCalcula public open [ResolvedTo(STATUS)] fun foo([ResolvedTo(STATUS)] x: R|F| = LAZY_EXPRESSION): { LAZY_BLOCK } -public open override [ResolvedTo(STATUS)] [CallableCopyDeferredReturnTypeCalculationKey=CallableCopySubstitution(substitutor={T -> @R|second/Anno|(str = (String(object ), R|second/constant|)) kotlin/String}, baseSymbol=FirIntersectionOverridePropertySymbol second/B.bar), IntersectionOverrideOriginalKey=second/B.bar, SubstitutedOverrideOriginalKey=second/B.bar] var bar: +public? open override [ResolvedTo(STATUS)] [CallableCopyDeferredReturnTypeCalculationKey=CallableCopySubstitution(substitutor={T -> @R|second/Anno|(str = (String(object ), R|second/constant|)) kotlin/String}, baseSymbol=FirIntersectionOverridePropertySymbol second/B.bar), IntersectionOverrideOriginalKey=second/B.bar, SubstitutedOverrideOriginalKey=second/B.bar] var bar: -public open override [ResolvedTo(STATUS)] [CallableCopyDeferredReturnTypeCalculationKey=CallableCopyIntersection(mostSpecific=[FirPropertySymbol second/B.bar, FirPropertySymbol second/B.bar]), IntersectionOverrideOriginalKey=second/B.bar, SubstitutedOverrideOriginalKey=second/C.bar] var bar: +public? open override [ResolvedTo(STATUS)] [CallableCopyDeferredReturnTypeCalculationKey=CallableCopyIntersection(mostSpecific=[FirPropertySymbol second/B.bar, FirPropertySymbol second/B.bar]), IntersectionOverrideOriginalKey=second/B.bar, SubstitutedOverrideOriginalKey=second/C.bar] var bar: diff --git a/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithImplicitTypeInsideAnonymousObjectScript.after.txt b/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithImplicitTypeInsideAnonymousObjectScript.after.txt index 0fc08fcf683..b6fe61c032c 100644 --- a/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithImplicitTypeInsideAnonymousObjectScript.after.txt +++ b/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithImplicitTypeInsideAnonymousObjectScript.after.txt @@ -1,10 +1,10 @@ -public open override [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|kotlin/String|): R|kotlin/Unit| { +public? open override [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|kotlin/String|): R|kotlin/Unit| { ^foo Q|kotlin/Unit| } -public open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/B.foo] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|@R|second/Anno|(str = (String(object ), R|second/constant|)) kotlin/String|): R|kotlin/Unit| +public? open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/B.foo] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|@R|second/Anno|(str = (String(object ), R|second/constant|)) kotlin/String|): R|kotlin/Unit| -public open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|T|): R|kotlin/Unit| +public? open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|T|): R|kotlin/Unit| public open override [ResolvedTo(BODY_RESOLVE)] [SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|T|): R|kotlin/Unit| @@ -18,11 +18,11 @@ public open [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|F ^foo Q|kotlin/Unit| } -public open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.bar, SubstitutedOverrideOriginalKey=second/B.bar] var bar: R|@R|second/Anno|(str = (String(object ), R|second/constant|)) kotlin/String| +public? open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.bar, SubstitutedOverrideOriginalKey=second/B.bar] var bar: R|@R|second/Anno|(str = (String(object ), R|second/constant|)) kotlin/String| -public open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.bar, SubstitutedOverrideOriginalKey=second/C.bar] var bar: R|T & Any| +public? open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.bar, SubstitutedOverrideOriginalKey=second/C.bar] var bar: R|T & Any| diff --git a/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithImplicitTypeInsideAnonymousObjectScript.before.txt b/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithImplicitTypeInsideAnonymousObjectScript.before.txt index 188fd0bb600..200f048650a 100644 --- a/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithImplicitTypeInsideAnonymousObjectScript.before.txt +++ b/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithImplicitTypeInsideAnonymousObjectScript.before.txt @@ -1,10 +1,10 @@ -public open override [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|kotlin/String|): R|kotlin/Unit| { +public? open override [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|kotlin/String|): R|kotlin/Unit| { ^foo Q|kotlin/Unit| } -public open override [ResolvedTo(STATUS)] [CallableCopyDeferredReturnTypeCalculationKey=CallableCopySubstitution(substitutor={T -> @R|second/Anno|(str = (String(object ), R|second/constant|)) kotlin/String}, baseSymbol=FirIntersectionOverrideFunctionSymbol second/B.foo), IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/B.foo] fun foo([ResolvedTo(STATUS)] x: R|@R|second/Anno|(str = (String(object ), R|second/constant|)) kotlin/String|): +public? open override [ResolvedTo(STATUS)] [CallableCopyDeferredReturnTypeCalculationKey=CallableCopySubstitution(substitutor={T -> @R|second/Anno|(str = (String(object ), R|second/constant|)) kotlin/String}, baseSymbol=FirIntersectionOverrideFunctionSymbol second/B.foo), IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/B.foo] fun foo([ResolvedTo(STATUS)] x: R|@R|second/Anno|(str = (String(object ), R|second/constant|)) kotlin/String|): -public open override [ResolvedTo(STATUS)] [CallableCopyDeferredReturnTypeCalculationKey=CallableCopyIntersection(mostSpecific=[FirNamedFunctionSymbol second/B.foo, FirNamedFunctionSymbol second/B.foo]), IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(STATUS)] x: R|T|): +public? open override [ResolvedTo(STATUS)] [CallableCopyDeferredReturnTypeCalculationKey=CallableCopyIntersection(mostSpecific=[FirNamedFunctionSymbol second/B.foo, FirNamedFunctionSymbol second/B.foo]), IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(STATUS)] x: R|T|): public open override [ResolvedTo(STATUS)] [CallableCopyDeferredReturnTypeCalculationKey=CallableCopySubstitution(substitutor={T -> T}, baseSymbol=FirNamedFunctionSymbol second/C.foo), SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(STATUS)] x: R|T|): @@ -14,11 +14,11 @@ public open override [ResolvedTo(STATUS)] [CallableCopyDeferredReturnTypeCalcula public open [ResolvedTo(STATUS)] fun foo([ResolvedTo(STATUS)] x: R|F| = LAZY_EXPRESSION): { LAZY_BLOCK } -public open override [ResolvedTo(STATUS)] [CallableCopyDeferredReturnTypeCalculationKey=CallableCopySubstitution(substitutor={T -> @R|second/Anno|(str = (String(object ), R|second/constant|)) kotlin/String}, baseSymbol=FirIntersectionOverridePropertySymbol second/B.bar), IntersectionOverrideOriginalKey=second/B.bar, SubstitutedOverrideOriginalKey=second/B.bar] var bar: +public? open override [ResolvedTo(STATUS)] [CallableCopyDeferredReturnTypeCalculationKey=CallableCopySubstitution(substitutor={T -> @R|second/Anno|(str = (String(object ), R|second/constant|)) kotlin/String}, baseSymbol=FirIntersectionOverridePropertySymbol second/B.bar), IntersectionOverrideOriginalKey=second/B.bar, SubstitutedOverrideOriginalKey=second/B.bar] var bar: -public open override [ResolvedTo(STATUS)] [CallableCopyDeferredReturnTypeCalculationKey=CallableCopyIntersection(mostSpecific=[FirPropertySymbol second/B.bar, FirPropertySymbol second/B.bar]), IntersectionOverrideOriginalKey=second/B.bar, SubstitutedOverrideOriginalKey=second/C.bar] var bar: +public? open override [ResolvedTo(STATUS)] [CallableCopyDeferredReturnTypeCalculationKey=CallableCopyIntersection(mostSpecific=[FirPropertySymbol second/B.bar, FirPropertySymbol second/B.bar]), IntersectionOverrideOriginalKey=second/B.bar, SubstitutedOverrideOriginalKey=second/C.bar] var bar: diff --git a/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithoutImplicitTypeInsideAnonymousObject.after.txt b/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithoutImplicitTypeInsideAnonymousObject.after.txt index 9e741c792b4..c1f95c1f185 100644 --- a/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithoutImplicitTypeInsideAnonymousObject.after.txt +++ b/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithoutImplicitTypeInsideAnonymousObject.after.txt @@ -1,10 +1,10 @@ -public open override [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|kotlin/String|): R|kotlin/Unit| { +public? open override [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|kotlin/String|): R|kotlin/Unit| { ^foo Q|kotlin/Unit| } -public open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/B.foo] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|@R|second/Anno|(str = (String(super ), R|second/constant|)) kotlin/String|): R|kotlin/Unit| +public? open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/B.foo] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|@R|second/Anno|(str = (String(super ), R|second/constant|)) kotlin/String|): R|kotlin/Unit| -public open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|T|): R|kotlin/Unit| +public? open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|T|): R|kotlin/Unit| public open override [ResolvedTo(BODY_RESOLVE)] [SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|T|): R|kotlin/Unit| diff --git a/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithoutImplicitTypeInsideAnonymousObject.before.txt b/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithoutImplicitTypeInsideAnonymousObject.before.txt index e09538f85a3..5678b37624b 100644 --- a/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithoutImplicitTypeInsideAnonymousObject.before.txt +++ b/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithoutImplicitTypeInsideAnonymousObject.before.txt @@ -1,10 +1,10 @@ -public open override [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|kotlin/String|): R|kotlin/Unit| { +public? open override [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|kotlin/String|): R|kotlin/Unit| { ^foo Q|kotlin/Unit| } -public open override [ResolvedTo(STATUS)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/B.foo] fun foo([ResolvedTo(STATUS)] x: R|@R|second/Anno|(str = (String(super ), R|second/constant|)) kotlin/String|): R|kotlin/Unit| +public? open override [ResolvedTo(STATUS)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/B.foo] fun foo([ResolvedTo(STATUS)] x: R|@R|second/Anno|(str = (String(super ), R|second/constant|)) kotlin/String|): R|kotlin/Unit| -public open override [ResolvedTo(STATUS)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(STATUS)] x: R|T|): R|kotlin/Unit| +public? open override [ResolvedTo(STATUS)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(STATUS)] x: R|T|): R|kotlin/Unit| public open override [ResolvedTo(STATUS)] [SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(STATUS)] x: R|T|): R|kotlin/Unit| diff --git a/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithoutImplicitTypeInsideAnonymousObjectScript.after.txt b/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithoutImplicitTypeInsideAnonymousObjectScript.after.txt index 9e741c792b4..c1f95c1f185 100644 --- a/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithoutImplicitTypeInsideAnonymousObjectScript.after.txt +++ b/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithoutImplicitTypeInsideAnonymousObjectScript.after.txt @@ -1,10 +1,10 @@ -public open override [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|kotlin/String|): R|kotlin/Unit| { +public? open override [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|kotlin/String|): R|kotlin/Unit| { ^foo Q|kotlin/Unit| } -public open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/B.foo] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|@R|second/Anno|(str = (String(super ), R|second/constant|)) kotlin/String|): R|kotlin/Unit| +public? open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/B.foo] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|@R|second/Anno|(str = (String(super ), R|second/constant|)) kotlin/String|): R|kotlin/Unit| -public open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|T|): R|kotlin/Unit| +public? open override [ResolvedTo(BODY_RESOLVE)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|T|): R|kotlin/Unit| public open override [ResolvedTo(BODY_RESOLVE)] [SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|T|): R|kotlin/Unit| diff --git a/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithoutImplicitTypeInsideAnonymousObjectScript.before.txt b/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithoutImplicitTypeInsideAnonymousObjectScript.before.txt index e09538f85a3..5678b37624b 100644 --- a/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithoutImplicitTypeInsideAnonymousObjectScript.before.txt +++ b/analysis/low-level-api-fir/testData/lazyResolveScopes/intersectionOverrideWithoutImplicitTypeInsideAnonymousObjectScript.before.txt @@ -1,10 +1,10 @@ -public open override [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|kotlin/String|): R|kotlin/Unit| { +public? open override [ResolvedTo(BODY_RESOLVE)] fun foo([ResolvedTo(BODY_RESOLVE)] x: R|kotlin/String|): R|kotlin/Unit| { ^foo Q|kotlin/Unit| } -public open override [ResolvedTo(STATUS)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/B.foo] fun foo([ResolvedTo(STATUS)] x: R|@R|second/Anno|(str = (String(super ), R|second/constant|)) kotlin/String|): R|kotlin/Unit| +public? open override [ResolvedTo(STATUS)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/B.foo] fun foo([ResolvedTo(STATUS)] x: R|@R|second/Anno|(str = (String(super ), R|second/constant|)) kotlin/String|): R|kotlin/Unit| -public open override [ResolvedTo(STATUS)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(STATUS)] x: R|T|): R|kotlin/Unit| +public? open override [ResolvedTo(STATUS)] [IntersectionOverrideOriginalKey=second/B.foo, SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(STATUS)] x: R|T|): R|kotlin/Unit| public open override [ResolvedTo(STATUS)] [SubstitutedOverrideOriginalKey=second/C.foo] fun foo([ResolvedTo(STATUS)] x: R|T|): R|kotlin/Unit| diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index 42568a2aa66..16dfab6a336 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -1059,6 +1059,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/PackageQualified.kt"); } + @Test + @TestMetadata("phantomIntersections.kt") + public void testPhantomIntersections() throws Exception { + runTest("compiler/testData/diagnostics/tests/phantomIntersections.kt"); + } + @Test @TestMetadata("prefixIncReturnType.kt") public void testPrefixIncReturnType() throws Exception { @@ -28954,12 +28960,6 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/override/kt2052.kt"); } - @Test - @TestMetadata("kt2491.kt") - public void testKt2491() throws Exception { - runTest("compiler/testData/diagnostics/tests/override/kt2491.kt"); - } - @Test @TestMetadata("kt4763.kt") public void testKt4763() throws Exception { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index 20441d54c00..177828dbbd1 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -1059,6 +1059,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/PackageQualified.kt"); } + @Test + @TestMetadata("phantomIntersections.kt") + public void testPhantomIntersections() throws Exception { + runTest("compiler/testData/diagnostics/tests/phantomIntersections.kt"); + } + @Test @TestMetadata("prefixIncReturnType.kt") public void testPrefixIncReturnType() throws Exception { @@ -28954,12 +28960,6 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/override/kt2052.kt"); } - @Test - @TestMetadata("kt2491.kt") - public void testKt2491() throws Exception { - runTest("compiler/testData/diagnostics/tests/override/kt2491.kt"); - } - @Test @TestMetadata("kt4763.kt") public void testKt4763() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index 17da8715e7b..2f4c06adc82 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -1059,6 +1059,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/PackageQualified.kt"); } + @Test + @TestMetadata("phantomIntersections.kt") + public void testPhantomIntersections() throws Exception { + runTest("compiler/testData/diagnostics/tests/phantomIntersections.kt"); + } + @Test @TestMetadata("prefixIncReturnType.kt") public void testPrefixIncReturnType() throws Exception { @@ -26700,12 +26706,6 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/override/kt2052.kt"); } - @Test - @TestMetadata("kt2491.kt") - public void testKt2491() throws Exception { - runTest("compiler/testData/diagnostics/tests/override/kt2491.kt"); - } - @Test @TestMetadata("kt4763.kt") public void testKt4763() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index a3c56f7230c..cdcf72ce4f2 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -1059,6 +1059,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/PackageQualified.kt"); } + @Test + @TestMetadata("phantomIntersections.kt") + public void testPhantomIntersections() throws Exception { + runTest("compiler/testData/diagnostics/tests/phantomIntersections.kt"); + } + @Test @TestMetadata("prefixIncReturnType.kt") public void testPrefixIncReturnType() throws Exception { @@ -26706,12 +26712,6 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/override/kt2052.kt"); } - @Test - @TestMetadata("kt2491.kt") - public void testKt2491() throws Exception { - runTest("compiler/testData/diagnostics/tests/override/kt2491.kt"); - } - @Test @TestMetadata("kt4763.kt") public void testKt4763() throws Exception { diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 0f5539bb75c..0bc795c3ef8 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -926,6 +926,9 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { parameter>("overridden") parameter("containingClassName") } + val CANNOT_INFER_VISIBILITY by error(PositioningStrategy.DECLARATION_NAME) { + parameter>("callable") + } val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES by error(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) { parameter("name") diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 72df3bff39e..653527e9f82 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -517,6 +517,7 @@ object FirErrors { val DATA_CLASS_OVERRIDE_DEFAULT_VALUES: KtDiagnosticFactory2, FirClassSymbol<*>> by error2, FirClassSymbol<*>>(SourceElementPositioningStrategies.DATA_MODIFIER) val CANNOT_WEAKEN_ACCESS_PRIVILEGE: KtDiagnosticFactory3, Name> by error3, Name>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) val CANNOT_CHANGE_ACCESS_PRIVILEGE: KtDiagnosticFactory3, Name> by error3, Name>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) + val CANNOT_INFER_VISIBILITY: KtDiagnosticFactory1> by error1>(SourceElementPositioningStrategies.DECLARATION_NAME) val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES: KtDiagnosticFactory3>> by error3>>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE: KtDiagnosticFactory3>> by error3>>(SourceElementPositioningStrategies.DECLARATION_NAME) val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION: KtDiagnosticFactoryForDeprecation3>> by deprecationError3>>(ProhibitAllMultipleDefaultsInheritedFromSupertypes, SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt index 0cb2cf9b13e..9e9e6d836b5 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirNonSuppressibleErrorNames.kt @@ -335,6 +335,7 @@ val FIR_NON_SUPPRESSIBLE_ERROR_NAMES: Set = setOf( "DATA_CLASS_OVERRIDE_DEFAULT_VALUES", "CANNOT_WEAKEN_ACCESS_PRIVILEGE", "CANNOT_CHANGE_ACCESS_PRIVILEGE", + "CANNOT_INFER_VISIBILITY", "MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES", "MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE", "TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS", diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt index 57a0e54dc9b..668d1c9f3ca 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt @@ -25,10 +25,6 @@ import org.jetbrains.kotlin.fir.declarations.CallToPotentiallyHiddenSymbolResult import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.languageVersionSettings import org.jetbrains.kotlin.fir.originalOrSelf -import org.jetbrains.kotlin.fir.declarations.utils.isFinal -import org.jetbrains.kotlin.fir.declarations.utils.isOverride -import org.jetbrains.kotlin.fir.declarations.utils.modality -import org.jetbrains.kotlin.fir.declarations.utils.visibility import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap import org.jetbrains.kotlin.fir.resolve.toSymbol import org.jetbrains.kotlin.fir.scopes.FirTypeScope @@ -46,7 +42,6 @@ import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.coneType import org.jetbrains.kotlin.fir.types.typeContext import org.jetbrains.kotlin.fir.visibilityChecker -import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.resolve.deprecation.DeprecationLevelValue import org.jetbrains.kotlin.resolve.deprecation.SimpleDeprecationInfo @@ -183,6 +178,16 @@ sealed class FirOverrideChecker(mppKind: MppCheckerKind) : FirAbstractOverrideCh overriddenSymbols: List>, context: CheckerContext ) { + if (visibility == Visibilities.Unknown) { + // MANY_*_NOT_IMPLEMENTED implies CANNOT_INFER_VISIBILITY as per KT-63741 + val isManyNotImplementedDiagnosticReported = overriddenSymbols.count { !it.isAbstract } != 1 + val isSimpleToReasonAboutSituation = overriddenSymbols.none { it.isIntersectionOverride } + if (!(isManyNotImplementedDiagnosticReported && isSimpleToReasonAboutSituation)) { + reporter.reportOn(source, FirErrors.CANNOT_INFER_VISIBILITY, this, context) + } + return + } + if (overriddenSymbols.isEmpty()) return val visibilities = overriddenSymbols.map { it to it.visibility diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt index f773c949ec2..1bed8d6b84b 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt @@ -124,6 +124,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CANNOT_BE_IMPORTE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CANNOT_CHANGE_ACCESS_PRIVILEGE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CANNOT_CHECK_FOR_ERASED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CANNOT_INFER_PARAMETER_TYPE +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CANNOT_INFER_VISIBILITY import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CANNOT_OVERRIDE_INVISIBLE_MEMBER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CANNOT_WEAKEN_ACCESS_PRIVILEGE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.CAN_BE_REPLACED_WITH_OPERATOR_ASSIGNMENT @@ -1652,6 +1653,11 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() { DECLARATION_NAME, TO_STRING ) + map.put( + CANNOT_INFER_VISIBILITY, + "Cannot infer visibility for ''{0}''. Please specify it explicitly", + DECLARATION_NAME, + ) map.put( ABSTRACT_MEMBER_NOT_IMPLEMENTED, diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScopeContext.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScopeContext.kt index fba9607217c..02a794d1faa 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScopeContext.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/scopes/impl/FirTypeIntersectionScopeContext.kt @@ -22,6 +22,7 @@ import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.name.CallableId import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.name.StandardClassIds import org.jetbrains.kotlin.utils.addToStdlib.runIf import kotlin.contracts.ExperimentalContracts import kotlin.contracts.contract @@ -321,17 +322,52 @@ class FirTypeIntersectionScopeContext( private fun > chooseIntersectionVisibility( extractedOverrides: Collection> - ): Visibility { + ): Visibility = chooseIntersectionVisibilityOrNull(extractedOverrides) ?: Visibilities.Unknown + + private fun > chooseIntersectionVisibilityOrNull( + extractedOverrides: Collection> + ): Visibility? { + val overridesWithoutIntersections = extractedOverrides.flatMap { it.flattenIntersectionsRecursively() } + val nonSubsumed = overridesWithoutIntersections.nonSubsumed().filterOutDuplicates() + val nonAbstract = nonSubsumed.filter { + require(it.member.rawStatus is FirResolvedDeclarationStatus) { + "We expect that to be true already, but we can't yet call resolvedStatus" + } + // Kotlin's Cloneable interface contains phantom `protected open fun clone()`. + it.member.rawStatus.modality != Modality.ABSTRACT && it.member.callableId != StandardClassIds.Callables.clone + } + val allAreAbstract = nonAbstract.isEmpty() + + if (allAreAbstract) { + return findMaxVisibilityOrNull(nonSubsumed) + } + + if (nonAbstract.size >= 2) { + return null + } + + return nonAbstract.single().member.rawStatus.visibility + } + + private fun > List>.filterOutDuplicates(): List> { + val uniqueSymbols = mutableSetOf>() + return filter { uniqueSymbols.add(it.member.fir.unwrapSubstitutionOverrides().symbol) } + } + + private fun > findMaxVisibilityOrNull( + extractedOverrides: Collection> + ): Visibility? { var maxVisibility: Visibility = Visibilities.Private + for ((override) in extractedOverrides) { val visibility = (override.fir as FirMemberDeclaration).visibility - // TODO: There is more complex logic at org.jetbrains.kotlin.resolve.OverridingUtil.resolveUnknownVisibilityForMember - // TODO: and org.jetbrains.kotlin.resolve.OverridingUtil.findMaxVisibility - val compare = Visibilities.compare(visibility, maxVisibility) ?: return Visibilities.DEFAULT_VISIBILITY + val compare = Visibilities.compare(visibility, maxVisibility) ?: return null + if (compare > 0) { maxVisibility = visibility } } + return maxVisibility } diff --git a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/EffectiveVisibilityUtils.kt b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/EffectiveVisibilityUtils.kt index b533ef7c79a..ac5ba6bfef7 100644 --- a/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/EffectiveVisibilityUtils.kt +++ b/compiler/fir/semantics/src/org/jetbrains/kotlin/fir/EffectiveVisibilityUtils.kt @@ -37,6 +37,10 @@ fun Visibility.toEffectiveVisibility( } Visibilities.Public -> EffectiveVisibility.Public Visibilities.Local -> EffectiveVisibility.Local + // Unknown visibility should not provoke errors, + // because they can naturally appear when intersection + // overrides' bases have inconsistent forms. + Visibilities.Unknown -> EffectiveVisibility.Unknown else -> errorWithAttachment("Unknown visibility: $this") { withFirLookupTagEntry("owner", owner) } diff --git a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution4.fir.overrides.txt b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution4.fir.overrides.txt index 6d14e6c316c..3e3a4f905ea 100644 --- a/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution4.fir.overrides.txt +++ b/compiler/testData/diagnostics/tests/j+k/primitiveOverrides/triangleWithFlexibleTypeAndSubstitution4.fir.overrides.txt @@ -1,5 +1,5 @@ E: - [IntersectionOverride]: public open override fun foo(x: R|kotlin/Int|): R|kotlin/String| from Use site scope of /E [id: 0] + [IntersectionOverride]: public? open override fun foo(x: R|kotlin/Int|): R|kotlin/String| from Use site scope of /E [id: 0] [SubstitutionOverride(DeclarationSite)]: public open override fun foo(x: R|kotlin/Int!|): R|kotlin/String!| from Use site scope of /C [id: 1] [SubstitutionOverride(DeclarationSite)]: public open override fun foo(x: R|kotlin/Int!|): R|kotlin/String!| from Substitution scope for [Java enhancement scope for /A] for type C [id: 1] [Enhancement]: public open fun foo(x: R|ft|): R|kotlin/String!| from Java enhancement scope for /A [id: 2] diff --git a/compiler/testData/diagnostics/tests/override/kt2491.fir.kt b/compiler/testData/diagnostics/tests/override/kt2491.fir.kt deleted file mode 100644 index 988ed79e63e..00000000000 --- a/compiler/testData/diagnostics/tests/override/kt2491.fir.kt +++ /dev/null @@ -1,11 +0,0 @@ -interface T { - public fun foo() -} - -open class C { - protected fun foo() {} -} - -class D : C(), T - -val obj: C = object : C(), T {} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/override/kt2491.kt b/compiler/testData/diagnostics/tests/override/kt2491.kt deleted file mode 100644 index 6a924bc1985..00000000000 --- a/compiler/testData/diagnostics/tests/override/kt2491.kt +++ /dev/null @@ -1,11 +0,0 @@ -interface T { - public fun foo() -} - -open class C { - protected fun foo() {} -} - -class D : C(), T - -val obj: C = object : C(), T {} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/override/kt2491.txt b/compiler/testData/diagnostics/tests/override/kt2491.txt deleted file mode 100644 index ad967709e99..00000000000 --- a/compiler/testData/diagnostics/tests/override/kt2491.txt +++ /dev/null @@ -1,26 +0,0 @@ -package - -public val obj: C - -public open class C { - public constructor C() - public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - protected final fun foo(): kotlin.Unit - public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int - public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String -} - -public final class D : C, T { - public constructor D() - public open override /*2*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - public final override /*2*/ /*fake_override*/ fun foo(): kotlin.Unit - public open override /*2*/ /*fake_override*/ fun hashCode(): kotlin.Int - public open override /*2*/ /*fake_override*/ fun toString(): kotlin.String -} - -public interface T { - public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean - public abstract fun foo(): kotlin.Unit - public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int - public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String -} diff --git a/compiler/testData/diagnostics/tests/override/kt4785.fir.kt b/compiler/testData/diagnostics/tests/override/kt4785.fir.kt index 7db8c26e68b..4409654a1c9 100644 --- a/compiler/testData/diagnostics/tests/override/kt4785.fir.kt +++ b/compiler/testData/diagnostics/tests/override/kt4785.fir.kt @@ -1,3 +1,5 @@ +// ISSUES: KT-2491, KT-4785, KT-63741, KT-59400 + interface T { fun foo() } @@ -6,6 +8,6 @@ open class C { protected fun foo() {} } -class E : C(), T +class E : C(), T -val z: T = object : C(), T {} +val z: T = object : C(), T {} diff --git a/compiler/testData/diagnostics/tests/override/kt4785.kt b/compiler/testData/diagnostics/tests/override/kt4785.kt index 90eebf90d97..f646af992d0 100644 --- a/compiler/testData/diagnostics/tests/override/kt4785.kt +++ b/compiler/testData/diagnostics/tests/override/kt4785.kt @@ -1,3 +1,5 @@ +// ISSUES: KT-2491, KT-4785, KT-63741, KT-59400 + interface T { fun foo() } diff --git a/compiler/testData/diagnostics/tests/phantomIntersections.kt b/compiler/testData/diagnostics/tests/phantomIntersections.kt new file mode 100644 index 00000000000..ce70260b421 --- /dev/null +++ b/compiler/testData/diagnostics/tests/phantomIntersections.kt @@ -0,0 +1,14 @@ +// FIR_IDENTICAL +// ISSUE: KT-63741 + +interface AreaInstance { + fun getExtensionArea(): Int +} + +interface ComponentManager : AreaInstance { + override fun getExtensionArea() = 10 +} + +interface Project : ComponentManager, AreaInstance + +class MockProject : ComponentManager, Project 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 8792f2bfce3..3bf84500bf3 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 @@ -1059,6 +1059,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/PackageQualified.kt"); } + @Test + @TestMetadata("phantomIntersections.kt") + public void testPhantomIntersections() throws Exception { + runTest("compiler/testData/diagnostics/tests/phantomIntersections.kt"); + } + @Test @TestMetadata("prefixIncReturnType.kt") public void testPrefixIncReturnType() throws Exception { @@ -28954,12 +28960,6 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/override/kt2052.kt"); } - @Test - @TestMetadata("kt2491.kt") - public void testKt2491() throws Exception { - runTest("compiler/testData/diagnostics/tests/override/kt2491.kt"); - } - @Test @TestMetadata("kt4763.kt") public void testKt4763() throws Exception { diff --git a/core/compiler.common/src/org/jetbrains/kotlin/descriptors/EffectiveVisibility.kt b/core/compiler.common/src/org/jetbrains/kotlin/descriptors/EffectiveVisibility.kt index 0110637ccf1..3a86d0658cc 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/descriptors/EffectiveVisibility.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/descriptors/EffectiveVisibility.kt @@ -14,18 +14,18 @@ import org.jetbrains.kotlin.types.model.TypeConstructorMarker sealed class EffectiveVisibility(val name: String, val publicApi: Boolean = false, val privateApi: Boolean = false) { override fun toString() = name - // Public - // /--/ | \-------------\ - // Protected(Base) | \ - // | Protected(Other) Internal = PackagePrivate - // Protected(Derived) | / \ - // | | / InternalProtected(Base) - // ProtectedBound / \ - // \ / /InternalProtected(Derived) - // \InternalProtectedBound/ - // | - // PrivateInFile - // | + // Public Unknown + // /--/ | \-------------\ / + // Protected(Base) | \ / + // | Protected(Other) Internal = PackagePrivate / + // Protected(Derived) | / \ / + // | | / InternalProtected(Base) / + // ProtectedBound / \ / + // \ / /InternalProtected(Derived) / + // \InternalProtectedBound/ / + // | / + // PrivateInFile / + // |--------------------------------------/ // PrivateInClass = Local // Private class (interface) member @@ -44,6 +44,17 @@ sealed class EffectiveVisibility(val name: String, val publicApi: Boolean = fals override fun toVisibility(): Visibility = Visibilities.Local } + // Reflects CANNOT_INFER_VISIBILITY + object Unknown : EffectiveVisibility("unknown") { + override fun relation(other: EffectiveVisibility, typeCheckerContextProvider: TypeCheckerProviderContext): Permissiveness = + if (other == Unknown) + Permissiveness.SAME + else + Permissiveness.UNKNOWN + + override fun toVisibility(): Visibility = Visibilities.Unknown + } + // Private with File container object PrivateInFile : EffectiveVisibility("private-in-file", privateApi = true) { override fun relation(other: EffectiveVisibility, typeCheckerContextProvider: TypeCheckerProviderContext): Permissiveness = @@ -58,7 +69,11 @@ sealed class EffectiveVisibility(val name: String, val publicApi: Boolean = fals object Public : EffectiveVisibility("public", publicApi = true) { override fun relation(other: EffectiveVisibility, typeCheckerContextProvider: TypeCheckerProviderContext): Permissiveness = - if (this == other) Permissiveness.SAME else Permissiveness.MORE + when (other) { + this -> Permissiveness.SAME + Unknown -> Permissiveness.UNKNOWN + else -> Permissiveness.MORE + } override fun toVisibility(): Visibility = Visibilities.Public } @@ -71,7 +86,7 @@ sealed class EffectiveVisibility(val name: String, val publicApi: Boolean = fals Public -> Permissiveness.LESS PrivateInClass, PrivateInFile, Local, InternalProtectedBound, is InternalProtected -> Permissiveness.MORE is InternalOrPackage -> Permissiveness.SAME - ProtectedBound, is Protected -> Permissiveness.UNKNOWN + ProtectedBound, is Protected, Unknown -> Permissiveness.UNKNOWN } override fun lowerBound(other: EffectiveVisibility, typeCheckerContextProvider: TypeCheckerProviderContext): EffectiveVisibility = @@ -79,6 +94,7 @@ sealed class EffectiveVisibility(val name: String, val publicApi: Boolean = fals Public -> this PrivateInClass, PrivateInFile, Local, InternalProtectedBound, is InternalOrPackage, is InternalProtected -> other is Protected -> InternalProtected(other.containerTypeConstructor) + is Unknown -> Local ProtectedBound -> InternalProtectedBound } } @@ -113,7 +129,7 @@ sealed class EffectiveVisibility(val name: String, val publicApi: Boolean = fals Permissiveness.SAME, Permissiveness.MORE -> Permissiveness.MORE Permissiveness.UNKNOWN, Permissiveness.LESS -> Permissiveness.UNKNOWN } - is InternalOrPackage -> Permissiveness.UNKNOWN + is InternalOrPackage, is Unknown -> Permissiveness.UNKNOWN } override fun lowerBound(other: EffectiveVisibility, typeCheckerContextProvider: TypeCheckerProviderContext): EffectiveVisibility = @@ -130,6 +146,7 @@ sealed class EffectiveVisibility(val name: String, val publicApi: Boolean = fals else -> InternalProtectedBound } is InternalOrPackage -> InternalProtected(containerTypeConstructor) + is Unknown -> Local } override fun toVisibility(): Visibility = Visibilities.Protected @@ -142,7 +159,7 @@ sealed class EffectiveVisibility(val name: String, val publicApi: Boolean = fals Public, is Protected -> Permissiveness.LESS PrivateInClass, PrivateInFile, Local, InternalProtectedBound -> Permissiveness.MORE ProtectedBound -> Permissiveness.SAME - is InternalOrPackage, is InternalProtected -> Permissiveness.UNKNOWN + is InternalOrPackage, is InternalProtected, is Unknown -> Permissiveness.UNKNOWN } override fun lowerBound(other: EffectiveVisibility, typeCheckerContextProvider: TypeCheckerProviderContext): EffectiveVisibility = @@ -150,6 +167,7 @@ sealed class EffectiveVisibility(val name: String, val publicApi: Boolean = fals Public, is Protected -> this PrivateInClass, PrivateInFile, Local, ProtectedBound, InternalProtectedBound -> other is InternalOrPackage, is InternalProtected -> InternalProtectedBound + is Unknown -> Local } override fun toVisibility(): Visibility = Visibilities.Protected @@ -184,7 +202,7 @@ sealed class EffectiveVisibility(val name: String, val publicApi: Boolean = fals Permissiveness.SAME, Permissiveness.LESS -> Permissiveness.LESS Permissiveness.UNKNOWN, Permissiveness.MORE -> Permissiveness.UNKNOWN } - ProtectedBound -> Permissiveness.UNKNOWN + ProtectedBound, Unknown -> Permissiveness.UNKNOWN } override fun lowerBound(other: EffectiveVisibility, typeCheckerContextProvider: TypeCheckerProviderContext): EffectiveVisibility = @@ -197,6 +215,7 @@ sealed class EffectiveVisibility(val name: String, val publicApi: Boolean = fals Permissiveness.UNKNOWN -> InternalProtectedBound } ProtectedBound -> InternalProtectedBound + Unknown -> Local } override fun toVisibility(): Visibility = Visibilities.Private @@ -209,6 +228,7 @@ sealed class EffectiveVisibility(val name: String, val publicApi: Boolean = fals Public, is Protected, is InternalProtected, ProtectedBound, is InternalOrPackage -> Permissiveness.LESS PrivateInClass, PrivateInFile, Local -> Permissiveness.MORE InternalProtectedBound -> Permissiveness.SAME + Unknown -> Permissiveness.UNKNOWN } override fun toVisibility(): Visibility = Visibilities.Private