[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 ->
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,
)
@@ -1861,32 +1861,44 @@ sealed interface KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
interface MultipleDefaultsInheritedFromSupertypes : KtFirDiagnostic<KtElement> {
override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypes::class
val name: Name
val valueParameter: KtSymbol
val baseFunctions: List<KtCallableSymbol>
}
interface MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverride : KtFirDiagnostic<KtElement> {
override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverride::class
val name: Name
val valueParameter: KtSymbol
val baseFunctions: List<KtCallableSymbol>
}
interface MultipleDefaultsInheritedFromSupertypesDeprecationError : KtFirDiagnostic<KtElement> {
override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesDeprecationError::class
val name: Name
val valueParameter: KtSymbol
val baseFunctions: List<KtCallableSymbol>
}
interface MultipleDefaultsInheritedFromSupertypesDeprecationWarning : KtFirDiagnostic<KtElement> {
override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesDeprecationWarning::class
val name: Name
val valueParameter: KtSymbol
val baseFunctions: List<KtCallableSymbol>
}
interface MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationError : KtFirDiagnostic<KtElement> {
override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationError::class
val name: Name
val valueParameter: KtSymbol
val baseFunctions: List<KtCallableSymbol>
}
interface MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarning : KtFirDiagnostic<KtElement> {
override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarning::class
val name: Name
val valueParameter: KtSymbol
val baseFunctions: List<KtCallableSymbol>
}
interface TypealiasExpandsToArrayOfNothings : KtFirDiagnostic<KtElement> {
@@ -2233,37 +2233,49 @@ internal class CannotChangeAccessPrivilegeImpl(
) : KtAbstractFirDiagnostic<KtModifierListOwner>(firDiagnostic, token), KtFirDiagnostic.CannotChangeAccessPrivilege
internal class MultipleDefaultsInheritedFromSupertypesImpl(
override val name: Name,
override val valueParameter: KtSymbol,
override val baseFunctions: List<KtCallableSymbol>,
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypes
internal class MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideImpl(
override val name: Name,
override val valueParameter: KtSymbol,
override val baseFunctions: List<KtCallableSymbol>,
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverride
internal class MultipleDefaultsInheritedFromSupertypesDeprecationErrorImpl(
override val name: Name,
override val valueParameter: KtSymbol,
override val baseFunctions: List<KtCallableSymbol>,
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesDeprecationError
internal class MultipleDefaultsInheritedFromSupertypesDeprecationWarningImpl(
override val name: Name,
override val valueParameter: KtSymbol,
override val baseFunctions: List<KtCallableSymbol>,
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesDeprecationWarning
internal class MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationErrorImpl(
override val name: Name,
override val valueParameter: KtSymbol,
override val baseFunctions: List<KtCallableSymbol>,
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationError
internal class MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarningImpl(
override val name: Name,
override val valueParameter: KtSymbol,
override val baseFunctions: List<KtCallableSymbol>,
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
) : 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) {
parameter<Name>("name")
parameter<FirValueParameterSymbol>("valueParameter")
parameter<List<FirCallableSymbol<*>>>("baseFunctions")
}
val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE by error<KtElement>(PositioningStrategy.DECLARATION_NAME) {
parameter<Name>("name")
parameter<FirValueParameterSymbol>("valueParameter")
parameter<List<FirCallableSymbol<*>>>("baseFunctions")
}
val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION by deprecationError<KtElement>(
LanguageFeature.ProhibitAllMultipleDefaultsInheritedFromSupertypes,
PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT
) {
parameter<Name>("name")
parameter<FirValueParameterSymbol>("valueParameter")
parameter<List<FirCallableSymbol<*>>>("baseFunctions")
}
val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION by deprecationError<KtElement>(
LanguageFeature.ProhibitAllMultipleDefaultsInheritedFromSupertypes,
PositioningStrategy.DECLARATION_NAME
) {
parameter<Name>("name")
parameter<FirValueParameterSymbol>("valueParameter")
parameter<List<FirCallableSymbol<*>>>("baseFunctions")
}
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 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 MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES by error1<KtElement, FirValueParameterSymbol>(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_DEPRECATION by deprecationError1<KtElement, FirValueParameterSymbol>(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 by error3<KtElement, Name, FirValueParameterSymbol, List<FirCallableSymbol<*>>>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
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 deprecationError3<KtElement, Name, FirValueParameterSymbol, List<FirCallableSymbol<*>>>(ProhibitAllMultipleDefaultsInheritedFromSupertypes, SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
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 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)
@@ -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<FirNamedFunctionSymbol>,
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<FirNamedFunctionSymbol>,
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,
)
}
}
@@ -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<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> ->
types.joinToString(separator = ", ") { 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.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)
@@ -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)
}
<!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
class AB2 : A, B {
@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<!>) {}
}