diff --git a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt index fc2f53adcb5..0ce6731e2b4 100644 --- a/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt +++ b/compiler/fir/fir-serialization/src/org/jetbrains/kotlin/fir/serialization/FirElementSerializer.kt @@ -929,7 +929,8 @@ class FirElementSerializer private constructor( return Flags.getAccessorFlags( nonSourceAnnotations.isNotEmpty(), ProtoEnumFlags.visibility(normalizeVisibility(accessor)), - ProtoEnumFlags.modality(accessor.modality!!), + // non-default accessor modality is always final, so we check property.modality instead + ProtoEnumFlags.modality(property.modality!!), !isDefault, accessor.isExternal, accessor.isInline diff --git a/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/DeclarationPrinter.kt b/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/DeclarationPrinter.kt index d420a603660..6ebddfb5f0a 100644 --- a/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/DeclarationPrinter.kt +++ b/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/DeclarationPrinter.kt @@ -79,18 +79,22 @@ class DeclarationPrinter( override fun visitPropertyDescriptor(descriptor: PropertyDescriptor, data: Unit) { printer.printPlain(header = headerRenderer.render(descriptor), signature = signatureRenderer.render(descriptor)) - descriptor.getter?.takeIf { !it.annotations.isEmpty() }?.let { getter -> + descriptor.getter?.takeUnless { canSkipAccessor(it, descriptor) }?.let { getter -> printer.pushIndent() printer.printPlain(header = headerRenderer.render(getter), signature = signatureRenderer.render(getter)) printer.popIndent() } - descriptor.setter?.takeIf { !it.annotations.isEmpty() || it.visibility != descriptor.visibility }?.let { setter -> + descriptor.setter?.takeUnless { canSkipAccessor(it, descriptor) }?.let { setter -> printer.pushIndent() printer.printPlain(header = headerRenderer.render(setter), signature = signatureRenderer.render(setter)) printer.popIndent() } } + private fun canSkipAccessor(accessor: PropertyAccessorDescriptor, property: PropertyDescriptor) : Boolean { + return accessor.annotations.isEmpty() && accessor.visibility == property.visibility && accessor.modality == property.modality + } + override fun visitConstructorDescriptor(descriptor: ConstructorDescriptor, data: Unit) { printer.printPlain(header = headerRenderer.render(descriptor), signature = signatureRenderer.render(descriptor)) } diff --git a/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/DefaultDeclarationHeaderRenderer.kt b/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/DefaultDeclarationHeaderRenderer.kt index efd252eec42..885bf4918e3 100644 --- a/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/DefaultDeclarationHeaderRenderer.kt +++ b/kotlin-native/klib/src/main/kotlin/org/jetbrains/kotlin/cli/klib/DefaultDeclarationHeaderRenderer.kt @@ -48,6 +48,9 @@ object DefaultDeclarationHeaderRenderer : DeclarationHeaderRenderer { if (descriptor.visibility != DescriptorVisibilities.DEFAULT_VISIBILITY) { append(descriptor.visibility.internalDisplayName).append(" ") } + if (descriptor.modality != descriptor.correspondingProperty.modality) { + append(descriptor.modality.name.lowercase()).append(" ") + } when (descriptor) { is PropertyGetterDescriptor -> append("get") is PropertySetterDescriptor -> append("set") diff --git a/native/native.tests/testData/klibContents/property_accessors.kt b/native/native.tests/testData/klibContents/property_accessors.kt new file mode 100644 index 00000000000..36c7e50971b --- /dev/null +++ b/native/native.tests/testData/klibContents/property_accessors.kt @@ -0,0 +1,23 @@ +package test; + +abstract class A { + abstract val a: Int + abstract var b: Int + protected set + val c: Int = TODO() + val d: Int + get() = TODO() + var e: Int + get() = TODO() + set(value) = TODO() + var f: Int = TODO() + private set + open val g: Int = TODO() + open val h: Int + get() = TODO() + open var k: Int + get() = TODO() + set(value) = TODO() + open var l: Int = TODO() + protected set +} \ No newline at end of file diff --git a/native/native.tests/testData/klibContents/property_accessors.txt b/native/native.tests/testData/klibContents/property_accessors.txt new file mode 100644 index 00000000000..0bb7bfddd3f --- /dev/null +++ b/native/native.tests/testData/klibContents/property_accessors.txt @@ -0,0 +1,15 @@ +abstract class A constructor() { + abstract val a: Int + abstract var b: Int + protected set + val c: Int + val d: Int + var e: Int + var f: Int + private set + open val g: Int + open val h: Int + open var k: Int + open var l: Int + protected set + } diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeKLibContentsTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeKLibContentsTestGenerated.java index 747192c25da..ac15bf03c08 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeKLibContentsTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/FirNativeKLibContentsTestGenerated.java @@ -53,6 +53,12 @@ public class FirNativeKLibContentsTestGenerated extends AbstractNativeKlibConten runTest("native/native.tests/testData/klibContents/kt56018_value_parameters_annotations.kt"); } + @Test + @TestMetadata("property_accessors.kt") + public void testProperty_accessors() throws Exception { + runTest("native/native.tests/testData/klibContents/property_accessors.kt"); + } + @Test @TestMetadata("type_annotations.kt") public void testType_annotations() throws Exception { diff --git a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/K1NativeKLibContentsTestGenerated.java b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/K1NativeKLibContentsTestGenerated.java index 4a81f070f7d..5ca29f9bbc8 100644 --- a/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/K1NativeKLibContentsTestGenerated.java +++ b/native/native.tests/tests-gen/org/jetbrains/kotlin/konan/blackboxtest/K1NativeKLibContentsTestGenerated.java @@ -50,6 +50,12 @@ public class K1NativeKLibContentsTestGenerated extends AbstractNativeKlibContent runTest("native/native.tests/testData/klibContents/kt56018_value_parameters_annotations.kt"); } + @Test + @TestMetadata("property_accessors.kt") + public void testProperty_accessors() throws Exception { + runTest("native/native.tests/testData/klibContents/property_accessors.kt"); + } + @Test @TestMetadata("type_annotations.kt") public void testType_annotations() throws Exception { diff --git a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/AbstractNativeKlibContentsTest.kt b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/AbstractNativeKlibContentsTest.kt index 72b84707296..70b74a49795 100644 --- a/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/AbstractNativeKlibContentsTest.kt +++ b/native/native.tests/tests/org/jetbrains/kotlin/konan/blackboxtest/AbstractNativeKlibContentsTest.kt @@ -15,6 +15,7 @@ import org.jetbrains.kotlin.konan.blackboxtest.support.runner.* import org.jetbrains.kotlin.konan.blackboxtest.support.settings.* import org.jetbrains.kotlin.konan.blackboxtest.support.util.* import org.jetbrains.kotlin.test.services.JUnit5Assertions.assertEquals +import org.jetbrains.kotlin.test.services.JUnit5Assertions.assertEqualsToFile import org.junit.jupiter.api.Tag import java.io.File @@ -31,10 +32,7 @@ abstract class AbstractNativeKlibContentsTest : AbstractNativeSimpleTest() { val kotlinNativeClassLoader = testRunSettings.get() val klibContents = testCompilationResult.assertSuccess().resultingArtifact.getContents(kotlinNativeClassLoader.classLoader) val klibContentsFiltered = filterContentsOutput(klibContents, linestoExclude = listOf("package test {", "}", "")) - val expectedContents = File("${testPathFull.canonicalPath.substringBeforeLast(".")}.txt").readText() - assertEquals(StringUtilRt.convertLineSeparators(expectedContents), StringUtilRt.convertLineSeparators(klibContentsFiltered)) { - "Test failed. Compilation result was: $testCompilationResult" - } + assertEqualsToFile(File("${testPathFull.canonicalPath.substringBeforeLast(".")}.txt"), StringUtilRt.convertLineSeparators(klibContentsFiltered)) } private fun generateTestCaseWithSingleSource(source: File, extraArgs: List): TestCase {