diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated.java index 4ee466ef3eb..1a1a0e1ccb6 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated.java @@ -730,6 +730,12 @@ public class FirOldFrontendMPPDiagnosticsWithLightTreeTestGenerated extends Abst runTest("compiler/testData/diagnostics/tests/multiplatform/java/flexibleTypes.kt"); } + @Test + @TestMetadata("inheritedJavaMembers.kt") + public void testInheritedJavaMembers() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/java/inheritedJavaMembers.kt"); + } + @Test @TestMetadata("parameterNames.kt") public void testParameterNames() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithPsiTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithPsiTestGenerated.java index 6a035574ef4..fc3e526f5d0 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithPsiTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendMPPDiagnosticsWithPsiTestGenerated.java @@ -730,6 +730,12 @@ public class FirOldFrontendMPPDiagnosticsWithPsiTestGenerated extends AbstractFi runTest("compiler/testData/diagnostics/tests/multiplatform/java/flexibleTypes.kt"); } + @Test + @TestMetadata("inheritedJavaMembers.kt") + public void testInheritedJavaMembers() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/java/inheritedJavaMembers.kt"); + } + @Test @TestMetadata("parameterNames.kt") public void testParameterNames() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatchingContext.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatchingContext.kt index f9ae3cc207d..301d9d13492 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatchingContext.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/mpp/FirExpectActualMatchingContext.kt @@ -9,7 +9,10 @@ import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.* +import org.jetbrains.kotlin.fir.declarations.FirDeclarationOrigin +import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.declarations.collectEnumEntries +import org.jetbrains.kotlin.fir.declarations.isAnnotationConstructor import org.jetbrains.kotlin.fir.isSubstitutionOrIntersectionOverride import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor @@ -301,10 +304,5 @@ class FirExpectActualMatchingContext( } override val CallableSymbolMarker.hasStableParameterNames: Boolean - get() = when (asSymbol().origin) { - is FirDeclarationOrigin.Java, - FirDeclarationOrigin.Enhancement, - FirDeclarationOrigin.DynamicScope -> false - else -> true - } + get() = asSymbol().rawStatus.hasStableParameterNames } diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrExpectActualMatchingContext.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrExpectActualMatchingContext.kt index 7434e627ded..bce274388b4 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrExpectActualMatchingContext.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/IrExpectActualMatchingContext.kt @@ -407,11 +407,19 @@ internal abstract class IrExpectActualMatchingContext( } override val CallableSymbolMarker.hasStableParameterNames: Boolean - get() = when (asIr().origin) { - IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB, - IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB, - -> false - else -> true + get() { + var ir = asIr() + + if (ir.isFakeOverride && ir is IrOverridableDeclaration<*>) { + ir.resolveFakeOverrideOrNull()?.let { ir = it } + } + + return when (ir.origin) { + IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB, + IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB, + -> false + else -> true + } } override fun onMatchedMembers(expectSymbol: DeclarationSymbolMarker, actualSymbol: DeclarationSymbolMarker) { diff --git a/compiler/testData/diagnostics/tests/multiplatform/java/inheritedJavaMembers.kt b/compiler/testData/diagnostics/tests/multiplatform/java/inheritedJavaMembers.kt new file mode 100644 index 00000000000..7777c02ce35 --- /dev/null +++ b/compiler/testData/diagnostics/tests/multiplatform/java/inheritedJavaMembers.kt @@ -0,0 +1,76 @@ +// FIR_IDENTICAL +// WITH_STDLIB + +// MODULE: m1-common +// FILE: common.kt + +interface MutableListEx : MutableList { + fun removeRange(fromIndex: Int, toIndex: Int) + fun addAll(elements: FastArrayList): Boolean = addAll(elements as Collection) + fun setAddAll(index: Int, elements: FastArrayList, offset: Int = 0, size: Int = elements.size - offset) {} + fun setAll(index: Int, elements: FastArrayList, offset: Int = 0, size: Int = elements.size - offset) {} + fun addAll(elements: FastArrayList, offset: Int = 0, size: Int = elements.size - offset) {} + fun removeToSize(size: Int) {} +} + +expect class FastArrayList : MutableListEx, RandomAccess { + constructor() + constructor(initialCapacity: Int) + constructor(elements: Collection) + + fun trimToSize() + fun ensureCapacity(minCapacity: Int) + override val size: Int + override fun isEmpty(): Boolean + override fun contains(element: @UnsafeVariance E): Boolean + override fun containsAll(elements: Collection<@UnsafeVariance E>): Boolean + override operator fun get(index: Int): E + override fun indexOf(element: @UnsafeVariance E): Int + override fun lastIndexOf(element: @UnsafeVariance E): Int + override fun iterator(): MutableIterator + override fun add(element: E): Boolean + override fun remove(element: E): Boolean + override fun addAll(elements: Collection): Boolean + override fun addAll(index: Int, elements: Collection): Boolean + override fun removeAll(elements: Collection): Boolean + override fun retainAll(elements: Collection): Boolean + override fun clear() + override operator fun set(index: Int, element: E): E + override fun add(index: Int, element: E) + override fun removeAt(index: Int): E + override fun listIterator(): MutableListIterator + override fun listIterator(index: Int): MutableListIterator + override fun subList(fromIndex: Int, toIndex: Int): MutableList +} + +// MODULE: m2-jvm()()(m1-common) +// FILE: jvm.kt + +public actual open class FastArrayList internal constructor( + var array: Array, + var _size: Int = array.size, + var arrayCapacity: Int = array.size, +) : AbstractMutableList(), MutableListEx, RandomAccess { + public actual constructor() : this(arrayOfNulls(16), 0) {} + public actual constructor(initialCapacity: Int) : this(arrayOfNulls(initialCapacity), 0) {} + public actual constructor(elements: Collection) : this(elements.toTypedArray()) {} + + public actual fun trimToSize() {} + public actual fun ensureCapacity(minCapacity: Int) {} + actual override val size: Int get() = _size + @Suppress("UNCHECKED_CAST") actual override fun get(index: Int): E = array[0] as E + actual override fun set(index: Int, element: E): E = element + actual override fun add(element: E): Boolean = true + actual override fun add(index: Int, element: E) {} + actual override fun addAll(elements: Collection): Boolean = true + actual override fun addAll(index: Int, elements: Collection): Boolean = true + actual override fun remove(element: E): Boolean = true + @Suppress("UNCHECKED_CAST") actual override fun removeAt(index: Int): E = array[0] as E + override fun removeRange(fromIndex: Int, toIndex: Int) {} + override fun setAll(index: Int, elements: FastArrayList, offset: Int, size: Int) {} + override fun addAll(elements: FastArrayList, offset: Int, size: Int) {} + actual override fun clear() {} + actual override fun contains(element: E): Boolean = false + actual override fun indexOf(element: E): Int = -1 + actual override fun lastIndexOf(element: E): Int = -1 +} 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 b190232c120..18560d21b3e 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 @@ -23215,6 +23215,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/multiplatform/java/flexibleTypes.kt"); } + @Test + @TestMetadata("inheritedJavaMembers.kt") + public void testInheritedJavaMembers() throws Exception { + runTest("compiler/testData/diagnostics/tests/multiplatform/java/inheritedJavaMembers.kt"); + } + @Test @TestMetadata("parameterNames.kt") public void testParameterNames() throws Exception {