From 7615d863d58bef9035eefc320dddb47a49cf4d79 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 22 Jan 2024 18:41:45 +0100 Subject: [PATCH] K2: add ACCIDENTAL_OVERRIDE_CLASH_BY_JVM_SIGNATURE for clashing functions This diagnostic is reported on an explicitly-declared function which overrides a regular Java function with the same signature as a hidden one from the same scope. #KT-64846 Fixed --- .../diagnostics/KtFirDataClassConverters.kt | 9 +++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 7 +++ .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 8 +++ .../diagnostics/FirJvmDiagnosticsList.kt | 7 +++ .../analysis/diagnostics/jvm/FirJvmErrors.kt | 2 + .../jvm/FirJvmErrorsDefaultMessages.kt | 11 ++++ .../jvm/checkers/JvmDeclarationCheckers.kt | 1 + .../FirAccidentalOverrideClashChecker.kt | 59 +++++++++++++++++++ .../FirNonSuppressibleErrorNames.kt | 1 + .../scopes/JavaClassUseSiteMemberScope.kt | 2 +- .../charAtAndOverload.diag.txt | 1 + .../charAtAndOverload.fir.diag.txt | 2 + .../charAtAndOverload.fir.kt | 3 +- .../collectionOverrides/charAtAndOverload.kt | 1 + .../containsAndOverload.diag.txt | 12 ++++ .../containsAndOverload.fir.diag.txt | 10 ++++ .../containsAndOverload.fir.kt | 3 +- .../containsAndOverload.kt | 1 + .../overridesBuiltinNoMagic.fir.kt | 2 +- 19 files changed, 138 insertions(+), 4 deletions(-) create mode 100644 compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirAccidentalOverrideClashChecker.kt create mode 100644 compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.diag.txt create mode 100644 compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.fir.diag.txt create mode 100644 compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.diag.txt create mode 100644 compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.fir.diag.txt 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 ecb30cc4b26..336eb0ab3f7 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 @@ -5099,6 +5099,15 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirJvmErrors.ACCIDENTAL_OVERRIDE_CLASH_BY_JVM_SIGNATURE) { firDiagnostic -> + AccidentalOverrideClashByJvmSignatureImpl( + firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firDiagnostic.a), + firDiagnostic.b, + firSymbolBuilder.functionLikeBuilder.buildFunctionSymbol(firDiagnostic.c), + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirJvmErrors.JAVA_TYPE_MISMATCH) { firDiagnostic -> JavaTypeMismatchImpl( firSymbolBuilder.typeBuilder.buildKtType(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 944b3c5c14c..198b6d17649 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 @@ -3548,6 +3548,13 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { val base: KtCallableSymbol } + interface AccidentalOverrideClashByJvmSignature : KtFirDiagnostic { + override val diagnosticClass get() = AccidentalOverrideClashByJvmSignature::class + val hidden: KtFunctionLikeSymbol + val overrideDescription: String + val regular: KtFunctionLikeSymbol + } + interface JavaTypeMismatch : KtFirDiagnostic { override val diagnosticClass get() = JavaTypeMismatch::class val expectedType: KtType 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 ad788e53eb8..f8e678e429e 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 @@ -4281,6 +4281,14 @@ internal class WrongNullabilityForJavaOverrideImpl( token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.WrongNullabilityForJavaOverride +internal class AccidentalOverrideClashByJvmSignatureImpl( + override val hidden: KtFunctionLikeSymbol, + override val overrideDescription: String, + override val regular: KtFunctionLikeSymbol, + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.AccidentalOverrideClashByJvmSignature + internal class JavaTypeMismatchImpl( override val expectedType: KtType, override val actualType: KtType, diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt index 85b010e131b..8d84530f501 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirJvmDiagnosticsList.kt @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.psi.KtAnnotationEntry import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.util.PrivateForInline @Suppress("ClassName", "unused") @@ -45,6 +46,12 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") { parameter>("override") parameter>("base") } + + val ACCIDENTAL_OVERRIDE_CLASH_BY_JVM_SIGNATURE by error(PositioningStrategy.DECLARATION_NAME) { + parameter("hidden") + parameter("overrideDescription") + parameter("regular") + } } val TYPES by object : DiagnosticGroup("Types") { diff --git a/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt b/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt index 1fd9745d398..b00f8109ea5 100644 --- a/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt +++ b/compiler/fir/checkers/checkers.jvm/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrors.kt @@ -32,6 +32,7 @@ import org.jetbrains.kotlin.psi.KtAnnotationEntry import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtExpression +import org.jetbrains.kotlin.psi.KtNamedFunction /** * Generated from: [org.jetbrains.kotlin.fir.checkers.generator.diagnostics.JVM_DIAGNOSTICS_LIST] @@ -50,6 +51,7 @@ object FirJvmErrors { val VALUE_CLASS_WITHOUT_JVM_INLINE_ANNOTATION: KtDiagnosticFactory0 by error0() val JVM_INLINE_WITHOUT_VALUE_CLASS: KtDiagnosticFactory0 by error0() val WRONG_NULLABILITY_FOR_JAVA_OVERRIDE: KtDiagnosticFactory2, FirCallableSymbol<*>> by warning2, FirCallableSymbol<*>>(SourceElementPositioningStrategies.OVERRIDE_MODIFIER) + val ACCIDENTAL_OVERRIDE_CLASH_BY_JVM_SIGNATURE: KtDiagnosticFactory3 by error3(SourceElementPositioningStrategies.DECLARATION_NAME) // Types val JAVA_TYPE_MISMATCH: KtDiagnosticFactory2 by error2() diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrorsDefaultMessages.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrorsDefaultMessages.kt index ad8e13a99a8..f1d268690f6 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/diagnostics/jvm/FirJvmErrorsDefaultMessages.kt @@ -12,9 +12,11 @@ import org.jetbrains.kotlin.diagnostics.rendering.BaseDiagnosticRendererFactory import org.jetbrains.kotlin.diagnostics.rendering.CommonRenderers.NAME import org.jetbrains.kotlin.diagnostics.rendering.CommonRenderers.STRING import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.DECLARATION_NAME +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.FQ_NAMES_IN_TYPES import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.OPTIONAL_SENTENCE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.RENDER_TYPE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.SYMBOL +import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.ACCIDENTAL_OVERRIDE_CLASH_BY_JVM_SIGNATURE import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.CONCURRENT_HASH_MAP_CONTAINS_OPERATOR import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.DELEGATION_BY_IN_JVM_RECORD import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.DEPRECATED_JAVA_ANNOTATION @@ -115,6 +117,15 @@ object FirJvmErrorsDefaultMessages : BaseDiagnosticRendererFactory() { SYMBOL, ) + map.put( + ACCIDENTAL_OVERRIDE_CLASH_BY_JVM_SIGNATURE, + "This function accidentally overrides both ''{0}'' and {1} ''{2}'' from JVM point of view because of mixed Java/Kotlin hierarchy.\n" + + "This situation provokes a JVM clash and thus is forbidden. To fix it, you have to delete either this function or one of overridden functions.", + FQ_NAMES_IN_TYPES, + STRING, + FQ_NAMES_IN_TYPES, + ) + map.put( UPPER_BOUND_VIOLATED_BASED_ON_JAVA_ANNOTATIONS, "Type argument is not within its bounds: should be subtype of ''{0}''.", diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmDeclarationCheckers.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmDeclarationCheckers.kt index bf5a9c30569..cb7f38b19de 100644 --- a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmDeclarationCheckers.kt +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/JvmDeclarationCheckers.kt @@ -58,6 +58,7 @@ object JvmDeclarationCheckers : DeclarationCheckers() { override val simpleFunctionCheckers: Set get() = setOf( FirInlineBodySimpleFunctionChecker, + FirAccidentalOverrideClashChecker, ) override val valueParameterCheckers: Set diff --git a/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirAccidentalOverrideClashChecker.kt b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirAccidentalOverrideClashChecker.kt new file mode 100644 index 00000000000..12787fe3425 --- /dev/null +++ b/compiler/fir/checkers/checkers.jvm/src/org/jetbrains/kotlin/fir/analysis/jvm/checkers/declaration/FirAccidentalOverrideClashChecker.kt @@ -0,0 +1,59 @@ +/* + * Copyright 2010-2024 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.fir.analysis.jvm.checkers.declaration + +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.analysis.checkers.MppCheckerKind +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.declaration.FirSimpleFunctionChecker +import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope +import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.ACCIDENTAL_OVERRIDE_CLASH_BY_JVM_SIGNATURE +import org.jetbrains.kotlin.fir.declarations.FirSimpleFunction +import org.jetbrains.kotlin.fir.declarations.isHiddenToOvercomeSignatureClash +import org.jetbrains.kotlin.fir.declarations.utils.isOverride +import org.jetbrains.kotlin.fir.initialSignatureAttr +import org.jetbrains.kotlin.fir.resolve.getContainingClass +import org.jetbrains.kotlin.fir.scopes.jvm.computeJvmDescriptor +import org.jetbrains.kotlin.fir.symbols.SymbolInternals +import org.jetbrains.kotlin.load.java.SpecialGenericSignatures.Companion.JVM_SHORT_NAME_TO_BUILTIN_SHORT_NAMES_MAP +import org.jetbrains.kotlin.load.java.SpecialGenericSignatures.Companion.sameAsBuiltinMethodWithErasedValueParameters + +object FirAccidentalOverrideClashChecker : FirSimpleFunctionChecker(MppCheckerKind.Platform) { + override fun check( + declaration: FirSimpleFunction, + context: CheckerContext, + reporter: DiagnosticReporter, + ) { + if (!declaration.isOverride) return + val name = declaration.name + val mayBeRenamedBuiltIn = name in namesPossibleForRenamedBuiltin + val mayBeSameAsBuiltInWithErasedParameters = name.sameAsBuiltinMethodWithErasedValueParameters + if (!mayBeRenamedBuiltIn && !mayBeSameAsBuiltInWithErasedParameters) return + val containingClass = declaration.getContainingClass(context.session) ?: return + + var reported = false + containingClass.unsubstitutedScope(context).processFunctionsByName(name) { + @OptIn(SymbolInternals::class) + val hiddenFir = it.fir + if (!reported && hiddenFir.isHiddenToOvercomeSignatureClash == true) { + if (declaration.computeJvmDescriptor() == hiddenFir.computeJvmDescriptor()) { + val regularBase = hiddenFir.initialSignatureAttr as? FirSimpleFunction ?: return@processFunctionsByName + val description = when { + mayBeRenamedBuiltIn -> "a renamed function" + else -> "a function with erased parameters" + } + reporter.reportOn( + declaration.source, ACCIDENTAL_OVERRIDE_CLASH_BY_JVM_SIGNATURE, it, description, regularBase.symbol, context + ) + reported = true + } + } + } + } + + private val namesPossibleForRenamedBuiltin = JVM_SHORT_NAME_TO_BUILTIN_SHORT_NAMES_MAP.values.toSet() +} 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 bdb3a4fdd55..a2d3305eb77 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 @@ -589,6 +589,7 @@ val FIR_NON_SUPPRESSIBLE_ERROR_NAMES: Set = setOf( "FUNCTION_DELEGATE_MEMBER_NAME_CLASH", "VALUE_CLASS_WITHOUT_JVM_INLINE_ANNOTATION", "JVM_INLINE_WITHOUT_VALUE_CLASS", + "ACCIDENTAL_OVERRIDE_CLASH_BY_JVM_SIGNATURE", "JAVA_TYPE_MISMATCH", "UPPER_BOUND_CANNOT_BE_ARRAY", "STRICTFP_ON_CLASS", diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt index 4adfd0197a7..05d8ca3fc76 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/scopes/JavaClassUseSiteMemberScope.kt @@ -565,7 +565,7 @@ class JavaClassUseSiteMemberScope( symbol = newSymbol dispatchReceiverType = klass.defaultType() }.apply { - initialSignatureAttr = original + initialSignatureAttr = explicitlyDeclaredFunctionWithErasedValueParameters.fir isHiddenToOvercomeSignatureClash = true } // Collect synthetic function which is a hidden copy of declared one with unerased parameters diff --git a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.diag.txt b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.diag.txt new file mode 100644 index 00000000000..8b137891791 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.diag.txt @@ -0,0 +1 @@ + diff --git a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.fir.diag.txt b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.fir.diag.txt new file mode 100644 index 00000000000..af6beadfe01 --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.fir.diag.txt @@ -0,0 +1,2 @@ +/main.kt:(78,81): error: This function accidentally overrides both 'public open operator fun /A.get(index: kotlin/Int): kotlin/Char' and a renamed function 'public open fun /A.charAt(index: kotlin/Int): kotlin/Char' from JVM point of view because of mixed Java/Kotlin hierarchy. +This situation provokes a JVM clash and thus is forbidden. To fix it, you have to delete either this function or one of overridden functions. diff --git a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.fir.kt b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.fir.kt index 2cd46886406..50c2555ebae 100644 --- a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.fir.kt +++ b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.fir.kt @@ -1,4 +1,5 @@ // SCOPE_DUMP: KA:get +// RENDER_DIAGNOSTICS_FULL_TEXT // FILE: A.java abstract public class A implements CharSequence { @@ -17,7 +18,7 @@ abstract public class A implements CharSequence { // FILE: main.kt abstract class KA : A() { - override fun get(index: Int) = 'O' + override fun get(index: Int) = 'O' } fun foo(a: A, ka: KA) { diff --git a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.kt b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.kt index f09a60506a3..52f80874c88 100644 --- a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.kt +++ b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/charAtAndOverload.kt @@ -1,4 +1,5 @@ // SCOPE_DUMP: KA:get +// RENDER_DIAGNOSTICS_FULL_TEXT // FILE: A.java abstract public class A implements CharSequence { diff --git a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.diag.txt b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.diag.txt new file mode 100644 index 00000000000..dd44ffc25fd --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.diag.txt @@ -0,0 +1,12 @@ +/main.kt:18:16: error: the integer literal does not conform to the expected type String! + a.contains(1) + ^ +/main.kt:20:5: error: the integer literal does not conform to the expected type String! + 1 in a + ^ +/main.kt:23:17: error: the integer literal does not conform to the expected type String + ka.contains(1) + ^ +/main.kt:25:5: error: the integer literal does not conform to the expected type String + 1 in ka + ^ diff --git a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.fir.diag.txt b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.fir.diag.txt new file mode 100644 index 00000000000..f4fab67923d --- /dev/null +++ b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.fir.diag.txt @@ -0,0 +1,10 @@ +/main.kt:(70,78): error: This function accidentally overrides both 'public open operator fun /A.contains(x: kotlin/String!): kotlin/Boolean' and a function with erased parameters 'public open operator fun /A.contains(x: kotlin/Any!): kotlin/Boolean' from JVM point of view because of mixed Java/Kotlin hierarchy. +This situation provokes a JVM clash and thus is forbidden. To fix it, you have to delete either this function or one of overridden functions. + +/main.kt:(159,160): error: Argument type mismatch: actual type is 'kotlin.Int', but 'kotlin.String!' was expected. + +/main.kt:(178,179): error: Argument type mismatch: actual type is 'kotlin.Int', but 'kotlin.String!' was expected. + +/main.kt:(222,223): error: Argument type mismatch: actual type is 'kotlin.Int', but 'kotlin.String' was expected. + +/main.kt:(242,243): error: Argument type mismatch: actual type is 'kotlin.Int', but 'kotlin.String' was expected. diff --git a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.fir.kt b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.fir.kt index d650cc08a82..0ea48eb995d 100644 --- a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.fir.kt +++ b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.fir.kt @@ -1,5 +1,6 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE -PARAMETER_NAME_CHANGED_ON_OVERRIDE // SCOPE_DUMP: KA:contains +// RENDER_DIAGNOSTICS_FULL_TEXT // FILE: A.java abstract public class A implements java.util.Collection { @@ -9,7 +10,7 @@ abstract public class A implements java.util.Collection { // FILE: main.kt abstract class KA : A() { - override fun contains(x: String) = false + override fun contains(x: String) = false } fun foo(a: A, ka: KA) { diff --git a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.kt b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.kt index 6775e7e06f3..c66a3771b3a 100644 --- a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.kt +++ b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/containsAndOverload.kt @@ -1,5 +1,6 @@ // !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_VARIABLE -PARAMETER_NAME_CHANGED_ON_OVERRIDE // SCOPE_DUMP: KA:contains +// RENDER_DIAGNOSTICS_FULL_TEXT // FILE: A.java abstract public class A implements java.util.Collection { diff --git a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/overridesBuiltinNoMagic.fir.kt b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/overridesBuiltinNoMagic.fir.kt index ebaf1e41da5..f461e1c330b 100644 --- a/compiler/testData/diagnostics/tests/j+k/collectionOverrides/overridesBuiltinNoMagic.fir.kt +++ b/compiler/testData/diagnostics/tests/j+k/collectionOverrides/overridesBuiltinNoMagic.fir.kt @@ -146,7 +146,7 @@ public class X implements java.util.List { class Y : X() class Y2 : X() { - override fun removeAt(index: Int) = "" + override fun removeAt(index: Int) = "" } fun main() {