From 81e0abeb8f6605fd31574f80ca08bbb882c37303 Mon Sep 17 00:00:00 2001 From: Kirill Rakhman Date: Thu, 15 Feb 2024 11:12:45 +0100 Subject: [PATCH] [FIR] Fix mapped constructor hiding logic Partially reverts 24367e0ad8db01532c0d02fcb5ff08f1b699217a Constructors have their own list of hidden/visible. We now require the constructor to be in VISIBLE_CONSTRUCTOR_SIGNATURES, everything else is hidden. This makes it unnecessary to check HIDDEN_CONSTRUCTOR_SIGNATURES #KT-65821 Fixed --- ...CompilerTestFE10TestdataTestGenerated.java | 6 +++++ ...sticCompilerFE10TestDataTestGenerated.java | 6 +++++ ...eeOldFrontendDiagnosticsTestGenerated.java | 6 +++++ ...siOldFrontendDiagnosticsTestGenerated.java | 6 +++++ .../kotlin/fir/scopes/jvm/JvmMappedScope.kt | 22 ++++++------------- .../fir/resolve/calls/ResolutionStages.kt | 2 +- .../tests/j+k/throwableConstructor.kt | 18 +++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 +++++ 8 files changed, 56 insertions(+), 16 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/j+k/throwableConstructor.kt 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 a174a177cde..3955f3c2b71 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 @@ -22560,6 +22560,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/j+k/syntheticPropertyOverridden2.kt"); } + @Test + @TestMetadata("throwableConstructor.kt") + public void testThrowableConstructor() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/throwableConstructor.kt"); + } + @Test @TestMetadata("traitDefaultCall.kt") public void testTraitDefaultCall() 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 5bffcd47001..d9288d5a53c 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 @@ -22560,6 +22560,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/j+k/syntheticPropertyOverridden2.kt"); } + @Test + @TestMetadata("throwableConstructor.kt") + public void testThrowableConstructor() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/throwableConstructor.kt"); + } + @Test @TestMetadata("traitDefaultCall.kt") public void testTraitDefaultCall() 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 329b4a4d7ba..0f4b876d9e7 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 @@ -22554,6 +22554,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/j+k/syntheticPropertyOverridden2.kt"); } + @Test + @TestMetadata("throwableConstructor.kt") + public void testThrowableConstructor() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/throwableConstructor.kt"); + } + @Test @TestMetadata("traitDefaultCall.kt") public void testTraitDefaultCall() 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 14e338d9f13..9828c0331b8 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 @@ -22560,6 +22560,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/j+k/syntheticPropertyOverridden2.kt"); } + @Test + @TestMetadata("throwableConstructor.kt") + public void testThrowableConstructor() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/throwableConstructor.kt"); + } + @Test @TestMetadata("traitDefaultCall.kt") public void testTraitDefaultCall() throws Exception { diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt index 37ecc1ada04..146c54d7f50 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/scopes/jvm/JvmMappedScope.kt @@ -334,17 +334,11 @@ class JvmMappedScope( if (!javaCtor.status.visibility.isPublicAPI || javaCtor.isDeprecated()) return@processor val signature = SignatureBuildingComponents.signature(firJavaClass.classId, javaCtor.computeJvmDescriptor()) - if (signature in JvmBuiltInsSignatures.HIDDEN_CONSTRUCTOR_SIGNATURES) return@processor + if (signature !in JvmBuiltInsSignatures.VISIBLE_CONSTRUCTOR_SIGNATURES) return@processor if (javaCtor.isTrivialCopyConstructor()) return@processor if (firKotlinClassConstructors.any { javaCtor.isShadowedBy(it) }) return@processor - val jvmDescriptor = javaCtorSymbol.fir.computeJvmDescriptor() - val jdkMemberStatus = getJdkMethodStatus(jvmDescriptor) - - if (jdkMemberStatus == JDKMemberStatus.DROP) return@processor - - val newSymbol = mappedSymbolCache.mappedConstructors.getValue(javaCtorSymbol, this to jdkMemberStatus) - + val newSymbol = mappedSymbolCache.mappedConstructors.getValue(javaCtorSymbol, this) processor(newSymbol) } @@ -353,7 +347,7 @@ class JvmMappedScope( private fun FirDeclaration.isDeprecated(): Boolean = symbol.getDeprecation(session, callSite = null) != null - private fun createMappedConstructor(symbol: FirConstructorSymbol, jdkMemberStatus: JDKMemberStatus): FirConstructorSymbol { + private fun createMappedConstructor(symbol: FirConstructorSymbol): FirConstructorSymbol { val oldConstructor = symbol.fir val classId = firKotlinClass.classId val newSymbol = FirConstructorSymbol(CallableId(classId, classId.shortClassName)) @@ -371,9 +365,7 @@ class JvmMappedScope( isExpect = false, deferredReturnTypeCalculation = null, newSource = oldConstructor.source, - ).apply { - setHiddenAttributeIfNecessary(jdkMemberStatus) - } + ) return newSymbol } @@ -410,9 +402,9 @@ class JvmMappedScope( scope.createHiddenFakeFunction(name) } - val mappedConstructors: FirCache> = - cachesFactory.createCache { symbol, (scope, jdkMemberStatus) -> - scope.createMappedConstructor(symbol, jdkMemberStatus) + val mappedConstructors: FirCache = + cachesFactory.createCache { symbol, scope -> + scope.createMappedConstructor(symbol) } } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt index 1df518a25d2..cd15f15ef8c 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionStages.kt @@ -774,9 +774,9 @@ internal object CheckHiddenDeclaration : ResolutionStage() { sink.reportDiagnostic(CallToDeprecatedOverrideOfHidden) } + if (symbol.fir.dispatchReceiverType == null || symbol !is FirNamedFunctionSymbol) return false val isSuperCall = callInfo.callSite.isSuperCall(session) if (symbol.hiddenStatusOfCall(isSuperCall, isCallToOverride = false) == CallToPotentiallyHiddenSymbolResult.Hidden) return true - if (symbol.fir.dispatchReceiverType == null || symbol !is FirNamedFunctionSymbol) return false val scope = candidate.originScope as? FirTypeScope ?: return false diff --git a/compiler/testData/diagnostics/tests/j+k/throwableConstructor.kt b/compiler/testData/diagnostics/tests/j+k/throwableConstructor.kt new file mode 100644 index 00000000000..bf4e80b00d0 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/throwableConstructor.kt @@ -0,0 +1,18 @@ +// FIR_IDENTICAL +// FULL_JDK + +class A : Throwable { + constructor(message: String?, cause: Throwable?) : super(message, cause) + constructor(message: String?) : super(message) + constructor(cause: Throwable?) : super(cause) + constructor() : super() + constructor(message: String?, cause: Throwable?, enableSuppression: Boolean, writableStackTrace: Boolean) + : super(message, cause, enableSuppression, writableStackTrace) +} + +fun foo() { + Throwable("") + Throwable(Exception()) + Throwable() + Throwable("", Exception()) +} 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 2f6b1bc4dae..3c4f96eb905 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 @@ -22560,6 +22560,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/j+k/syntheticPropertyOverridden2.kt"); } + @Test + @TestMetadata("throwableConstructor.kt") + public void testThrowableConstructor() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/throwableConstructor.kt"); + } + @Test @TestMetadata("traitDefaultCall.kt") public void testTraitDefaultCall() throws Exception {