[FIR] Don't miss VIRTUAL_MEMBER_HIDDEN
^KT-59925 Fixed
This commit is contained in:
committed by
Space Team
parent
bab00255dc
commit
34cb9aa659
+5
@@ -12,6 +12,8 @@ import com.intellij.util.diff.FlyweightCapableTreeStructure
|
|||||||
import org.jetbrains.kotlin.*
|
import org.jetbrains.kotlin.*
|
||||||
import org.jetbrains.kotlin.diagnostics.valOrVarKeyword
|
import org.jetbrains.kotlin.diagnostics.valOrVarKeyword
|
||||||
import org.jetbrains.kotlin.fir.FirElement
|
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.KtKeywordToken
|
||||||
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
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()
|
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?
|
internal val KtSourceElement?.valOrVarKeyword: KtKeywordToken?
|
||||||
get() = when (this) {
|
get() = when (this) {
|
||||||
null -> null
|
null -> null
|
||||||
|
|||||||
+4
-1
@@ -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
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirOptInUsageBaseChecker.Experimentality
|
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.getContainingClassSymbol
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.hasModifier
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope
|
import org.jetbrains.kotlin.fir.analysis.checkers.unsubstitutedScope
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||||
import org.jetbrains.kotlin.fir.analysis.overridesBackwardCompatibilityHelper
|
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.symbols.impl.*
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
import org.jetbrains.kotlin.fir.visibilityChecker
|
import org.jetbrains.kotlin.fir.visibilityChecker
|
||||||
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||||
import org.jetbrains.kotlin.types.TypeCheckerState
|
import org.jetbrains.kotlin.types.TypeCheckerState
|
||||||
|
|
||||||
@@ -250,8 +252,9 @@ object FirOverrideChecker : FirClassChecker() {
|
|||||||
context: CheckerContext
|
context: CheckerContext
|
||||||
) {
|
) {
|
||||||
val overriddenMemberSymbols = firTypeScope.retrieveDirectOverriddenOf(member)
|
val overriddenMemberSymbols = firTypeScope.retrieveDirectOverriddenOf(member)
|
||||||
|
val hasOverrideKeyword = member.hasModifier(KtTokens.OVERRIDE_KEYWORD)
|
||||||
|
|
||||||
if (!member.isOverride) {
|
if (!member.isOverride || !hasOverrideKeyword) {
|
||||||
if (overriddenMemberSymbols.isEmpty() ||
|
if (overriddenMemberSymbols.isEmpty() ||
|
||||||
context.session.overridesBackwardCompatibilityHelper.overrideCanBeOmitted(overriddenMemberSymbols, context)
|
context.session.overridesBackwardCompatibilityHelper.overrideCanBeOmitted(overriddenMemberSymbols, context)
|
||||||
) {
|
) {
|
||||||
|
|||||||
@@ -23,8 +23,8 @@ open class MyGenericClass<T>(t : T) : MyTrait<T>, MyAbstractClass<T>(), MyProps<
|
|||||||
class MyChildClass() : MyGenericClass<Int>(1) {}
|
class MyChildClass() : MyGenericClass<Int>(1) {}
|
||||||
class MyChildClass1<T>(t : T) : MyGenericClass<T>(t) {}
|
class MyChildClass1<T>(t : T) : MyGenericClass<T>(t) {}
|
||||||
class MyChildClass2<T>(t : T) : MyGenericClass<T>(t) {
|
class MyChildClass2<T>(t : T) : MyGenericClass<T>(t) {
|
||||||
fun foo(t: T) = t
|
fun <!VIRTUAL_MEMBER_HIDDEN!>foo<!>(t: T) = t
|
||||||
val pr : T = t
|
val <!VIRTUAL_MEMBER_HIDDEN!>pr<!> : T = t
|
||||||
override fun bar(t: T) = t
|
override fun bar(t: T) = t
|
||||||
override val p : T = t
|
override val p : T = t
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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() {}
|
|
||||||
|
|
||||||
<!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>class MyIllegalClass<!> : MyTrait, MyAbstractClass() {}
|
|
||||||
|
|
||||||
<!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>class MyIllegalClass2<!>() : MyTrait, MyAbstractClass() {
|
|
||||||
override fun foo() {}
|
|
||||||
override val pr : Unit = Unit
|
|
||||||
override val prr : Unit = Unit
|
|
||||||
}
|
|
||||||
|
|
||||||
<!ABSTRACT_MEMBER_NOT_IMPLEMENTED!>class MyIllegalClass3<!>() : MyTrait, MyAbstractClass() {
|
|
||||||
override fun bar() {}
|
|
||||||
override val pr : Unit = Unit
|
|
||||||
override val prr : Unit = Unit
|
|
||||||
}
|
|
||||||
|
|
||||||
<!ABSTRACT_CLASS_MEMBER_NOT_IMPLEMENTED!>class MyIllegalClass4<!>() : MyTrait, MyAbstractClass() {
|
|
||||||
fun <!VIRTUAL_MEMBER_HIDDEN!>foo<!>() {}
|
|
||||||
<!MUST_BE_INITIALIZED_OR_BE_ABSTRACT!>val <!VIRTUAL_MEMBER_HIDDEN!>pr<!> : Unit<!>
|
|
||||||
<!NOTHING_TO_OVERRIDE!>override<!> fun other() {}
|
|
||||||
<!NOTHING_TO_OVERRIDE!>override<!> val otherPr : Int = 1
|
|
||||||
}
|
|
||||||
|
|
||||||
class MyChildClass1() : MyClass() {
|
|
||||||
fun foo() {}
|
|
||||||
val pr : Unit = Unit
|
|
||||||
override fun bar() {}
|
|
||||||
override val prr : Unit = Unit
|
|
||||||
}
|
|
||||||
@@ -1,3 +1,4 @@
|
|||||||
|
// FIR_IDENTICAL
|
||||||
package override.normal
|
package override.normal
|
||||||
|
|
||||||
interface MyTrait {
|
interface MyTrait {
|
||||||
|
|||||||
Reference in New Issue
Block a user