From 8755cf75ac4891d770977cce089d7545c9185c3c Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Thu, 14 Sep 2023 14:36:15 +0300 Subject: [PATCH] [FIR] Improve the messages of the multiple defaults diagnostics Mention the base functions where the default values come from. --- .../diagnostics/KtFirDataClassConverters.kt | 36 +++++++++++++++---- .../api/fir/diagnostics/KtFirDiagnostics.kt | 12 +++++++ .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 12 +++++++ .../diagnostics/FirDiagnosticsList.kt | 8 +++++ .../fir/analysis/diagnostics/FirErrors.kt | 8 ++--- ...eDefaultsInheritedFromSupertypesChecker.kt | 25 ++++++++----- .../diagnostics/FirDiagnosticRenderers.kt | 8 +++++ .../diagnostics/FirErrorsDefaultMessages.kt | 25 +++++++++---- ...atformIncompatibilityDiagnosticRenderer.kt | 2 +- .../multipleInheritedDefaults.fir.kt | 4 +-- 10 files changed, 112 insertions(+), 28 deletions(-) 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 2ea0258fce2..bdb9294c6a0 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 @@ -2619,42 +2619,66 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES) { firDiagnostic -> MultipleDefaultsInheritedFromSupertypesImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a), + firDiagnostic.a, + firSymbolBuilder.buildSymbol(firDiagnostic.b), + firDiagnostic.c.map { firCallableSymbol -> + firSymbolBuilder.callableBuilder.buildCallableSymbol(firCallableSymbol) + }, firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE) { firDiagnostic -> MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a), + firDiagnostic.a, + firSymbolBuilder.buildSymbol(firDiagnostic.b), + firDiagnostic.c.map { firCallableSymbol -> + firSymbolBuilder.callableBuilder.buildCallableSymbol(firCallableSymbol) + }, firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION.errorFactory) { firDiagnostic -> MultipleDefaultsInheritedFromSupertypesDeprecationErrorImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a), + firDiagnostic.a, + firSymbolBuilder.buildSymbol(firDiagnostic.b), + firDiagnostic.c.map { firCallableSymbol -> + firSymbolBuilder.callableBuilder.buildCallableSymbol(firCallableSymbol) + }, firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION.warningFactory) { firDiagnostic -> MultipleDefaultsInheritedFromSupertypesDeprecationWarningImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a), + firDiagnostic.a, + firSymbolBuilder.buildSymbol(firDiagnostic.b), + firDiagnostic.c.map { firCallableSymbol -> + firSymbolBuilder.callableBuilder.buildCallableSymbol(firCallableSymbol) + }, firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION.errorFactory) { firDiagnostic -> MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationErrorImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a), + firDiagnostic.a, + firSymbolBuilder.buildSymbol(firDiagnostic.b), + firDiagnostic.c.map { firCallableSymbol -> + firSymbolBuilder.callableBuilder.buildCallableSymbol(firCallableSymbol) + }, firDiagnostic as KtPsiDiagnostic, token, ) } add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION.warningFactory) { firDiagnostic -> MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarningImpl( - firSymbolBuilder.buildSymbol(firDiagnostic.a), + firDiagnostic.a, + firSymbolBuilder.buildSymbol(firDiagnostic.b), + firDiagnostic.c.map { firCallableSymbol -> + firSymbolBuilder.callableBuilder.buildCallableSymbol(firCallableSymbol) + }, firDiagnostic as KtPsiDiagnostic, token, ) 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 8aaf497a932..0cbef14c982 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 @@ -1861,32 +1861,44 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { interface MultipleDefaultsInheritedFromSupertypes : KtFirDiagnostic { override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypes::class + val name: Name val valueParameter: KtSymbol + val baseFunctions: List } interface MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverride : KtFirDiagnostic { override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverride::class + val name: Name val valueParameter: KtSymbol + val baseFunctions: List } interface MultipleDefaultsInheritedFromSupertypesDeprecationError : KtFirDiagnostic { override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesDeprecationError::class + val name: Name val valueParameter: KtSymbol + val baseFunctions: List } interface MultipleDefaultsInheritedFromSupertypesDeprecationWarning : KtFirDiagnostic { override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesDeprecationWarning::class + val name: Name val valueParameter: KtSymbol + val baseFunctions: List } interface MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationError : KtFirDiagnostic { override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationError::class + val name: Name val valueParameter: KtSymbol + val baseFunctions: List } interface MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarning : KtFirDiagnostic { override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarning::class + val name: Name val valueParameter: KtSymbol + val baseFunctions: List } interface TypealiasExpandsToArrayOfNothings : KtFirDiagnostic { 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 8e5dc644a0a..8902c9f91b2 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 @@ -2233,37 +2233,49 @@ internal class CannotChangeAccessPrivilegeImpl( ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.CannotChangeAccessPrivilege internal class MultipleDefaultsInheritedFromSupertypesImpl( + override val name: Name, override val valueParameter: KtSymbol, + override val baseFunctions: List, firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypes internal class MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideImpl( + override val name: Name, override val valueParameter: KtSymbol, + override val baseFunctions: List, firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverride internal class MultipleDefaultsInheritedFromSupertypesDeprecationErrorImpl( + override val name: Name, override val valueParameter: KtSymbol, + override val baseFunctions: List, firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesDeprecationError internal class MultipleDefaultsInheritedFromSupertypesDeprecationWarningImpl( + override val name: Name, override val valueParameter: KtSymbol, + override val baseFunctions: List, firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesDeprecationWarning internal class MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationErrorImpl( + override val name: Name, override val valueParameter: KtSymbol, + override val baseFunctions: List, firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationError internal class MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarningImpl( + override val name: Name, override val valueParameter: KtSymbol, + override val baseFunctions: List, firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarning 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 39a99738273..07c19a6b6d9 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 @@ -890,22 +890,30 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { } val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES by error(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) { + parameter("name") parameter("valueParameter") + parameter>>("baseFunctions") } val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE by error(PositioningStrategy.DECLARATION_NAME) { + parameter("name") parameter("valueParameter") + parameter>>("baseFunctions") } val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION by deprecationError( LanguageFeature.ProhibitAllMultipleDefaultsInheritedFromSupertypes, PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT ) { + parameter("name") parameter("valueParameter") + parameter>>("baseFunctions") } val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION by deprecationError( LanguageFeature.ProhibitAllMultipleDefaultsInheritedFromSupertypes, PositioningStrategy.DECLARATION_NAME ) { + parameter("name") parameter("valueParameter") + parameter>>("baseFunctions") } val TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS by error { 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 4584dab4ac7..c723625ecbe 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 @@ -493,10 +493,10 @@ 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 MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION by deprecationError1(ProhibitAllMultipleDefaultsInheritedFromSupertypes, SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) - val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION by deprecationError1(ProhibitAllMultipleDefaultsInheritedFromSupertypes, SourceElementPositioningStrategies.DECLARATION_NAME) + val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES by error3>>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) + val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE by error3>>(SourceElementPositioningStrategies.DECLARATION_NAME) + val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION by deprecationError3>>(ProhibitAllMultipleDefaultsInheritedFromSupertypes, SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) + val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION by deprecationError3>>(ProhibitAllMultipleDefaultsInheritedFromSupertypes, SourceElementPositioningStrategies.DECLARATION_NAME) val TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS by error1() val OVERRIDING_FINAL_MEMBER by error2, Name>(SourceElementPositioningStrategies.OVERRIDE_MODIFIER) val RETURN_TYPE_MISMATCH_ON_INHERITANCE by error2, FirCallableSymbol<*>>(SourceElementPositioningStrategies.DECLARATION_NAME) 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 index 9723a339d76..57d7f2e567d 100644 --- 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 @@ -20,6 +20,7 @@ import org.jetbrains.kotlin.fir.isSubstitutionOverride import org.jetbrains.kotlin.fir.scopes.processAllFunctions import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol +import org.jetbrains.kotlin.name.Name object FirMultipleDefaultsInheritedFromSupertypesChecker : FirRegularClassChecker() { override fun check(declaration: FirRegularClass, context: CheckerContext, reporter: DiagnosticReporter) { @@ -48,9 +49,9 @@ object FirMultipleDefaultsInheritedFromSupertypesChecker : FirRegularClassChecke val overriddenFunctionsK1WouldConsider = overriddenFunctions.filter { it.containingClassLookupTag() in immediateSupertypes } for ((index, parameter) in function.valueParameterSymbols.withIndex()) { - val basesWithDefaultValues = overriddenFunctions.count { it.valueParameterSymbols[index].hasDefaultValue } + val basesWithDefaultValues = overriddenFunctions.filter { it.valueParameterSymbols[index].hasDefaultValue } - if (basesWithDefaultValues <= 1) { + if (basesWithDefaultValues.size <= 1) { continue } @@ -58,11 +59,15 @@ object FirMultipleDefaultsInheritedFromSupertypesChecker : FirRegularClassChecke when { !isExplicitOverride -> { - reportDiagnosticForImplicitOverride(k1WouldMiss, declaration.source, parameter, context, reporter) + reportDiagnosticForImplicitOverride( + k1WouldMiss, declaration.source, function.name, parameter, basesWithDefaultValues, context, reporter + ) // Avoid duplicates break } - else -> reportDiagnosticForExplicitOverride(k1WouldMiss, parameter, context, reporter) + else -> reportDiagnosticForExplicitOverride( + k1WouldMiss, function.name, parameter, basesWithDefaultValues, context, reporter + ) } } } @@ -70,33 +75,37 @@ object FirMultipleDefaultsInheritedFromSupertypesChecker : FirRegularClassChecke private fun reportDiagnosticForImplicitOverride( k1WouldMiss: Boolean, source: KtSourceElement?, + name: Name, parameter: FirValueParameterSymbol, + basesWithDefaultValues: List, context: CheckerContext, reporter: DiagnosticReporter, ): Unit = when { k1WouldMiss -> reporter.reportOn( source, FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION, - parameter, context, + name, parameter, basesWithDefaultValues, context, ) else -> reporter.reportOn( source, FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE, - parameter, context, + name, parameter, basesWithDefaultValues, context, ) } private fun reportDiagnosticForExplicitOverride( k1WouldMiss: Boolean, + name: Name, parameter: FirValueParameterSymbol, + basesWithDefaultValues: List, context: CheckerContext, reporter: DiagnosticReporter, ): Unit = when { k1WouldMiss -> reporter.reportOn( parameter.source, FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION, - parameter, context, + name, parameter, basesWithDefaultValues, context, ) else -> reporter.reportOn( parameter.source, FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES, - parameter, context, + name, parameter, basesWithDefaultValues, context, ) } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt index ac049ee806e..7cc36bb5ddd 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDiagnosticRenderers.kt @@ -12,6 +12,7 @@ import org.jetbrains.kotlin.diagnostics.WhenMissingCase import org.jetbrains.kotlin.diagnostics.rendering.ContextIndependentParameterRenderer import org.jetbrains.kotlin.diagnostics.rendering.Renderer import org.jetbrains.kotlin.fir.FirModuleData +import org.jetbrains.kotlin.fir.containingClassLookupTag import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.calleeReference @@ -66,6 +67,13 @@ object FirDiagnosticRenderers { } } + val CALLABLES_FQ_NAMES = object : ContextIndependentParameterRenderer>> { + override fun render(obj: Collection>) = "\n" + obj.joinToString("\n") { symbol -> + val origin = symbol.containingClassLookupTag()?.classId?.asFqNameString() + INDENTATION_UNIT + SYMBOL.render(symbol) + origin?.let { ", defined in $it" }.orEmpty() + } + "\n" + } + val RENDER_COLLECTION_OF_TYPES = Renderer { types: Collection -> types.joinToString(separator = ", ") { type -> RENDER_TYPE.render(type) 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 62693a974ee..67e3e2f1ce2 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 @@ -16,12 +16,14 @@ import org.jetbrains.kotlin.diagnostics.KtDiagnosticRenderers.TO_STRING import org.jetbrains.kotlin.diagnostics.KtDiagnosticRenderers.VISIBILITY import org.jetbrains.kotlin.diagnostics.rendering.BaseDiagnosticRendererFactory import org.jetbrains.kotlin.diagnostics.rendering.CommonRenderers.CLASS_KIND +import org.jetbrains.kotlin.diagnostics.rendering.CommonRenderers.NAME import org.jetbrains.kotlin.diagnostics.rendering.CommonRenderers.RENDER_POSITION_VARIANCE import org.jetbrains.kotlin.diagnostics.rendering.CommonRenderers.STRING import org.jetbrains.kotlin.diagnostics.rendering.CommonRenderers.commaSeparated import org.jetbrains.kotlin.diagnostics.rendering.LanguageFeatureMessageRenderer import org.jetbrains.kotlin.diagnostics.rendering.Renderer import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.AMBIGUOUS_CALLS +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.CALLABLES_FQ_NAMES import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.CALLEE_NAME import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.DECLARATION_NAME import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.FOR_OPTIONAL_OPERATOR @@ -1513,28 +1515,37 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() { FQ_NAMES_IN_TYPES ) - val multipleDefaultsMessage = "More than one overridden function declares a default value for ''{0}''." - val multipleDefaultsNotAllowed = " As the compiler can not make sure these values agree, this is not allowed." + val multipleDefaultsMessage = "More than one function overridden by ''{0}'' declares a default value for ''{1}'': {2}" + val multipleDefaultsNotAllowed = "As the compiler can not make sure these values agree, this is not allowed." map.put( MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES, multipleDefaultsMessage + multipleDefaultsNotAllowed, - SYMBOL + NAME, + SYMBOL, + CALLABLES_FQ_NAMES, ) map.put( MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE, multipleDefaultsMessage + multipleDefaultsNotAllowed, - SYMBOL + NAME, + SYMBOL, + CALLABLES_FQ_NAMES, ) - val multipleDefaultsDiscouraged = " As the compiler can not make sure these values agree, this will be prohibited in the Future." + val multipleDefaultsDiscouraged = "As the compiler can not make sure these values agree, this will be prohibited in the future." + + " See: https://youtrack.jetbrains.com/issue/KT-36188" map.put( MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION, multipleDefaultsMessage + multipleDefaultsDiscouraged, - SYMBOL + NAME, + SYMBOL, + CALLABLES_FQ_NAMES, ) map.put( MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION, multipleDefaultsMessage + multipleDefaultsDiscouraged, - SYMBOL + NAME, + SYMBOL, + CALLABLES_FQ_NAMES, ) map.put(TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS, "Type alias expanded to malformed type ''{0}''", RENDER_TYPE) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirPlatformIncompatibilityDiagnosticRenderer.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirPlatformIncompatibilityDiagnosticRenderer.kt index 5928fc852a4..4a0f62a7145 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirPlatformIncompatibilityDiagnosticRenderer.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirPlatformIncompatibilityDiagnosticRenderer.kt @@ -126,4 +126,4 @@ private fun StringBuilder.renderIncompatibleClassScopes( }) } -private const val INDENTATION_UNIT = " " +internal const val INDENTATION_UNIT = " " diff --git a/compiler/testData/diagnostics/tests/annotations/rendering/multipleInheritedDefaults.fir.kt b/compiler/testData/diagnostics/tests/annotations/rendering/multipleInheritedDefaults.fir.kt index 3d32fe44823..d93d39eff90 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