diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirKeywordUtils.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirKeywordUtils.kt index 66d8e59324b..d4a02e1753f 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirKeywordUtils.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/FirKeywordUtils.kt @@ -12,6 +12,8 @@ import com.intellij.util.diff.FlyweightCapableTreeStructure import org.jetbrains.kotlin.* import org.jetbrains.kotlin.diagnostics.valOrVarKeyword import org.jetbrains.kotlin.fir.FirElement +import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol +import org.jetbrains.kotlin.fir.symbols.SymbolInternals import org.jetbrains.kotlin.lexer.KtKeywordToken import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtTokens @@ -101,6 +103,9 @@ fun FirElement.getModifier(token: KtModifierKeywordToken): FirModifier<*>? = sou fun FirElement.hasModifier(token: KtModifierKeywordToken): Boolean = token in source.getModifierList() +@OptIn(SymbolInternals::class) +fun FirBasedSymbol<*>.hasModifier(token: KtModifierKeywordToken): Boolean = fir.hasModifier(token) + internal val KtSourceElement?.valOrVarKeyword: KtKeywordToken? get() = when (this) { null -> null diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt index cf9366fdf60..befde8ffd13 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirOverrideChecker.kt @@ -16,6 +16,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirOptInUsageBaseChecker import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirOptInUsageBaseChecker.Experimentality import org.jetbrains.kotlin.fir.analysis.checkers.getContainingClassSymbol +import org.jetbrains.kotlin.fir.analysis.checkers.hasModifier import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.analysis.overridesBackwardCompatibilityHelper @@ -37,6 +38,7 @@ import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.visibilityChecker +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.types.AbstractTypeChecker import org.jetbrains.kotlin.types.TypeCheckerState @@ -250,8 +252,9 @@ object FirOverrideChecker : FirClassChecker() { context: CheckerContext ) { val overriddenMemberSymbols = firTypeScope.retrieveDirectOverriddenOf(member) + val hasOverrideKeyword = member.hasModifier(KtTokens.OVERRIDE_KEYWORD) - if (!member.isOverride) { + if (!member.isOverride || !hasOverrideKeyword) { if (overriddenMemberSymbols.isEmpty() || context.session.overridesBackwardCompatibilityHelper.overrideCanBeOmitted(overriddenMemberSymbols, context) ) { diff --git a/compiler/testData/diagnostics/tests/override/Generics.fir.kt b/compiler/testData/diagnostics/tests/override/Generics.fir.kt index 8008eaa8b11..2665e91c877 100644 --- a/compiler/testData/diagnostics/tests/override/Generics.fir.kt +++ b/compiler/testData/diagnostics/tests/override/Generics.fir.kt @@ -23,8 +23,8 @@ open class MyGenericClass(t : T) : MyTrait, MyAbstractClass(), MyProps< class MyChildClass() : MyGenericClass(1) {} class MyChildClass1(t : T) : MyGenericClass(t) {} class MyChildClass2(t : T) : MyGenericClass(t) { - fun foo(t: T) = t - val pr : T = t + fun foo(t: T) = t + val pr : T = t override fun bar(t: T) = t override val p : T = t } diff --git a/compiler/testData/diagnostics/tests/override/NonGenerics.fir.kt b/compiler/testData/diagnostics/tests/override/NonGenerics.fir.kt deleted file mode 100644 index bb64f28b59d..00000000000 --- a/compiler/testData/diagnostics/tests/override/NonGenerics.fir.kt +++ /dev/null @@ -1,50 +0,0 @@ -package override.normal - -interface MyTrait { - fun foo() - val pr : Unit -} - -abstract class MyAbstractClass { - abstract fun bar() - abstract val prr : Unit - -} - -open class MyClass() : MyTrait, MyAbstractClass() { - override fun foo() {} - override fun bar() {} - - override val pr : Unit = Unit - override val prr : Unit = Unit -} - -class MyChildClass() : MyClass() {} - -class MyIllegalClass : MyTrait, MyAbstractClass() {} - -class MyIllegalClass2() : MyTrait, MyAbstractClass() { - override fun foo() {} - override val pr : Unit = Unit - override val prr : Unit = Unit -} - -class MyIllegalClass3() : MyTrait, MyAbstractClass() { - override fun bar() {} - override val pr : Unit = Unit - override val prr : Unit = Unit -} - -class MyIllegalClass4() : MyTrait, MyAbstractClass() { - fun foo() {} - val pr : Unit - override fun other() {} - override val otherPr : Int = 1 -} - -class MyChildClass1() : MyClass() { - fun foo() {} - val pr : Unit = Unit - override fun bar() {} - override val prr : Unit = Unit -} diff --git a/compiler/testData/diagnostics/tests/override/NonGenerics.kt b/compiler/testData/diagnostics/tests/override/NonGenerics.kt index a222e84992c..d5032cb43fb 100644 --- a/compiler/testData/diagnostics/tests/override/NonGenerics.kt +++ b/compiler/testData/diagnostics/tests/override/NonGenerics.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL package override.normal interface MyTrait {