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 c2c6cff3312..2ff116feed1 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 @@ -20213,6 +20213,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/j+k/properties/staticFieldPropertyOverloads.kt"); } + @Test + @TestMetadata("unitVsVoid.kt") + public void testUnitVsVoid() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/properties/unitVsVoid.kt"); + } + @Test @TestMetadata("val.kt") public void testVal() 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 e9114c2ae6c..dd084eef7eb 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 @@ -20213,6 +20213,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/j+k/properties/staticFieldPropertyOverloads.kt"); } + @Test + @TestMetadata("unitVsVoid.kt") + public void testUnitVsVoid() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/properties/unitVsVoid.kt"); + } + @Test @TestMetadata("val.kt") public void testVal() 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 f7578886639..3a740771734 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 @@ -20213,6 +20213,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/j+k/properties/staticFieldPropertyOverloads.kt"); } + @Test + @TestMetadata("unitVsVoid.kt") + public void testUnitVsVoid() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/properties/unitVsVoid.kt"); + } + @Test @TestMetadata("val.kt") public void testVal() 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 8c1555d842b..0edecfda077 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 @@ -20219,6 +20219,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/j+k/properties/staticFieldPropertyOverloads.kt"); } + @Test + @TestMetadata("unitVsVoid.kt") + public void testUnitVsVoid() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/properties/unitVsVoid.kt"); + } + @Test @TestMetadata("val.kt") public void testVal() throws Exception { diff --git a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt index 362db411e7b..af98d2016bd 100644 --- a/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt +++ b/compiler/fir/providers/src/org/jetbrains/kotlin/fir/resolve/calls/Synthetics.kt @@ -6,18 +6,21 @@ package org.jetbrains.kotlin.fir.resolve.calls import org.jetbrains.kotlin.fir.* -import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin +import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction +import org.jetbrains.kotlin.fir.declarations.getDeprecationsProviderFromAccessors import org.jetbrains.kotlin.fir.declarations.synthetic.FirSyntheticProperty import org.jetbrains.kotlin.fir.declarations.synthetic.buildSyntheticProperty import org.jetbrains.kotlin.fir.declarations.utils.isStatic import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator import org.jetbrains.kotlin.fir.scopes.* import org.jetbrains.kotlin.fir.symbols.SyntheticSymbol -import org.jetbrains.kotlin.fir.symbols.impl.* +import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol 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.types.AbstractTypeChecker /** @@ -116,7 +119,9 @@ class FirSyntheticPropertiesScope private constructor( getterReturnType = returnTypeCalculator?.tryCalculateReturnTypeOrNull(getter)?.type?.takeUnless { it is ConeErrorType } } - if ((getterReturnType as? ConeClassLikeType)?.lookupTag?.classId == StandardClassIds.Unit) return + // `void` type is the only case when we've got not-nullable non-enhanced Unit from Java + // And it doesn't make sense to make a synthetic property for `void` typed getters + if (getterReturnType?.isUnit == true && CompilerConeAttributes.EnhancedNullability !in getterReturnType.attributes) return if (!getterSymbol.hasJavaOverridden()) return diff --git a/compiler/testData/diagnostics/tests/j+k/properties/unitVsVoid.fir.kt b/compiler/testData/diagnostics/tests/j+k/properties/unitVsVoid.fir.kt new file mode 100644 index 00000000000..65e727822c2 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/properties/unitVsVoid.fir.kt @@ -0,0 +1,44 @@ +// ISSUE: KT-57979 + +// FILE: J.java +import org.jetbrains.annotations.*; + +public class J { + @Nullable + public T getValue1() { + return null; + } + + public void setValue1(T value) { + } + + @NotNull + public T getValue2() { + return null; + } + + public void setValue2(T value) { + } + + public T getValue3() { + return null; + } + + public void setValue3(T value) { + } +} +// FILE: main.kt + +fun test(j: J) { + j.value1 = Unit + j.value2 = Unit + j.value3 = Unit + + j.value1 = null + j.value2 = null + j.value3 = null + + j.value1 + j.value2 + j.value3 +} diff --git a/compiler/testData/diagnostics/tests/j+k/properties/unitVsVoid.kt b/compiler/testData/diagnostics/tests/j+k/properties/unitVsVoid.kt new file mode 100644 index 00000000000..6619d7e464b --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/properties/unitVsVoid.kt @@ -0,0 +1,44 @@ +// ISSUE: KT-57979 + +// FILE: J.java +import org.jetbrains.annotations.*; + +public class J { + @Nullable + public T getValue1() { + return null; + } + + public void setValue1(T value) { + } + + @NotNull + public T getValue2() { + return null; + } + + public void setValue2(T value) { + } + + public T getValue3() { + return null; + } + + public void setValue3(T value) { + } +} +// FILE: main.kt + +fun test(j: J) { + j.value1 = Unit + j.value2 = Unit + j.value3 = Unit + + j.value1 = null + j.value2 = null + j.value3 = null + + j.value1 + j.value2 + j.value3 +} 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 91e9e6fadc5..8e089d3df89 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 @@ -20219,6 +20219,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/j+k/properties/staticFieldPropertyOverloads.kt"); } + @Test + @TestMetadata("unitVsVoid.kt") + public void testUnitVsVoid() throws Exception { + runTest("compiler/testData/diagnostics/tests/j+k/properties/unitVsVoid.kt"); + } + @Test @TestMetadata("val.kt") public void testVal() throws Exception {