From 61448531cb994df32fb8d5be78daa4cc0566cf82 Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Mon, 17 Jul 2023 14:50:12 +0300 Subject: [PATCH] [FIR] Support MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES ^KT-59408 Fixed --- .../diagnostics/KtFirDataClassConverters.kt | 14 +++++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 10 ++++ .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 12 ++++ .../diagnostics/FirDiagnosticsList.kt | 7 +++ .../fir/analysis/diagnostics/FirErrors.kt | 2 + .../checkers/CommonDeclarationCheckers.kt | 1 + ...eDefaultsInheritedFromSupertypesChecker.kt | 60 +++++++++++++++++++ .../diagnostics/FirErrorsDefaultMessages.kt | 6 ++ .../testData/codegen/box/bridges/kt46389.kt | 3 +- .../codegen/box/bridges/kt46389_jvmDefault.kt | 3 +- .../box/defaultArguments/function/kt36188.kt | 1 + .../defaultArguments/function/kt36188_2.kt | 1 + .../multipleInheritedDefaults.fir.kt | 4 +- ...ltipleDefaultParametersInSupertypes.fir.kt | 15 ----- .../MultipleDefaultParametersInSupertypes.kt | 1 + ...ultParametersInSupertypesNoOverride.fir.kt | 15 +++++ ...DefaultParametersInSupertypesNoOverride.kt | 1 - ...ultipleDefaultsAndNamesInSupertypes.fir.kt | 2 +- ...aultsInSupertypesNoExplicitOverride.fir.kt | 10 ---- ...eDefaultsInSupertypesNoExplicitOverride.kt | 1 + .../org/jetbrains/kotlin/utils/addToStdlib.kt | 8 +++ 21 files changed, 146 insertions(+), 31 deletions(-) create mode 100644 compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMultipleDefaultsInheritedFromSupertypesChecker.kt delete mode 100644 compiler/testData/diagnostics/tests/override/MultipleDefaultParametersInSupertypes.fir.kt create mode 100644 compiler/testData/diagnostics/tests/override/MultipleDefaultParametersInSupertypesNoOverride.fir.kt delete mode 100644 compiler/testData/diagnostics/tests/override/MultipleDefaultsInSupertypesNoExplicitOverride.fir.kt 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 14f573fb739..dda9b77be01 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 @@ -2502,6 +2502,20 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES) { firDiagnostic -> + MultipleDefaultsInheritedFromSupertypesImpl( + firSymbolBuilder.buildSymbol(firDiagnostic.a), + firDiagnostic as KtPsiDiagnostic, + token, + ) + } + add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE) { firDiagnostic -> + MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideImpl( + firSymbolBuilder.buildSymbol(firDiagnostic.a), + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirErrors.OVERRIDING_FINAL_MEMBER) { firDiagnostic -> OverridingFinalMemberImpl( firSymbolBuilder.callableBuilder.buildCallableSymbol(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 3cefef60688..77cfc014fd3 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 @@ -1778,6 +1778,16 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { val containingClassName: Name } + interface MultipleDefaultsInheritedFromSupertypes : KtFirDiagnostic { + override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypes::class + val valueParameter: KtSymbol + } + + interface MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverride : KtFirDiagnostic { + override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverride::class + val valueParameter: KtSymbol + } + interface OverridingFinalMember : KtFirDiagnostic { override val diagnosticClass get() = OverridingFinalMember::class val overriddenDeclaration: KtCallableSymbol 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 66c39e2616e..a6d058e576e 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 @@ -2136,6 +2136,18 @@ internal class CannotChangeAccessPrivilegeImpl( token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.CannotChangeAccessPrivilege +internal class MultipleDefaultsInheritedFromSupertypesImpl( + override val valueParameter: KtSymbol, + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypes + +internal class MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideImpl( + override val valueParameter: KtSymbol, + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverride + internal class OverridingFinalMemberImpl( override val overriddenDeclaration: KtCallableSymbol, override val containingClassName: Name, diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 226abaa333e..cd3c388a7c3 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -846,6 +846,13 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { parameter("containingClassName") } + val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES by error(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) { + parameter("valueParameter") + } + val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE by error(PositioningStrategy.DECLARATION_NAME) { + parameter("valueParameter") + } + val OVERRIDING_FINAL_MEMBER by error(PositioningStrategy.OVERRIDE_MODIFIER) { parameter>("overriddenDeclaration") parameter("containingClassName") diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index ef602157f21..762fe8785c7 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -475,6 +475,8 @@ object FirErrors { val DATA_CLASS_OVERRIDE_DEFAULT_VALUES by error2, FirClassSymbol<*>>(SourceElementPositioningStrategies.DATA_MODIFIER) val CANNOT_WEAKEN_ACCESS_PRIVILEGE by error3, Name>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) val CANNOT_CHANGE_ACCESS_PRIVILEGE by error3, Name>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) + val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES by error1(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) + val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE by error1(SourceElementPositioningStrategies.DECLARATION_NAME) val OVERRIDING_FINAL_MEMBER by error2, Name>(SourceElementPositioningStrategies.OVERRIDE_MODIFIER) val RETURN_TYPE_MISMATCH_ON_INHERITANCE by error2, FirCallableSymbol<*>>(SourceElementPositioningStrategies.DECLARATION_NAME) val PROPERTY_TYPE_MISMATCH_ON_INHERITANCE by error2, FirCallableSymbol<*>>(SourceElementPositioningStrategies.DECLARATION_NAME) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt index fd0f19515af..b3bbcde4a4d 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonDeclarationCheckers.kt @@ -124,6 +124,7 @@ object CommonDeclarationCheckers : DeclarationCheckers() { FirOuterClassArgumentsRequiredChecker, FirPropertyInitializationChecker, FirDelegateFieldTypeMismatchChecker, + FirMultipleDefaultsInheritedFromSupertypesChecker, ) override val constructorCheckers: Set diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMultipleDefaultsInheritedFromSupertypesChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMultipleDefaultsInheritedFromSupertypesChecker.kt new file mode 100644 index 00000000000..8e430cd513f --- /dev/null +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMultipleDefaultsInheritedFromSupertypesChecker.kt @@ -0,0 +1,60 @@ +/* + * Copyright 2010-2023 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.checkers.declaration + +import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.diagnostics.reportOn +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext +import org.jetbrains.kotlin.fir.analysis.checkers.directOverriddenFunctions +import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors +import org.jetbrains.kotlin.fir.declarations.FirRegularClass +import org.jetbrains.kotlin.fir.isSubstitutionOrIntersectionOverride +import org.jetbrains.kotlin.fir.scopes.processAllFunctions +import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirIntersectionOverrideFunctionSymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol +import org.jetbrains.kotlin.utils.addToStdlib.UnsafeCastFunction +import org.jetbrains.kotlin.utils.addToStdlib.castAll + +object FirMultipleDefaultsInheritedFromSupertypesChecker : FirRegularClassChecker() { + override fun check(declaration: FirRegularClass, context: CheckerContext, reporter: DiagnosticReporter) { + declaration.unsubstitutedScope(context).processAllFunctions { + checkFunction(declaration, it, context, reporter) + } + } + + private fun checkFunction( + declaration: FirRegularClass, + function: FirNamedFunctionSymbol, + context: CheckerContext, + reporter: DiagnosticReporter, + ) { + @OptIn(UnsafeCastFunction::class) + val overriddenFunctions = when (function) { + is FirIntersectionOverrideFunctionSymbol -> function.intersections.castAll>() + else -> function.directOverriddenFunctions(context) + } + + for ((index, parameter) in function.valueParameterSymbols.withIndex()) { + val basesWithDefaultValues = overriddenFunctions.count { it.valueParameterSymbols[index].hasDefaultValue } + + when { + basesWithDefaultValues <= 1 -> { + continue + } + function.isSubstitutionOrIntersectionOverride -> reporter.reportOn( + declaration.source, FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE, + parameter, context, + ) + else -> reporter.reportOn( + parameter.source, FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES, + parameter, context, + ) + } + } + } +} diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt index 5fd6f1ab514..2f6d1d0d36c 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt @@ -351,6 +351,8 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MISSING_VAL_ON_AN import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MODIFIER_FORM_FOR_NON_BUILT_IN_SUSPEND import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MODIFIER_FORM_FOR_NON_BUILT_IN_SUSPEND_FUN import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MULTIPLE_ARGUMENTS_APPLICABLE_FOR_CONTEXT_RECEIVER +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MULTIPLE_VARARG_PARAMETERS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MULTI_FIELD_VALUE_CLASS_PRIMARY_CONSTRUCTOR_DEFAULT_PARAMETER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MUST_BE_INITIALIZED @@ -1429,6 +1431,10 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() { FQ_NAMES_IN_TYPES ) + val multipleDefaultsMessage = "More than one overridden descriptor declares a default value for ''{0}''. As the compiler can not make sure these values agree, this is not allowed." + map.put(MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES, multipleDefaultsMessage, SYMBOL) + map.put(MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE, multipleDefaultsMessage, SYMBOL) + map.put(OVERRIDING_FINAL_MEMBER, "''{0}'' in ''{1}'' is final and cannot be overridden", DECLARATION_NAME, TO_STRING) map.put( diff --git a/compiler/testData/codegen/box/bridges/kt46389.kt b/compiler/testData/codegen/box/bridges/kt46389.kt index c93a0bf7c85..101911b0629 100644 --- a/compiler/testData/codegen/box/bridges/kt46389.kt +++ b/compiler/testData/codegen/box/bridges/kt46389.kt @@ -1,4 +1,5 @@ -// IGNORE_BACKEND: JS, JS_IR, JS_IR_ES6 +// IGNORE_BACKEND_K1: JS, JS_IR, JS_IR_ES6 +// IGNORE_BACKEND_K2: ANY // The code in this test should be prohibited in the frontend, see KT-36188. diff --git a/compiler/testData/codegen/box/bridges/kt46389_jvmDefault.kt b/compiler/testData/codegen/box/bridges/kt46389_jvmDefault.kt index 6cfebf67867..5ba429ef9e1 100644 --- a/compiler/testData/codegen/box/bridges/kt46389_jvmDefault.kt +++ b/compiler/testData/codegen/box/bridges/kt46389_jvmDefault.kt @@ -1,4 +1,5 @@ -// IGNORE_BACKEND: JS, JS_IR, JS_IR_ES6 +// IGNORE_BACKEND_K1: JS, JS_IR, JS_IR_ES6 +// IGNORE_BACKEND_K2: ANY // !JVM_DEFAULT_MODE: all // JVM_TARGET: 1.8 diff --git a/compiler/testData/codegen/box/defaultArguments/function/kt36188.kt b/compiler/testData/codegen/box/defaultArguments/function/kt36188.kt index 5ed4b2a43cf..568f7180f77 100644 --- a/compiler/testData/codegen/box/defaultArguments/function/kt36188.kt +++ b/compiler/testData/codegen/box/defaultArguments/function/kt36188.kt @@ -1,4 +1,5 @@ // IGNORE_BACKEND: JS +// IGNORE_BACKEND_K2: ANY // Test for KT-36188 bug compatibility between non-IR and IR backends diff --git a/compiler/testData/codegen/box/defaultArguments/function/kt36188_2.kt b/compiler/testData/codegen/box/defaultArguments/function/kt36188_2.kt index e0bb2edad07..950be78a89b 100644 --- a/compiler/testData/codegen/box/defaultArguments/function/kt36188_2.kt +++ b/compiler/testData/codegen/box/defaultArguments/function/kt36188_2.kt @@ -1,4 +1,5 @@ // IGNORE_BACKEND: JS +// IGNORE_BACKEND_K2: ANY // Test for KT-36188 bug compatibility between non-IR and IR backends diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/multipleInheritedDefaults.fir.kt b/compiler/testData/diagnostics/tests/annotations/rendering/multipleInheritedDefaults.fir.kt index 646f648ff0b..3d32fe44823 100644 --- a/compiler/testData/diagnostics/tests/annotations/rendering/multipleInheritedDefaults.fir.kt +++ b/compiler/testData/diagnostics/tests/annotations/rendering/multipleInheritedDefaults.fir.kt @@ -17,10 +17,10 @@ interface B { fun foo(@An a: @An Int = @An 2) } -class AB1 : A, B +class AB1 : A, B @An class AB2 : A, B { @An - override fun foo(@An a: @An Int) {} + override fun foo(@An a: @An Int) {} } \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/override/MultipleDefaultParametersInSupertypes.fir.kt b/compiler/testData/diagnostics/tests/override/MultipleDefaultParametersInSupertypes.fir.kt deleted file mode 100644 index 4de8d35e241..00000000000 --- a/compiler/testData/diagnostics/tests/override/MultipleDefaultParametersInSupertypes.fir.kt +++ /dev/null @@ -1,15 +0,0 @@ -interface X { - fun foo(a : Int = 1) -} - -interface Y { - fun foo(a : Int = 1) -} - -class Z : X, Y { - override fun foo(a : Int) {} -} - -object ZO : X, Y { - override fun foo(a : Int) {} -} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/override/MultipleDefaultParametersInSupertypes.kt b/compiler/testData/diagnostics/tests/override/MultipleDefaultParametersInSupertypes.kt index f6aa6986f7c..aabe3c64642 100644 --- a/compiler/testData/diagnostics/tests/override/MultipleDefaultParametersInSupertypes.kt +++ b/compiler/testData/diagnostics/tests/override/MultipleDefaultParametersInSupertypes.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL interface X { fun foo(a : Int = 1) } diff --git a/compiler/testData/diagnostics/tests/override/MultipleDefaultParametersInSupertypesNoOverride.fir.kt b/compiler/testData/diagnostics/tests/override/MultipleDefaultParametersInSupertypesNoOverride.fir.kt new file mode 100644 index 00000000000..f1de2a8d1aa --- /dev/null +++ b/compiler/testData/diagnostics/tests/override/MultipleDefaultParametersInSupertypesNoOverride.fir.kt @@ -0,0 +1,15 @@ +interface X { + fun foo(a : Int = 1) +} + +interface Y { + fun foo(a : Int = 1) +} + +class Z : X, Y { + fun foo(a : Int) {} +} + +object ZO : X, Y { + fun foo(a : Int) {} +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/override/MultipleDefaultParametersInSupertypesNoOverride.kt b/compiler/testData/diagnostics/tests/override/MultipleDefaultParametersInSupertypesNoOverride.kt index fd03fbcc64d..f7160d06304 100644 --- a/compiler/testData/diagnostics/tests/override/MultipleDefaultParametersInSupertypesNoOverride.kt +++ b/compiler/testData/diagnostics/tests/override/MultipleDefaultParametersInSupertypesNoOverride.kt @@ -1,4 +1,3 @@ -// FIR_IDENTICAL interface X { fun foo(a : Int = 1) } diff --git a/compiler/testData/diagnostics/tests/override/MultipleDefaultsAndNamesInSupertypes.fir.kt b/compiler/testData/diagnostics/tests/override/MultipleDefaultsAndNamesInSupertypes.fir.kt index 5a99fa791e6..775e199e75b 100644 --- a/compiler/testData/diagnostics/tests/override/MultipleDefaultsAndNamesInSupertypes.fir.kt +++ b/compiler/testData/diagnostics/tests/override/MultipleDefaultsAndNamesInSupertypes.fir.kt @@ -11,4 +11,4 @@ interface C { } // TODO DIFFERENT_NAMES_FOR_THE_SAME_PARAMETER_IN_SUPERTYPES reported twice -class Z : A, B(), C \ No newline at end of file +class Z : A, B(), C diff --git a/compiler/testData/diagnostics/tests/override/MultipleDefaultsInSupertypesNoExplicitOverride.fir.kt b/compiler/testData/diagnostics/tests/override/MultipleDefaultsInSupertypesNoExplicitOverride.fir.kt deleted file mode 100644 index fb7b2d1e764..00000000000 --- a/compiler/testData/diagnostics/tests/override/MultipleDefaultsInSupertypesNoExplicitOverride.fir.kt +++ /dev/null @@ -1,10 +0,0 @@ -interface X { - fun foo(a : Int = 1) -} - -interface Y { - fun foo(a : Int = 1) -} - -class Z1 : X, Y {} // BUG -object Z1O : X, Y {} // BUG diff --git a/compiler/testData/diagnostics/tests/override/MultipleDefaultsInSupertypesNoExplicitOverride.kt b/compiler/testData/diagnostics/tests/override/MultipleDefaultsInSupertypesNoExplicitOverride.kt index cf5ffb10eeb..29379af071f 100644 --- a/compiler/testData/diagnostics/tests/override/MultipleDefaultsInSupertypesNoExplicitOverride.kt +++ b/compiler/testData/diagnostics/tests/override/MultipleDefaultsInSupertypesNoExplicitOverride.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL interface X { fun foo(a : Int = 1) } diff --git a/core/util.runtime/src/org/jetbrains/kotlin/utils/addToStdlib.kt b/core/util.runtime/src/org/jetbrains/kotlin/utils/addToStdlib.kt index a5de062f2cd..aed5b835743 100644 --- a/core/util.runtime/src/org/jetbrains/kotlin/utils/addToStdlib.kt +++ b/core/util.runtime/src/org/jetbrains/kotlin/utils/addToStdlib.kt @@ -89,6 +89,14 @@ inline fun List<*>.castAll(): List<@kotlin.internal.NoInfer T> { return this as List } +@Suppress("INVISIBLE_REFERENCE", "INVISIBLE_MEMBER") +@UnsafeCastFunction +inline fun Collection<*>.castAll(): Collection<@kotlin.internal.NoInfer T> { + for (element in this) element as T + @Suppress("UNCHECKED_CAST") + return this as Collection +} + fun sequenceOfLazyValues(vararg elements: () -> T): Sequence = elements.asSequence().map { it() } fun Pair.swap(): Pair = Pair(second, first)