FIR: drop JVM_DEFAULT_THROUGH_INHERITANCE diagnostic (FE 1.0 sync)
This commit is contained in:
committed by
TeamCityServer
parent
e1ca5fe344
commit
178290eac3
-6
@@ -4110,12 +4110,6 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
|
|||||||
token,
|
token,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
add(FirJvmErrors.JVM_DEFAULT_THROUGH_INHERITANCE) { firDiagnostic ->
|
|
||||||
JvmDefaultThroughInheritanceImpl(
|
|
||||||
firDiagnostic as KtPsiDiagnostic,
|
|
||||||
token,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
add(FirJvmErrors.USAGE_OF_JVM_DEFAULT_THROUGH_SUPER_CALL) { firDiagnostic ->
|
add(FirJvmErrors.USAGE_OF_JVM_DEFAULT_THROUGH_SUPER_CALL) { firDiagnostic ->
|
||||||
UsageOfJvmDefaultThroughSuperCallImpl(
|
UsageOfJvmDefaultThroughSuperCallImpl(
|
||||||
firDiagnostic as KtPsiDiagnostic,
|
firDiagnostic as KtPsiDiagnostic,
|
||||||
|
|||||||
-4
@@ -2859,10 +2859,6 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
|
|||||||
abstract val annotation: String
|
abstract val annotation: String
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class JvmDefaultThroughInheritance : KtFirDiagnostic<KtDeclaration>() {
|
|
||||||
override val diagnosticClass get() = JvmDefaultThroughInheritance::class
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract class UsageOfJvmDefaultThroughSuperCall : KtFirDiagnostic<PsiElement>() {
|
abstract class UsageOfJvmDefaultThroughSuperCall : KtFirDiagnostic<PsiElement>() {
|
||||||
override val diagnosticClass get() = UsageOfJvmDefaultThroughSuperCall::class
|
override val diagnosticClass get() = UsageOfJvmDefaultThroughSuperCall::class
|
||||||
}
|
}
|
||||||
|
|||||||
-5
@@ -3456,11 +3456,6 @@ internal class JvmDefaultInDeclarationImpl(
|
|||||||
override val token: ValidityToken,
|
override val token: ValidityToken,
|
||||||
) : KtFirDiagnostic.JvmDefaultInDeclaration(), KtAbstractFirDiagnostic<KtElement>
|
) : KtFirDiagnostic.JvmDefaultInDeclaration(), KtAbstractFirDiagnostic<KtElement>
|
||||||
|
|
||||||
internal class JvmDefaultThroughInheritanceImpl(
|
|
||||||
override val firDiagnostic: KtPsiDiagnostic,
|
|
||||||
override val token: ValidityToken,
|
|
||||||
) : KtFirDiagnostic.JvmDefaultThroughInheritance(), KtAbstractFirDiagnostic<KtDeclaration>
|
|
||||||
|
|
||||||
internal class UsageOfJvmDefaultThroughSuperCallImpl(
|
internal class UsageOfJvmDefaultThroughSuperCallImpl(
|
||||||
override val firDiagnostic: KtPsiDiagnostic,
|
override val firDiagnostic: KtPsiDiagnostic,
|
||||||
override val token: ValidityToken,
|
override val token: ValidityToken,
|
||||||
|
|||||||
-1
@@ -112,7 +112,6 @@ object JVM_DIAGNOSTICS_LIST : DiagnosticList("FirJvmErrors") {
|
|||||||
val JVM_DEFAULT_IN_DECLARATION by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) {
|
val JVM_DEFAULT_IN_DECLARATION by error<KtElement>(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) {
|
||||||
parameter<String>("annotation")
|
parameter<String>("annotation")
|
||||||
}
|
}
|
||||||
val JVM_DEFAULT_THROUGH_INHERITANCE by error<KtDeclaration>(PositioningStrategy.DECLARATION_SIGNATURE)
|
|
||||||
val USAGE_OF_JVM_DEFAULT_THROUGH_SUPER_CALL by error<PsiElement>()
|
val USAGE_OF_JVM_DEFAULT_THROUGH_SUPER_CALL by error<PsiElement>()
|
||||||
val NON_JVM_DEFAULT_OVERRIDES_JAVA_DEFAULT by warning<KtDeclaration>(PositioningStrategy.DECLARATION_SIGNATURE)
|
val NON_JVM_DEFAULT_OVERRIDES_JAVA_DEFAULT by warning<KtDeclaration>(PositioningStrategy.DECLARATION_SIGNATURE)
|
||||||
}
|
}
|
||||||
|
|||||||
-1
@@ -93,7 +93,6 @@ object FirJvmErrors {
|
|||||||
val JVM_DEFAULT_IN_JVM6_TARGET by error1<PsiElement, String>()
|
val JVM_DEFAULT_IN_JVM6_TARGET by error1<PsiElement, String>()
|
||||||
val JVM_DEFAULT_REQUIRED_FOR_OVERRIDE by error0<KtDeclaration>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE)
|
val JVM_DEFAULT_REQUIRED_FOR_OVERRIDE by error0<KtDeclaration>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE)
|
||||||
val JVM_DEFAULT_IN_DECLARATION by error1<KtElement, String>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
|
val JVM_DEFAULT_IN_DECLARATION by error1<KtElement, String>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT)
|
||||||
val JVM_DEFAULT_THROUGH_INHERITANCE by error0<KtDeclaration>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE)
|
|
||||||
val USAGE_OF_JVM_DEFAULT_THROUGH_SUPER_CALL by error0<PsiElement>()
|
val USAGE_OF_JVM_DEFAULT_THROUGH_SUPER_CALL by error0<PsiElement>()
|
||||||
val NON_JVM_DEFAULT_OVERRIDES_JAVA_DEFAULT by warning0<KtDeclaration>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE)
|
val NON_JVM_DEFAULT_OVERRIDES_JAVA_DEFAULT by warning0<KtDeclaration>(SourceElementPositioningStrategies.DECLARATION_SIGNATURE)
|
||||||
|
|
||||||
|
|||||||
-5
@@ -36,7 +36,6 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_DEFAUL
|
|||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_DEFAULT_IN_JVM6_TARGET
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_DEFAULT_IN_JVM6_TARGET
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_DEFAULT_NOT_IN_INTERFACE
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_DEFAULT_NOT_IN_INTERFACE
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_DEFAULT_REQUIRED_FOR_OVERRIDE
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_DEFAULT_REQUIRED_FOR_OVERRIDE
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_DEFAULT_THROUGH_INHERITANCE
|
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_INLINE_WITHOUT_VALUE_CLASS
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_INLINE_WITHOUT_VALUE_CLASS
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_PACKAGE_NAME_CANNOT_BE_EMPTY
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_PACKAGE_NAME_CANNOT_BE_EMPTY
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_PACKAGE_NAME_MUST_BE_VALID_NAME
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.jvm.FirJvmErrors.JVM_PACKAGE_NAME_MUST_BE_VALID_NAME
|
||||||
@@ -177,10 +176,6 @@ object FirJvmErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
|
|||||||
)
|
)
|
||||||
map.put(JVM_DEFAULT_REQUIRED_FOR_OVERRIDE, "'@JvmDefault' is required for an override of a '@JvmDefault' member")
|
map.put(JVM_DEFAULT_REQUIRED_FOR_OVERRIDE, "'@JvmDefault' is required for an override of a '@JvmDefault' member")
|
||||||
map.put(JVM_DEFAULT_IN_DECLARATION, "Usage of ''@{0}'' is only allowed with -Xjvm-default option", STRING)
|
map.put(JVM_DEFAULT_IN_DECLARATION, "Usage of ''@{0}'' is only allowed with -Xjvm-default option", STRING)
|
||||||
map.put(
|
|
||||||
JVM_DEFAULT_THROUGH_INHERITANCE,
|
|
||||||
"Inheritance from an interface with '@JvmDefault' members is only allowed with -Xjvm-default option"
|
|
||||||
)
|
|
||||||
map.put(
|
map.put(
|
||||||
USAGE_OF_JVM_DEFAULT_THROUGH_SUPER_CALL,
|
USAGE_OF_JVM_DEFAULT_THROUGH_SUPER_CALL,
|
||||||
"Super calls of '@JvmDefault' members are only allowed with -Xjvm-default option"
|
"Super calls of '@JvmDefault' members are only allowed with -Xjvm-default option"
|
||||||
|
|||||||
-43
@@ -22,10 +22,8 @@ import org.jetbrains.kotlin.fir.declarations.utils.isInterface
|
|||||||
import org.jetbrains.kotlin.fir.declarations.utils.modality
|
import org.jetbrains.kotlin.fir.declarations.utils.modality
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||||
import org.jetbrains.kotlin.fir.java.jvmDefaultModeState
|
import org.jetbrains.kotlin.fir.java.jvmDefaultModeState
|
||||||
import org.jetbrains.kotlin.fir.resolve.toFirRegularClassSymbol
|
|
||||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||||
import org.jetbrains.kotlin.fir.scopes.getDirectOverriddenFunctions
|
import org.jetbrains.kotlin.fir.scopes.getDirectOverriddenFunctions
|
||||||
import org.jetbrains.kotlin.fir.scopes.impl.FirClassUseSiteMemberScope
|
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirIntersectionCallableSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirIntersectionCallableSymbol
|
||||||
import org.jetbrains.kotlin.name.JvmNames.JVM_DEFAULT_CLASS_ID
|
import org.jetbrains.kotlin.name.JvmNames.JVM_DEFAULT_CLASS_ID
|
||||||
@@ -71,50 +69,9 @@ object FirJvmDefaultChecker : FirBasicDeclarationChecker() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (declaration is FirClass) {
|
|
||||||
val unsubstitutedScope = declaration.unsubstitutedScope(context)
|
|
||||||
val hasDeclaredJvmDefaults = unsubstitutedScope is FirClassUseSiteMemberScope &&
|
|
||||||
unsubstitutedScope.directOverriddenFunctions.keys.any {
|
|
||||||
it.isCompiledToJvmDefault(jvmDefaultMode)
|
|
||||||
}
|
|
||||||
if (!hasDeclaredJvmDefaults && !declaration.checkJvmDefaultsInHierarchy(jvmDefaultMode, context)) {
|
|
||||||
reporter.reportOn(declaration.source, FirJvmErrors.JVM_DEFAULT_THROUGH_INHERITANCE, context)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
checkNonJvmDefaultOverridesJavaDefault(defaultAnnotation, jvmDefaultMode, declaration, context, reporter)
|
checkNonJvmDefaultOverridesJavaDefault(defaultAnnotation, jvmDefaultMode, declaration, context, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun FirDeclaration.checkJvmDefaultsInHierarchy(jvmDefaultMode: JvmDefaultMode, context: CheckerContext): Boolean {
|
|
||||||
if (jvmDefaultMode.isEnabled) return true
|
|
||||||
|
|
||||||
if (this !is FirClass) return true
|
|
||||||
|
|
||||||
val unsubstitutedScope = unsubstitutedScope(context)
|
|
||||||
if (unsubstitutedScope is FirClassUseSiteMemberScope) {
|
|
||||||
val directOverriddenFunctions = unsubstitutedScope.directOverriddenFunctions.flatMap { it.value }.toSet()
|
|
||||||
|
|
||||||
for (key in unsubstitutedScope.overrideByBase.keys) {
|
|
||||||
if (directOverriddenFunctions.contains(key)) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if (key.getOverriddenDeclarations().all {
|
|
||||||
it.modality == Modality.ABSTRACT ||
|
|
||||||
!it.isCompiledToJvmDefaultWithProperMode(jvmDefaultMode) ||
|
|
||||||
it.containingClass()?.toFirRegularClassSymbol(context.session)?.isInterface != true
|
|
||||||
}
|
|
||||||
) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun checkNonJvmDefaultOverridesJavaDefault(
|
private fun checkNonJvmDefaultOverridesJavaDefault(
|
||||||
defaultAnnotation: FirAnnotation?,
|
defaultAnnotation: FirAnnotation?,
|
||||||
jvmDefaultMode: JvmDefaultMode,
|
jvmDefaultMode: JvmDefaultMode,
|
||||||
|
|||||||
Vendored
+6
-6
@@ -6,12 +6,12 @@ interface A {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface <!JVM_DEFAULT_THROUGH_INHERITANCE!>B<!> : A {
|
interface B : A {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
open class <!JVM_DEFAULT_THROUGH_INHERITANCE!>Foo<!> : B
|
open class Foo : B
|
||||||
open class <!JVM_DEFAULT_THROUGH_INHERITANCE!>Foo2<!> : B, A
|
open class Foo2 : B, A
|
||||||
|
|
||||||
open class FooNoError : B {
|
open class FooNoError : B {
|
||||||
override fun test() {
|
override fun test() {
|
||||||
@@ -22,9 +22,9 @@ open class Foo2NoError : B, A {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class <!JVM_DEFAULT_THROUGH_INHERITANCE!>Bar<!> : Foo()
|
class Bar : Foo()
|
||||||
class <!JVM_DEFAULT_THROUGH_INHERITANCE!>Bar2<!> : Foo(), A
|
class Bar2 : Foo(), A
|
||||||
class <!JVM_DEFAULT_THROUGH_INHERITANCE!>Bar3<!> : Foo(), B
|
class Bar3 : Foo(), B
|
||||||
|
|
||||||
open class BarWithJvmDefault : B {
|
open class BarWithJvmDefault : B {
|
||||||
<!JVM_DEFAULT_NOT_IN_INTERFACE!>@<!DEPRECATION!>JvmDefault<!><!>
|
<!JVM_DEFAULT_NOT_IN_INTERFACE!>@<!DEPRECATION!>JvmDefault<!><!>
|
||||||
|
|||||||
+5
-5
@@ -7,7 +7,7 @@ interface A {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// FILE: 2.kt
|
// FILE: 2.kt
|
||||||
interface <!JVM_DEFAULT_THROUGH_INHERITANCE!>B<!> : A {
|
interface B : A {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -23,7 +23,7 @@ open class Foo : B {
|
|||||||
super.test()
|
super.test()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
open class <!JVM_DEFAULT_THROUGH_INHERITANCE!>Foo2<!> : B
|
open class Foo2 : B
|
||||||
|
|
||||||
open class Bar : Foo2() {
|
open class Bar : Foo2() {
|
||||||
override fun test() {
|
override fun test() {
|
||||||
@@ -37,7 +37,7 @@ open class Bar2 : Bar() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class <!JVM_DEFAULT_THROUGH_INHERITANCE!>ManySupers<!>: Foo2(), B {
|
class ManySupers: Foo2(), B {
|
||||||
fun foo() {
|
fun foo() {
|
||||||
super<Foo2>.test()
|
super<Foo2>.test()
|
||||||
super<<!QUALIFIED_SUPERTYPE_EXTENDED_BY_OTHER_SUPERTYPE!>B<!>>.test()
|
super<<!QUALIFIED_SUPERTYPE_EXTENDED_BY_OTHER_SUPERTYPE!>B<!>>.test()
|
||||||
@@ -45,7 +45,7 @@ class <!JVM_DEFAULT_THROUGH_INHERITANCE!>ManySupers<!>: Foo2(), B {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class <!JVM_DEFAULT_THROUGH_INHERITANCE!>ManySupers2<!>: Foo2(), C {
|
class ManySupers2: Foo2(), C {
|
||||||
fun foo() {
|
fun foo() {
|
||||||
super<Foo2>.test()
|
super<Foo2>.test()
|
||||||
super<C>.test()
|
super<C>.test()
|
||||||
@@ -53,7 +53,7 @@ class <!JVM_DEFAULT_THROUGH_INHERITANCE!>ManySupers2<!>: Foo2(), C {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
<!MANY_IMPL_MEMBER_NOT_IMPLEMENTED!>class <!JVM_DEFAULT_THROUGH_INHERITANCE!>ManySupers3<!><!>: Bar2(), C {
|
<!MANY_IMPL_MEMBER_NOT_IMPLEMENTED!>class ManySupers3<!>: Bar2(), C {
|
||||||
fun foo() {
|
fun foo() {
|
||||||
super<Bar2>.test()
|
super<Bar2>.test()
|
||||||
super<C>.test()
|
super<C>.test()
|
||||||
|
|||||||
Vendored
+2
-2
@@ -10,9 +10,9 @@ interface B{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
<!MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED!>interface <!JVM_DEFAULT_THROUGH_INHERITANCE!>AB<!><!>: A, B
|
<!MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED!>interface AB<!>: A, B
|
||||||
|
|
||||||
<!MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED!>interface <!JVM_DEFAULT_THROUGH_INHERITANCE!>BA<!><!>: B, A
|
<!MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED!>interface BA<!>: B, A
|
||||||
|
|
||||||
|
|
||||||
interface C : A, B {
|
interface C : A, B {
|
||||||
|
|||||||
Vendored
+3
-3
@@ -9,8 +9,8 @@ interface A {
|
|||||||
interface B{
|
interface B{
|
||||||
fun test()
|
fun test()
|
||||||
}
|
}
|
||||||
<!MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED!>interface <!JVM_DEFAULT_THROUGH_INHERITANCE!>AB<!><!> : A, B
|
<!MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED!>interface AB<!> : A, B
|
||||||
<!MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED!>interface <!JVM_DEFAULT_THROUGH_INHERITANCE!>BA<!><!> : B, A
|
<!MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED!>interface BA<!> : B, A
|
||||||
|
|
||||||
class C : A, B {
|
class C : A, B {
|
||||||
override fun test() {
|
override fun test() {
|
||||||
@@ -24,7 +24,7 @@ class D : B, A {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
<!MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED!>class <!JVM_DEFAULT_THROUGH_INHERITANCE!>E<!><!>: B, A {
|
<!MANY_INTERFACES_MEMBER_NOT_IMPLEMENTED!>class E<!>: B, A {
|
||||||
fun foo() {
|
fun foo() {
|
||||||
super<A>.test()
|
super<A>.test()
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user