[FIR] Improve the messages of the multiple defaults diagnostics

Mention the base functions where the default
values come from.
This commit is contained in:
Nikolay Lunyak
2023-09-14 14:36:15 +03:00
committed by Space Team
parent 4e1dfcd2a8
commit 8755cf75ac
10 changed files with 112 additions and 28 deletions
@@ -2619,42 +2619,66 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
} }
add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES) { firDiagnostic -> add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES) { firDiagnostic ->
MultipleDefaultsInheritedFromSupertypesImpl( MultipleDefaultsInheritedFromSupertypesImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic.a,
firSymbolBuilder.buildSymbol(firDiagnostic.b),
firDiagnostic.c.map { firCallableSymbol ->
firSymbolBuilder.callableBuilder.buildCallableSymbol(firCallableSymbol)
},
firDiagnostic as KtPsiDiagnostic, firDiagnostic as KtPsiDiagnostic,
token, token,
) )
} }
add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE) { firDiagnostic -> add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE) { firDiagnostic ->
MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideImpl( MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic.a,
firSymbolBuilder.buildSymbol(firDiagnostic.b),
firDiagnostic.c.map { firCallableSymbol ->
firSymbolBuilder.callableBuilder.buildCallableSymbol(firCallableSymbol)
},
firDiagnostic as KtPsiDiagnostic, firDiagnostic as KtPsiDiagnostic,
token, token,
) )
} }
add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION.errorFactory) { firDiagnostic -> add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION.errorFactory) { firDiagnostic ->
MultipleDefaultsInheritedFromSupertypesDeprecationErrorImpl( MultipleDefaultsInheritedFromSupertypesDeprecationErrorImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic.a,
firSymbolBuilder.buildSymbol(firDiagnostic.b),
firDiagnostic.c.map { firCallableSymbol ->
firSymbolBuilder.callableBuilder.buildCallableSymbol(firCallableSymbol)
},
firDiagnostic as KtPsiDiagnostic, firDiagnostic as KtPsiDiagnostic,
token, token,
) )
} }
add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION.warningFactory) { firDiagnostic -> add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION.warningFactory) { firDiagnostic ->
MultipleDefaultsInheritedFromSupertypesDeprecationWarningImpl( MultipleDefaultsInheritedFromSupertypesDeprecationWarningImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic.a,
firSymbolBuilder.buildSymbol(firDiagnostic.b),
firDiagnostic.c.map { firCallableSymbol ->
firSymbolBuilder.callableBuilder.buildCallableSymbol(firCallableSymbol)
},
firDiagnostic as KtPsiDiagnostic, firDiagnostic as KtPsiDiagnostic,
token, token,
) )
} }
add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION.errorFactory) { firDiagnostic -> add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION.errorFactory) { firDiagnostic ->
MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationErrorImpl( MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationErrorImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic.a,
firSymbolBuilder.buildSymbol(firDiagnostic.b),
firDiagnostic.c.map { firCallableSymbol ->
firSymbolBuilder.callableBuilder.buildCallableSymbol(firCallableSymbol)
},
firDiagnostic as KtPsiDiagnostic, firDiagnostic as KtPsiDiagnostic,
token, token,
) )
} }
add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION.warningFactory) { firDiagnostic -> add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION.warningFactory) { firDiagnostic ->
MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarningImpl( MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarningImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a), firDiagnostic.a,
firSymbolBuilder.buildSymbol(firDiagnostic.b),
firDiagnostic.c.map { firCallableSymbol ->
firSymbolBuilder.callableBuilder.buildCallableSymbol(firCallableSymbol)
},
firDiagnostic as KtPsiDiagnostic, firDiagnostic as KtPsiDiagnostic,
token, token,
) )
@@ -1861,32 +1861,44 @@ sealed interface KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
interface MultipleDefaultsInheritedFromSupertypes : KtFirDiagnostic<KtElement> { interface MultipleDefaultsInheritedFromSupertypes : KtFirDiagnostic<KtElement> {
override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypes::class override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypes::class
val name: Name
val valueParameter: KtSymbol val valueParameter: KtSymbol
val baseFunctions: List<KtCallableSymbol>
} }
interface MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverride : KtFirDiagnostic<KtElement> { interface MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverride : KtFirDiagnostic<KtElement> {
override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverride::class override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverride::class
val name: Name
val valueParameter: KtSymbol val valueParameter: KtSymbol
val baseFunctions: List<KtCallableSymbol>
} }
interface MultipleDefaultsInheritedFromSupertypesDeprecationError : KtFirDiagnostic<KtElement> { interface MultipleDefaultsInheritedFromSupertypesDeprecationError : KtFirDiagnostic<KtElement> {
override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesDeprecationError::class override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesDeprecationError::class
val name: Name
val valueParameter: KtSymbol val valueParameter: KtSymbol
val baseFunctions: List<KtCallableSymbol>
} }
interface MultipleDefaultsInheritedFromSupertypesDeprecationWarning : KtFirDiagnostic<KtElement> { interface MultipleDefaultsInheritedFromSupertypesDeprecationWarning : KtFirDiagnostic<KtElement> {
override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesDeprecationWarning::class override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesDeprecationWarning::class
val name: Name
val valueParameter: KtSymbol val valueParameter: KtSymbol
val baseFunctions: List<KtCallableSymbol>
} }
interface MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationError : KtFirDiagnostic<KtElement> { interface MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationError : KtFirDiagnostic<KtElement> {
override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationError::class override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationError::class
val name: Name
val valueParameter: KtSymbol val valueParameter: KtSymbol
val baseFunctions: List<KtCallableSymbol>
} }
interface MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarning : KtFirDiagnostic<KtElement> { interface MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarning : KtFirDiagnostic<KtElement> {
override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarning::class override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarning::class
val name: Name
val valueParameter: KtSymbol val valueParameter: KtSymbol
val baseFunctions: List<KtCallableSymbol>
} }
interface TypealiasExpandsToArrayOfNothings : KtFirDiagnostic<KtElement> { interface TypealiasExpandsToArrayOfNothings : KtFirDiagnostic<KtElement> {
@@ -2233,37 +2233,49 @@ internal class CannotChangeAccessPrivilegeImpl(
) : KtAbstractFirDiagnostic<KtModifierListOwner>(firDiagnostic, token), KtFirDiagnostic.CannotChangeAccessPrivilege ) : KtAbstractFirDiagnostic<KtModifierListOwner>(firDiagnostic, token), KtFirDiagnostic.CannotChangeAccessPrivilege
internal class MultipleDefaultsInheritedFromSupertypesImpl( internal class MultipleDefaultsInheritedFromSupertypesImpl(
override val name: Name,
override val valueParameter: KtSymbol, override val valueParameter: KtSymbol,
override val baseFunctions: List<KtCallableSymbol>,
firDiagnostic: KtPsiDiagnostic, firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken, token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypes ) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypes
internal class MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideImpl( internal class MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideImpl(
override val name: Name,
override val valueParameter: KtSymbol, override val valueParameter: KtSymbol,
override val baseFunctions: List<KtCallableSymbol>,
firDiagnostic: KtPsiDiagnostic, firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken, token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverride ) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverride
internal class MultipleDefaultsInheritedFromSupertypesDeprecationErrorImpl( internal class MultipleDefaultsInheritedFromSupertypesDeprecationErrorImpl(
override val name: Name,
override val valueParameter: KtSymbol, override val valueParameter: KtSymbol,
override val baseFunctions: List<KtCallableSymbol>,
firDiagnostic: KtPsiDiagnostic, firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken, token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesDeprecationError ) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesDeprecationError
internal class MultipleDefaultsInheritedFromSupertypesDeprecationWarningImpl( internal class MultipleDefaultsInheritedFromSupertypesDeprecationWarningImpl(
override val name: Name,
override val valueParameter: KtSymbol, override val valueParameter: KtSymbol,
override val baseFunctions: List<KtCallableSymbol>,
firDiagnostic: KtPsiDiagnostic, firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken, token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesDeprecationWarning ) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesDeprecationWarning
internal class MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationErrorImpl( internal class MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationErrorImpl(
override val name: Name,
override val valueParameter: KtSymbol, override val valueParameter: KtSymbol,
override val baseFunctions: List<KtCallableSymbol>,
firDiagnostic: KtPsiDiagnostic, firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken, token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationError ) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationError
internal class MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarningImpl( internal class MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarningImpl(
override val name: Name,
override val valueParameter: KtSymbol, override val valueParameter: KtSymbol,
override val baseFunctions: List<KtCallableSymbol>,
firDiagnostic: KtPsiDiagnostic, firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken, token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarning ) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarning
@@ -890,22 +890,30 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
} }
val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) { val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) {
parameter<Name>("name")
parameter<FirValueParameterSymbol>("valueParameter") parameter<FirValueParameterSymbol>("valueParameter")
parameter<List<FirCallableSymbol<*>>>("baseFunctions")
} }
val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE by error<KtElement>(PositioningStrategy.DECLARATION_NAME) { val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE by error<KtElement>(PositioningStrategy.DECLARATION_NAME) {
parameter<Name>("name")
parameter<FirValueParameterSymbol>("valueParameter") parameter<FirValueParameterSymbol>("valueParameter")
parameter<List<FirCallableSymbol<*>>>("baseFunctions")
} }
val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION by deprecationError<KtElement>( val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION by deprecationError<KtElement>(
LanguageFeature.ProhibitAllMultipleDefaultsInheritedFromSupertypes, LanguageFeature.ProhibitAllMultipleDefaultsInheritedFromSupertypes,
PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT
) { ) {
parameter<Name>("name")
parameter<FirValueParameterSymbol>("valueParameter") parameter<FirValueParameterSymbol>("valueParameter")
parameter<List<FirCallableSymbol<*>>>("baseFunctions")
} }
val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION by deprecationError<KtElement>( val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION by deprecationError<KtElement>(
LanguageFeature.ProhibitAllMultipleDefaultsInheritedFromSupertypes, LanguageFeature.ProhibitAllMultipleDefaultsInheritedFromSupertypes,
PositioningStrategy.DECLARATION_NAME PositioningStrategy.DECLARATION_NAME
) { ) {
parameter<Name>("name")
parameter<FirValueParameterSymbol>("valueParameter") parameter<FirValueParameterSymbol>("valueParameter")
parameter<List<FirCallableSymbol<*>>>("baseFunctions")
} }
val TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS by error<KtElement> { val TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS by error<KtElement> {
@@ -493,10 +493,10 @@ object FirErrors {
val DATA_CLASS_OVERRIDE_DEFAULT_VALUES by error2<KtElement, FirCallableSymbol<*>, FirClassSymbol<*>>(SourceElementPositioningStrategies.DATA_MODIFIER) val DATA_CLASS_OVERRIDE_DEFAULT_VALUES by error2<KtElement, FirCallableSymbol<*>, FirClassSymbol<*>>(SourceElementPositioningStrategies.DATA_MODIFIER)
val CANNOT_WEAKEN_ACCESS_PRIVILEGE by error3<KtModifierListOwner, Visibility, FirCallableSymbol<*>, Name>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) val CANNOT_WEAKEN_ACCESS_PRIVILEGE by error3<KtModifierListOwner, Visibility, FirCallableSymbol<*>, Name>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER)
val CANNOT_CHANGE_ACCESS_PRIVILEGE by error3<KtModifierListOwner, Visibility, FirCallableSymbol<*>, Name>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) val CANNOT_CHANGE_ACCESS_PRIVILEGE by error3<KtModifierListOwner, Visibility, FirCallableSymbol<*>, Name>(SourceElementPositioningStrategies.VISIBILITY_MODIFIER)
val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES by error1<KtElement, FirValueParameterSymbol>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES by error3<KtElement, Name, FirValueParameterSymbol, List<FirCallableSymbol<*>>>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE by error1<KtElement, FirValueParameterSymbol>(SourceElementPositioningStrategies.DECLARATION_NAME) val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE by error3<KtElement, Name, FirValueParameterSymbol, List<FirCallableSymbol<*>>>(SourceElementPositioningStrategies.DECLARATION_NAME)
val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION by deprecationError1<KtElement, FirValueParameterSymbol>(ProhibitAllMultipleDefaultsInheritedFromSupertypes, SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION by deprecationError3<KtElement, Name, FirValueParameterSymbol, List<FirCallableSymbol<*>>>(ProhibitAllMultipleDefaultsInheritedFromSupertypes, SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION by deprecationError1<KtElement, FirValueParameterSymbol>(ProhibitAllMultipleDefaultsInheritedFromSupertypes, SourceElementPositioningStrategies.DECLARATION_NAME) val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION by deprecationError3<KtElement, Name, FirValueParameterSymbol, List<FirCallableSymbol<*>>>(ProhibitAllMultipleDefaultsInheritedFromSupertypes, SourceElementPositioningStrategies.DECLARATION_NAME)
val TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS by error1<KtElement, ConeKotlinType>() val TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS by error1<KtElement, ConeKotlinType>()
val OVERRIDING_FINAL_MEMBER by error2<KtNamedDeclaration, FirCallableSymbol<*>, Name>(SourceElementPositioningStrategies.OVERRIDE_MODIFIER) val OVERRIDING_FINAL_MEMBER by error2<KtNamedDeclaration, FirCallableSymbol<*>, Name>(SourceElementPositioningStrategies.OVERRIDE_MODIFIER)
val RETURN_TYPE_MISMATCH_ON_INHERITANCE by error2<KtClassOrObject, FirCallableSymbol<*>, FirCallableSymbol<*>>(SourceElementPositioningStrategies.DECLARATION_NAME) val RETURN_TYPE_MISMATCH_ON_INHERITANCE by error2<KtClassOrObject, FirCallableSymbol<*>, FirCallableSymbol<*>>(SourceElementPositioningStrategies.DECLARATION_NAME)
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.fir.isSubstitutionOverride
import org.jetbrains.kotlin.fir.scopes.processAllFunctions import org.jetbrains.kotlin.fir.scopes.processAllFunctions
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirValueParameterSymbol
import org.jetbrains.kotlin.name.Name
object FirMultipleDefaultsInheritedFromSupertypesChecker : FirRegularClassChecker() { object FirMultipleDefaultsInheritedFromSupertypesChecker : FirRegularClassChecker() {
override fun check(declaration: FirRegularClass, context: CheckerContext, reporter: DiagnosticReporter) { override fun check(declaration: FirRegularClass, context: CheckerContext, reporter: DiagnosticReporter) {
@@ -48,9 +49,9 @@ object FirMultipleDefaultsInheritedFromSupertypesChecker : FirRegularClassChecke
val overriddenFunctionsK1WouldConsider = overriddenFunctions.filter { it.containingClassLookupTag() in immediateSupertypes } val overriddenFunctionsK1WouldConsider = overriddenFunctions.filter { it.containingClassLookupTag() in immediateSupertypes }
for ((index, parameter) in function.valueParameterSymbols.withIndex()) { 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 continue
} }
@@ -58,11 +59,15 @@ object FirMultipleDefaultsInheritedFromSupertypesChecker : FirRegularClassChecke
when { when {
!isExplicitOverride -> { !isExplicitOverride -> {
reportDiagnosticForImplicitOverride(k1WouldMiss, declaration.source, parameter, context, reporter) reportDiagnosticForImplicitOverride(
k1WouldMiss, declaration.source, function.name, parameter, basesWithDefaultValues, context, reporter
)
// Avoid duplicates // Avoid duplicates
break 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( private fun reportDiagnosticForImplicitOverride(
k1WouldMiss: Boolean, k1WouldMiss: Boolean,
source: KtSourceElement?, source: KtSourceElement?,
name: Name,
parameter: FirValueParameterSymbol, parameter: FirValueParameterSymbol,
basesWithDefaultValues: List<FirNamedFunctionSymbol>,
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter, reporter: DiagnosticReporter,
): Unit = when { ): Unit = when {
k1WouldMiss -> reporter.reportOn( k1WouldMiss -> reporter.reportOn(
source, FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION, source, FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION,
parameter, context, name, parameter, basesWithDefaultValues, context,
) )
else -> reporter.reportOn( else -> reporter.reportOn(
source, FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE, source, FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE,
parameter, context, name, parameter, basesWithDefaultValues, context,
) )
} }
private fun reportDiagnosticForExplicitOverride( private fun reportDiagnosticForExplicitOverride(
k1WouldMiss: Boolean, k1WouldMiss: Boolean,
name: Name,
parameter: FirValueParameterSymbol, parameter: FirValueParameterSymbol,
basesWithDefaultValues: List<FirNamedFunctionSymbol>,
context: CheckerContext, context: CheckerContext,
reporter: DiagnosticReporter, reporter: DiagnosticReporter,
): Unit = when { ): Unit = when {
k1WouldMiss -> reporter.reportOn( k1WouldMiss -> reporter.reportOn(
parameter.source, FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION, parameter.source, FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION,
parameter, context, name, parameter, basesWithDefaultValues, context,
) )
else -> reporter.reportOn( else -> reporter.reportOn(
parameter.source, FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES, parameter.source, FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES,
parameter, context, name, parameter, basesWithDefaultValues, context,
) )
} }
} }
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.diagnostics.WhenMissingCase
import org.jetbrains.kotlin.diagnostics.rendering.ContextIndependentParameterRenderer import org.jetbrains.kotlin.diagnostics.rendering.ContextIndependentParameterRenderer
import org.jetbrains.kotlin.diagnostics.rendering.Renderer import org.jetbrains.kotlin.diagnostics.rendering.Renderer
import org.jetbrains.kotlin.fir.FirModuleData import org.jetbrains.kotlin.fir.FirModuleData
import org.jetbrains.kotlin.fir.containingClassLookupTag
import org.jetbrains.kotlin.fir.declarations.utils.* import org.jetbrains.kotlin.fir.declarations.utils.*
import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.expressions.FirExpression
import org.jetbrains.kotlin.fir.expressions.calleeReference import org.jetbrains.kotlin.fir.expressions.calleeReference
@@ -66,6 +67,13 @@ object FirDiagnosticRenderers {
} }
} }
val CALLABLES_FQ_NAMES = object : ContextIndependentParameterRenderer<Collection<FirCallableSymbol<*>>> {
override fun render(obj: Collection<FirCallableSymbol<*>>) = "\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<ConeKotlinType> -> val RENDER_COLLECTION_OF_TYPES = Renderer { types: Collection<ConeKotlinType> ->
types.joinToString(separator = ", ") { type -> types.joinToString(separator = ", ") { type ->
RENDER_TYPE.render(type) RENDER_TYPE.render(type)
@@ -16,12 +16,14 @@ import org.jetbrains.kotlin.diagnostics.KtDiagnosticRenderers.TO_STRING
import org.jetbrains.kotlin.diagnostics.KtDiagnosticRenderers.VISIBILITY import org.jetbrains.kotlin.diagnostics.KtDiagnosticRenderers.VISIBILITY
import org.jetbrains.kotlin.diagnostics.rendering.BaseDiagnosticRendererFactory import org.jetbrains.kotlin.diagnostics.rendering.BaseDiagnosticRendererFactory
import org.jetbrains.kotlin.diagnostics.rendering.CommonRenderers.CLASS_KIND 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.RENDER_POSITION_VARIANCE
import org.jetbrains.kotlin.diagnostics.rendering.CommonRenderers.STRING import org.jetbrains.kotlin.diagnostics.rendering.CommonRenderers.STRING
import org.jetbrains.kotlin.diagnostics.rendering.CommonRenderers.commaSeparated import org.jetbrains.kotlin.diagnostics.rendering.CommonRenderers.commaSeparated
import org.jetbrains.kotlin.diagnostics.rendering.LanguageFeatureMessageRenderer import org.jetbrains.kotlin.diagnostics.rendering.LanguageFeatureMessageRenderer
import org.jetbrains.kotlin.diagnostics.rendering.Renderer 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.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.CALLEE_NAME
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.DECLARATION_NAME import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.DECLARATION_NAME
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.FOR_OPTIONAL_OPERATOR import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnosticRenderers.FOR_OPTIONAL_OPERATOR
@@ -1513,28 +1515,37 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
FQ_NAMES_IN_TYPES FQ_NAMES_IN_TYPES
) )
val multipleDefaultsMessage = "More than one overridden function declares a default value for ''{0}''." 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." val multipleDefaultsNotAllowed = "As the compiler can not make sure these values agree, this is not allowed."
map.put( map.put(
MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES, MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES,
multipleDefaultsMessage + multipleDefaultsNotAllowed, multipleDefaultsMessage + multipleDefaultsNotAllowed,
SYMBOL NAME,
SYMBOL,
CALLABLES_FQ_NAMES,
) )
map.put( map.put(
MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE, MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE,
multipleDefaultsMessage + multipleDefaultsNotAllowed, 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( map.put(
MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION, MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION,
multipleDefaultsMessage + multipleDefaultsDiscouraged, multipleDefaultsMessage + multipleDefaultsDiscouraged,
SYMBOL NAME,
SYMBOL,
CALLABLES_FQ_NAMES,
) )
map.put( map.put(
MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION, MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION,
multipleDefaultsMessage + multipleDefaultsDiscouraged, 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) map.put(TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS, "Type alias expanded to malformed type ''{0}''", RENDER_TYPE)
@@ -126,4 +126,4 @@ private fun StringBuilder.renderIncompatibleClassScopes(
}) })
} }
private const val INDENTATION_UNIT = " " internal const val INDENTATION_UNIT = " "
@@ -17,10 +17,10 @@ interface B {
fun foo(@An a: @An Int = @An 2) fun foo(@An a: @An Int = @An 2)
} }
<!MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE("@An() a: @R|An|() Int = ...")!>class AB1<!> : A, B <!MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE("foo; @An() a: @R|An|() Int = ...; @An() fun foo(@An() a: @R|An|() Int = ...): Unit, defined in A @An() fun foo(@An() a: @R|An|() Int = ...): Unit, defined in B")!>class AB1<!> : A, B
@An @An
class AB2 : A, B { class AB2 : A, B {
@An @An
override fun foo(<!MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES("@An() a: @R|An|() Int")!>@An a: @An Int<!>) {} override fun foo(<!MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES("foo; @An() a: @R|An|() Int; @An() fun foo(@An() a: @R|An|() Int = ...): Unit, defined in A @An() fun foo(@An() a: @R|An|() Int = ...): Unit, defined in B")!>@An a: @An Int<!>) {}
} }