[FIR] Relax MULTIPLE_DEFAULTS_* to account for the K1 behavior

^KT-56442
^KT-36188
This commit is contained in:
Nikolay Lunyak
2023-08-18 12:18:52 +03:00
committed by Space Team
parent 3f1bf6112f
commit 13a7bb95b3
29 changed files with 505 additions and 27 deletions
@@ -2602,6 +2602,34 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
token,
)
}
add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION.errorFactory) { firDiagnostic ->
MultipleDefaultsInheritedFromSupertypesDeprecationErrorImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a),
firDiagnostic as KtPsiDiagnostic,
token,
)
}
add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION.warningFactory) { firDiagnostic ->
MultipleDefaultsInheritedFromSupertypesDeprecationWarningImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a),
firDiagnostic as KtPsiDiagnostic,
token,
)
}
add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION.errorFactory) { firDiagnostic ->
MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationErrorImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a),
firDiagnostic as KtPsiDiagnostic,
token,
)
}
add(FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION.warningFactory) { firDiagnostic ->
MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarningImpl(
firSymbolBuilder.buildSymbol(firDiagnostic.a),
firDiagnostic as KtPsiDiagnostic,
token,
)
}
add(FirErrors.TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS) { firDiagnostic ->
TypealiasExpandsToArrayOfNothingsImpl(
firSymbolBuilder.typeBuilder.buildKtType(firDiagnostic.a),
@@ -1849,6 +1849,26 @@ sealed interface KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
val valueParameter: KtSymbol
}
interface MultipleDefaultsInheritedFromSupertypesDeprecationError : KtFirDiagnostic<KtElement> {
override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesDeprecationError::class
val valueParameter: KtSymbol
}
interface MultipleDefaultsInheritedFromSupertypesDeprecationWarning : KtFirDiagnostic<KtElement> {
override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesDeprecationWarning::class
val valueParameter: KtSymbol
}
interface MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationError : KtFirDiagnostic<KtElement> {
override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationError::class
val valueParameter: KtSymbol
}
interface MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarning : KtFirDiagnostic<KtElement> {
override val diagnosticClass get() = MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarning::class
val valueParameter: KtSymbol
}
interface TypealiasExpandsToArrayOfNothings : KtFirDiagnostic<KtElement> {
override val diagnosticClass get() = TypealiasExpandsToArrayOfNothings::class
val type: KtType
@@ -2221,6 +2221,30 @@ internal class MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideImpl
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverride
internal class MultipleDefaultsInheritedFromSupertypesDeprecationErrorImpl(
override val valueParameter: KtSymbol,
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesDeprecationError
internal class MultipleDefaultsInheritedFromSupertypesDeprecationWarningImpl(
override val valueParameter: KtSymbol,
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesDeprecationWarning
internal class MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationErrorImpl(
override val valueParameter: KtSymbol,
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationError
internal class MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarningImpl(
override val valueParameter: KtSymbol,
firDiagnostic: KtPsiDiagnostic,
token: KtLifetimeToken,
) : KtAbstractFirDiagnostic<KtElement>(firDiagnostic, token), KtFirDiagnostic.MultipleDefaultsInheritedFromSupertypesWhenNoExplicitOverrideDeprecationWarning
internal class TypealiasExpandsToArrayOfNothingsImpl(
override val type: KtType,
firDiagnostic: KtPsiDiagnostic,
@@ -357,6 +357,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia
runTest("compiler/testData/diagnostics/tests/falseNegativeDuplicateDefaultValues1.kt");
}
@Test
@TestMetadata("falseNegativeDuplicateDefaultValues1_error.kt")
public void testFalseNegativeDuplicateDefaultValues1_error() throws Exception {
runTest("compiler/testData/diagnostics/tests/falseNegativeDuplicateDefaultValues1_error.kt");
}
@Test
@TestMetadata("falseNegativeDuplicateDefaultValues2.kt")
public void testFalseNegativeDuplicateDefaultValues2() throws Exception {
@@ -753,12 +759,30 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia
runTest("compiler/testData/diagnostics/tests/missingIteratorMissing.kt");
}
@Test
@TestMetadata("missingMultipleDefaultsOnTransitiveInheritance1.kt")
public void testMissingMultipleDefaultsOnTransitiveInheritance1() throws Exception {
runTest("compiler/testData/diagnostics/tests/missingMultipleDefaultsOnTransitiveInheritance1.kt");
}
@Test
@TestMetadata("missingMultipleDefaultsOnTransitiveInheritance2.kt")
public void testMissingMultipleDefaultsOnTransitiveInheritance2() throws Exception {
runTest("compiler/testData/diagnostics/tests/missingMultipleDefaultsOnTransitiveInheritance2.kt");
}
@Test
@TestMetadata("missingWrongAnnotationTarget.kt")
public void testMissingWrongAnnotationTarget() throws Exception {
runTest("compiler/testData/diagnostics/tests/missingWrongAnnotationTarget.kt");
}
@Test
@TestMetadata("moreThanOneOverriddenMissingK2.kt")
public void testMoreThanOneOverriddenMissingK2() throws Exception {
runTest("compiler/testData/diagnostics/tests/moreThanOneOverriddenMissingK2.kt");
}
@Test
@TestMetadata("MultilineStringTemplates.kt")
public void testMultilineStringTemplates() throws Exception {
@@ -771,6 +795,18 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia
runTest("compiler/testData/diagnostics/tests/MultipleBounds.kt");
}
@Test
@TestMetadata("multipleDefaultsIncorrectlyAllowed1.kt")
public void testMultipleDefaultsIncorrectlyAllowed1() throws Exception {
runTest("compiler/testData/diagnostics/tests/multipleDefaultsIncorrectlyAllowed1.kt");
}
@Test
@TestMetadata("multipleDefaultsIncorrectlyAllowed2.kt")
public void testMultipleDefaultsIncorrectlyAllowed2() throws Exception {
runTest("compiler/testData/diagnostics/tests/multipleDefaultsIncorrectlyAllowed2.kt");
}
@Test
@TestMetadata("multipleDefaultsNoSource.kt")
public void testMultipleDefaultsNoSource() throws Exception {
@@ -357,6 +357,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
runTest("compiler/testData/diagnostics/tests/falseNegativeDuplicateDefaultValues1.kt");
}
@Test
@TestMetadata("falseNegativeDuplicateDefaultValues1_error.kt")
public void testFalseNegativeDuplicateDefaultValues1_error() throws Exception {
runTest("compiler/testData/diagnostics/tests/falseNegativeDuplicateDefaultValues1_error.kt");
}
@Test
@TestMetadata("falseNegativeDuplicateDefaultValues2.kt")
public void testFalseNegativeDuplicateDefaultValues2() throws Exception {
@@ -753,12 +759,30 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
runTest("compiler/testData/diagnostics/tests/missingIteratorMissing.kt");
}
@Test
@TestMetadata("missingMultipleDefaultsOnTransitiveInheritance1.kt")
public void testMissingMultipleDefaultsOnTransitiveInheritance1() throws Exception {
runTest("compiler/testData/diagnostics/tests/missingMultipleDefaultsOnTransitiveInheritance1.kt");
}
@Test
@TestMetadata("missingMultipleDefaultsOnTransitiveInheritance2.kt")
public void testMissingMultipleDefaultsOnTransitiveInheritance2() throws Exception {
runTest("compiler/testData/diagnostics/tests/missingMultipleDefaultsOnTransitiveInheritance2.kt");
}
@Test
@TestMetadata("missingWrongAnnotationTarget.kt")
public void testMissingWrongAnnotationTarget() throws Exception {
runTest("compiler/testData/diagnostics/tests/missingWrongAnnotationTarget.kt");
}
@Test
@TestMetadata("moreThanOneOverriddenMissingK2.kt")
public void testMoreThanOneOverriddenMissingK2() throws Exception {
runTest("compiler/testData/diagnostics/tests/moreThanOneOverriddenMissingK2.kt");
}
@Test
@TestMetadata("MultilineStringTemplates.kt")
public void testMultilineStringTemplates() throws Exception {
@@ -771,6 +795,18 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated
runTest("compiler/testData/diagnostics/tests/MultipleBounds.kt");
}
@Test
@TestMetadata("multipleDefaultsIncorrectlyAllowed1.kt")
public void testMultipleDefaultsIncorrectlyAllowed1() throws Exception {
runTest("compiler/testData/diagnostics/tests/multipleDefaultsIncorrectlyAllowed1.kt");
}
@Test
@TestMetadata("multipleDefaultsIncorrectlyAllowed2.kt")
public void testMultipleDefaultsIncorrectlyAllowed2() throws Exception {
runTest("compiler/testData/diagnostics/tests/multipleDefaultsIncorrectlyAllowed2.kt");
}
@Test
@TestMetadata("multipleDefaultsNoSource.kt")
public void testMultipleDefaultsNoSource() throws Exception {
@@ -357,6 +357,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
runTest("compiler/testData/diagnostics/tests/falseNegativeDuplicateDefaultValues1.kt");
}
@Test
@TestMetadata("falseNegativeDuplicateDefaultValues1_error.kt")
public void testFalseNegativeDuplicateDefaultValues1_error() throws Exception {
runTest("compiler/testData/diagnostics/tests/falseNegativeDuplicateDefaultValues1_error.kt");
}
@Test
@TestMetadata("falseNegativeDuplicateDefaultValues2.kt")
public void testFalseNegativeDuplicateDefaultValues2() throws Exception {
@@ -753,12 +759,30 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
runTest("compiler/testData/diagnostics/tests/missingIteratorMissing.kt");
}
@Test
@TestMetadata("missingMultipleDefaultsOnTransitiveInheritance1.kt")
public void testMissingMultipleDefaultsOnTransitiveInheritance1() throws Exception {
runTest("compiler/testData/diagnostics/tests/missingMultipleDefaultsOnTransitiveInheritance1.kt");
}
@Test
@TestMetadata("missingMultipleDefaultsOnTransitiveInheritance2.kt")
public void testMissingMultipleDefaultsOnTransitiveInheritance2() throws Exception {
runTest("compiler/testData/diagnostics/tests/missingMultipleDefaultsOnTransitiveInheritance2.kt");
}
@Test
@TestMetadata("missingWrongAnnotationTarget.kt")
public void testMissingWrongAnnotationTarget() throws Exception {
runTest("compiler/testData/diagnostics/tests/missingWrongAnnotationTarget.kt");
}
@Test
@TestMetadata("moreThanOneOverriddenMissingK2.kt")
public void testMoreThanOneOverriddenMissingK2() throws Exception {
runTest("compiler/testData/diagnostics/tests/moreThanOneOverriddenMissingK2.kt");
}
@Test
@TestMetadata("MultilineStringTemplates.kt")
public void testMultilineStringTemplates() throws Exception {
@@ -771,6 +795,18 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir
runTest("compiler/testData/diagnostics/tests/MultipleBounds.kt");
}
@Test
@TestMetadata("multipleDefaultsIncorrectlyAllowed1.kt")
public void testMultipleDefaultsIncorrectlyAllowed1() throws Exception {
runTest("compiler/testData/diagnostics/tests/multipleDefaultsIncorrectlyAllowed1.kt");
}
@Test
@TestMetadata("multipleDefaultsIncorrectlyAllowed2.kt")
public void testMultipleDefaultsIncorrectlyAllowed2() throws Exception {
runTest("compiler/testData/diagnostics/tests/multipleDefaultsIncorrectlyAllowed2.kt");
}
@Test
@TestMetadata("multipleDefaultsNoSource.kt")
public void testMultipleDefaultsNoSource() throws Exception {
@@ -357,6 +357,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
runTest("compiler/testData/diagnostics/tests/falseNegativeDuplicateDefaultValues1.kt");
}
@Test
@TestMetadata("falseNegativeDuplicateDefaultValues1_error.kt")
public void testFalseNegativeDuplicateDefaultValues1_error() throws Exception {
runTest("compiler/testData/diagnostics/tests/falseNegativeDuplicateDefaultValues1_error.kt");
}
@Test
@TestMetadata("falseNegativeDuplicateDefaultValues2.kt")
public void testFalseNegativeDuplicateDefaultValues2() throws Exception {
@@ -753,12 +759,30 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
runTest("compiler/testData/diagnostics/tests/missingIteratorMissing.kt");
}
@Test
@TestMetadata("missingMultipleDefaultsOnTransitiveInheritance1.kt")
public void testMissingMultipleDefaultsOnTransitiveInheritance1() throws Exception {
runTest("compiler/testData/diagnostics/tests/missingMultipleDefaultsOnTransitiveInheritance1.kt");
}
@Test
@TestMetadata("missingMultipleDefaultsOnTransitiveInheritance2.kt")
public void testMissingMultipleDefaultsOnTransitiveInheritance2() throws Exception {
runTest("compiler/testData/diagnostics/tests/missingMultipleDefaultsOnTransitiveInheritance2.kt");
}
@Test
@TestMetadata("missingWrongAnnotationTarget.kt")
public void testMissingWrongAnnotationTarget() throws Exception {
runTest("compiler/testData/diagnostics/tests/missingWrongAnnotationTarget.kt");
}
@Test
@TestMetadata("moreThanOneOverriddenMissingK2.kt")
public void testMoreThanOneOverriddenMissingK2() throws Exception {
runTest("compiler/testData/diagnostics/tests/moreThanOneOverriddenMissingK2.kt");
}
@Test
@TestMetadata("MultilineStringTemplates.kt")
public void testMultilineStringTemplates() throws Exception {
@@ -771,6 +795,18 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia
runTest("compiler/testData/diagnostics/tests/MultipleBounds.kt");
}
@Test
@TestMetadata("multipleDefaultsIncorrectlyAllowed1.kt")
public void testMultipleDefaultsIncorrectlyAllowed1() throws Exception {
runTest("compiler/testData/diagnostics/tests/multipleDefaultsIncorrectlyAllowed1.kt");
}
@Test
@TestMetadata("multipleDefaultsIncorrectlyAllowed2.kt")
public void testMultipleDefaultsIncorrectlyAllowed2() throws Exception {
runTest("compiler/testData/diagnostics/tests/multipleDefaultsIncorrectlyAllowed2.kt");
}
@Test
@TestMetadata("multipleDefaultsNoSource.kt")
public void testMultipleDefaultsNoSource() throws Exception {
@@ -888,6 +888,18 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE by error<KtElement>(PositioningStrategy.DECLARATION_NAME) {
parameter<FirValueParameterSymbol>("valueParameter")
}
val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION by deprecationError<KtElement>(
LanguageFeature.ProhibitAllMultipleDefaultsInheritedFromSupertypes,
PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT
) {
parameter<FirValueParameterSymbol>("valueParameter")
}
val MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION by deprecationError<KtElement>(
LanguageFeature.ProhibitAllMultipleDefaultsInheritedFromSupertypes,
PositioningStrategy.DECLARATION_NAME
) {
parameter<FirValueParameterSymbol>("valueParameter")
}
val TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS by error<KtElement> {
parameter<ConeKotlinType>("type")
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.config.LanguageFeature.ForbidExposingTypesInPrimaryC
import org.jetbrains.kotlin.config.LanguageFeature.ForbidInferringTypeVariablesIntoEmptyIntersection
import org.jetbrains.kotlin.config.LanguageFeature.ForbidUsingExtensionPropertyTypeParameterInDelegate
import org.jetbrains.kotlin.config.LanguageFeature.ModifierNonBuiltinSuspendFunError
import org.jetbrains.kotlin.config.LanguageFeature.ProhibitAllMultipleDefaultsInheritedFromSupertypes
import org.jetbrains.kotlin.config.LanguageFeature.ProhibitAssigningSingleElementsToVarargsInNamedForm
import org.jetbrains.kotlin.config.LanguageFeature.ProhibitConfusingSyntaxInWhenBranches
import org.jetbrains.kotlin.config.LanguageFeature.ProhibitCyclesInAnnotations
@@ -491,6 +492,8 @@ object FirErrors {
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 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)
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.analysis.checkers.declaration
import org.jetbrains.kotlin.KtSourceElement
import org.jetbrains.kotlin.diagnostics.DiagnosticReporter
import org.jetbrains.kotlin.diagnostics.reportOn
import org.jetbrains.kotlin.fir.analysis.checkers.collectOverriddenFunctionsWhere
@@ -18,6 +19,7 @@ import org.jetbrains.kotlin.fir.declarations.utils.superConeTypes
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
object FirMultipleDefaultsInheritedFromSupertypesChecker : FirRegularClassChecker() {
override fun check(declaration: FirRegularClass, context: CheckerContext, reporter: DiagnosticReporter) {
@@ -42,26 +44,59 @@ object FirMultipleDefaultsInheritedFromSupertypesChecker : FirRegularClassChecke
}
val isExplicitOverride = function.origin == FirDeclarationOrigin.Source
val immediateSupertypes = declaration.superConeTypes.mapTo(mutableSetOf()) { it.lookupTag }
val overriddenFunctionsK1WouldConsider = overriddenFunctions.filter { it.containingClassLookupTag() in immediateSupertypes }
for ((index, parameter) in function.valueParameterSymbols.withIndex()) {
val basesWithDefaultValues = overriddenFunctions.count { it.valueParameterSymbols[index].hasDefaultValue }
if (basesWithDefaultValues <= 1) {
continue
}
val k1WouldMiss = overriddenFunctionsK1WouldConsider.count { it.valueParameterSymbols[index].hasDefaultValue } <= 1
when {
basesWithDefaultValues <= 1 -> {
continue
}
!isExplicitOverride -> {
reporter.reportOn(
declaration.source, FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE,
parameter, context,
)
reportDiagnosticForImplicitOverride(k1WouldMiss, declaration.source, parameter, context, reporter)
// Avoid duplicates
break
}
else -> reporter.reportOn(
parameter.source, FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES,
parameter, context,
)
else -> reportDiagnosticForExplicitOverride(k1WouldMiss, parameter, context, reporter)
}
}
}
private fun reportDiagnosticForImplicitOverride(
k1WouldMiss: Boolean,
source: KtSourceElement?,
parameter: FirValueParameterSymbol,
context: CheckerContext,
reporter: DiagnosticReporter,
): Unit = when {
k1WouldMiss -> reporter.reportOn(
source, FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION,
parameter, context,
)
else -> reporter.reportOn(
source, FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE,
parameter, context,
)
}
private fun reportDiagnosticForExplicitOverride(
k1WouldMiss: Boolean,
parameter: FirValueParameterSymbol,
context: CheckerContext,
reporter: DiagnosticReporter,
): Unit = when {
k1WouldMiss -> reporter.reportOn(
parameter.source, FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION,
parameter, context,
)
else -> reporter.reportOn(
parameter.source, FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES,
parameter, context,
)
}
}
@@ -369,6 +369,8 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MODIFIER_FORM_FOR
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_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION
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
@@ -1494,9 +1496,29 @@ 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)
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."
map.put(
MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES,
multipleDefaultsMessage + multipleDefaultsNotAllowed,
SYMBOL
)
map.put(
MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE,
multipleDefaultsMessage + multipleDefaultsNotAllowed,
SYMBOL
)
val multipleDefaultsDiscouraged = " As the compiler can not make sure these values agree, this will be prohibited in the Future."
map.put(
MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION,
multipleDefaultsMessage + multipleDefaultsDiscouraged,
SYMBOL
)
map.put(
MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE_DEPRECATION,
multipleDefaultsMessage + multipleDefaultsNotAllowed,
SYMBOL
)
map.put(TYPEALIAS_EXPANDS_TO_ARRAY_OF_NOTHINGS, "Type alias expanded to malformed type ''{0}''", RENDER_TYPE)
+1 -3
View File
@@ -1,6 +1,4 @@
// IGNORE_BACKEND_K1: JS, JS_IR, JS_IR_ES6
// IGNORE_BACKEND_K2: ANY
// STATUS: This must be red code anyway, KT-36188
// IGNORE_BACKEND: JS, JS_IR, JS_IR_ES6
// The code in this test should be prohibited in the frontend, see KT-36188.
@@ -1,6 +1,4 @@
// IGNORE_BACKEND_K1: JS, JS_IR, JS_IR_ES6
// IGNORE_BACKEND_K2: ANY
// STATUS: This must be red code anyway, KT-36188
// IGNORE_BACKEND: JS, JS_IR, JS_IR_ES6
// !JVM_DEFAULT_MODE: all
// JVM_TARGET: 1.8
@@ -1,6 +1,4 @@
// IGNORE_BACKEND: JS
// IGNORE_BACKEND_K2: ANY
// STATUS: This must be red code anyway, KT-36188
// Test for KT-36188 bug compatibility between non-IR and IR backends
@@ -1,6 +1,4 @@
// IGNORE_BACKEND: JS
// IGNORE_BACKEND_K2: ANY
// STATUS: This must be red code anyway, KT-36188
// Test for KT-36188 bug compatibility between non-IR and IR backends
@@ -11,5 +11,5 @@ open class Keker<P> {
}
class Implementation<P>() : Keker<P>(), SomeRandomOverride<P> {
override fun child(<!MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES!>props: Int<!>) {}
override fun child(<!MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION_WARNING!>props: Int<!>) {}
}
@@ -0,0 +1,16 @@
// LANGUAGE: +ProhibitAllMultipleDefaultsInheritedFromSupertypes
// ISSUE: KT-36188
interface SomeRandomBase<K> {
fun child(props: Int = 20)
}
interface SomeRandomOverride<J> : SomeRandomBase<J>
open class Keker<P> {
open fun child(props: Int = 10) {}
}
class Implementation<P>() : Keker<P>(), SomeRandomOverride<P> {
override fun child(<!MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION_ERROR!>props: Int<!>) {}
}
@@ -0,0 +1,16 @@
// LANGUAGE: +ProhibitAllMultipleDefaultsInheritedFromSupertypes
// ISSUE: KT-36188
interface SomeRandomBase<K> {
fun child(props: Int = 20)
}
interface SomeRandomOverride<J> : SomeRandomBase<J>
open class Keker<P> {
open fun child(props: Int = 10) {}
}
class Implementation<P>() : Keker<P>(), SomeRandomOverride<P> {
override fun child(props: Int) {}
}
@@ -13,5 +13,5 @@ open class Keker<P> {
}
class Implementation<P>() : Keker<P>(), SomeRandomOverride<P> {
override fun child(<!MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES!>props: Int<!>) {}
override fun child(<!MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION_WARNING!>props: Int<!>) {}
}
@@ -13,5 +13,5 @@ open class Keker<P> {
}
class Implementation<P>() : Keker<P>(), SomeRandomOverride<P> {
override fun child(<!MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES!>props: Int<!>) {}
override fun child(<!MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION_WARNING!>props: Int<!>) {}
}
@@ -0,0 +1,23 @@
// ISSUE: KT-60269
// WITH_STDLIB
interface Foo {
fun foo(param: Int = 1)
}
interface Bar {
fun foo(param: Int = 2)
}
interface Baz1 : Bar
class Baz : Baz1, Foo {
override fun foo(<!MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION_WARNING!>param: Int<!>) {
println(param)
}
}
fun main() {
Baz().foo()
(Baz() as Foo).foo()
}
@@ -0,0 +1,23 @@
// ISSUE: KT-60269
// WITH_STDLIB
interface Foo {
fun foo(param: Int = 1)
}
interface Bar {
fun foo(param: Int = 2)
}
interface Baz1 : Bar
class Baz : Baz1, Foo {
override fun foo(param: Int) {
println(param)
}
}
fun main() {
Baz().foo()
(Baz() as Foo).foo()
}
@@ -0,0 +1,22 @@
// FIR_IDENTICAL
// ISSUE: KT-60269
// WITH_STDLIB
interface Foo {
fun foo(param: Int = 1)
}
interface Bar {
fun foo(param: Int = 2)
}
class Baz : Bar, Foo {
override fun foo(<!MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES!>param: Int<!>) {
println(param)
}
}
fun main() {
Baz().foo()
(Baz() as Foo).foo()
}
@@ -0,0 +1,19 @@
// FIR_IDENTICAL
// ISSUE: KT-57076
// WITH_STDLIB
interface I01 {
fun some(x: Int = 1, y: Int)
}
open class C01 {
open fun some(x: Int = -1, y: Int = 2) {
println("x = $x y = $y")
}
}
<!MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_WHEN_NO_EXPLICIT_OVERRIDE!>class C02<!>: C01(), I01
fun main(){
C02().some() // K2: x = -1 y = 2
}
@@ -0,0 +1,14 @@
// FIR_IDENTICAL
// ISSUE: KT-36188
interface A {
fun foo(a: String = "Fail"): String
}
interface B {
fun foo(a: String = "OK"): String
}
class Impl : A, B {
override fun foo(<!MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES!>a: String<!>) = a
}
fun box(): String = Impl().foo()
@@ -0,0 +1,14 @@
// ISSUE: KT-36188
interface A {
fun foo(a: String = "Fail"): String
}
interface A2 : A
interface B {
fun foo(a: String = "OK"): String
}
class Impl : A2, B {
override fun foo(<!MULTIPLE_DEFAULTS_INHERITED_FROM_SUPERTYPES_DEPRECATION_WARNING!>a: String<!>) = a
}
fun box(): String = Impl().foo()
@@ -0,0 +1,14 @@
// ISSUE: KT-36188
interface A {
fun foo(a: String = "Fail"): String
}
interface A2 : A
interface B {
fun foo(a: String = "OK"): String
}
class Impl : A2, B {
override fun foo(a: String) = a
}
fun box(): String = Impl().foo()
@@ -357,6 +357,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/tests/falseNegativeDuplicateDefaultValues1.kt");
}
@Test
@TestMetadata("falseNegativeDuplicateDefaultValues1_error.kt")
public void testFalseNegativeDuplicateDefaultValues1_error() throws Exception {
runTest("compiler/testData/diagnostics/tests/falseNegativeDuplicateDefaultValues1_error.kt");
}
@Test
@TestMetadata("falseNegativeDuplicateDefaultValues2.kt")
public void testFalseNegativeDuplicateDefaultValues2() throws Exception {
@@ -753,12 +759,30 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/tests/missingIteratorMissing.kt");
}
@Test
@TestMetadata("missingMultipleDefaultsOnTransitiveInheritance1.kt")
public void testMissingMultipleDefaultsOnTransitiveInheritance1() throws Exception {
runTest("compiler/testData/diagnostics/tests/missingMultipleDefaultsOnTransitiveInheritance1.kt");
}
@Test
@TestMetadata("missingMultipleDefaultsOnTransitiveInheritance2.kt")
public void testMissingMultipleDefaultsOnTransitiveInheritance2() throws Exception {
runTest("compiler/testData/diagnostics/tests/missingMultipleDefaultsOnTransitiveInheritance2.kt");
}
@Test
@TestMetadata("missingWrongAnnotationTarget.kt")
public void testMissingWrongAnnotationTarget() throws Exception {
runTest("compiler/testData/diagnostics/tests/missingWrongAnnotationTarget.kt");
}
@Test
@TestMetadata("moreThanOneOverriddenMissingK2.kt")
public void testMoreThanOneOverriddenMissingK2() throws Exception {
runTest("compiler/testData/diagnostics/tests/moreThanOneOverriddenMissingK2.kt");
}
@Test
@TestMetadata("MultilineStringTemplates.kt")
public void testMultilineStringTemplates() throws Exception {
@@ -771,6 +795,18 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest {
runTest("compiler/testData/diagnostics/tests/MultipleBounds.kt");
}
@Test
@TestMetadata("multipleDefaultsIncorrectlyAllowed1.kt")
public void testMultipleDefaultsIncorrectlyAllowed1() throws Exception {
runTest("compiler/testData/diagnostics/tests/multipleDefaultsIncorrectlyAllowed1.kt");
}
@Test
@TestMetadata("multipleDefaultsIncorrectlyAllowed2.kt")
public void testMultipleDefaultsIncorrectlyAllowed2() throws Exception {
runTest("compiler/testData/diagnostics/tests/multipleDefaultsIncorrectlyAllowed2.kt");
}
@Test
@TestMetadata("multipleDefaultsNoSource.kt")
public void testMultipleDefaultsNoSource() throws Exception {
@@ -349,6 +349,7 @@ enum class LanguageFeature(
AllowResultInReturnType(null),
MultiPlatformProjects(sinceVersion = null),
ProhibitComparisonOfIncompatibleClasses(sinceVersion = null, kind = BUG_FIX),
ProhibitAllMultipleDefaultsInheritedFromSupertypes(sinceVersion = null, kind = BUG_FIX),
ExplicitBackingFields(sinceVersion = null, kind = UNSTABLE_FEATURE),
FunctionalTypeWithExtensionAsSupertype(sinceVersion = null),
JsAllowInvalidCharsIdentifiersEscaping(sinceVersion = null, kind = UNSTABLE_FEATURE),