[FIR] Quick fix FirModifierChecker
This commit is contained in:
committed by
TeamCityServer
parent
25124cca3d
commit
56b2a984ce
-6
@@ -877,12 +877,6 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
|
|||||||
val PROPERTY_FIELD_DECLARATION_MISSING_INITIALIZER by error<KtBackingField>()
|
val PROPERTY_FIELD_DECLARATION_MISSING_INITIALIZER by error<KtBackingField>()
|
||||||
val PROPERTY_MUST_HAVE_GETTER by error<KtProperty>()
|
val PROPERTY_MUST_HAVE_GETTER by error<KtProperty>()
|
||||||
val PROPERTY_MUST_HAVE_SETTER by error<KtProperty>()
|
val PROPERTY_MUST_HAVE_SETTER by error<KtProperty>()
|
||||||
val INAPPLICABLE_BACKING_FIELD_VISIBILITY by error<PsiElement> {
|
|
||||||
parameter<KtModifierKeywordToken>("modifier")
|
|
||||||
}
|
|
||||||
val INAPPLICABLE_BACKING_FIELD_MODIFIER by error<PsiElement> {
|
|
||||||
parameter<KtModifierKeywordToken>("modifier")
|
|
||||||
}
|
|
||||||
val EXPLICIT_BACKING_FIELD_IN_INTERFACE by error<KtBackingField>()
|
val EXPLICIT_BACKING_FIELD_IN_INTERFACE by error<KtBackingField>()
|
||||||
val EXPLICIT_BACKING_FIELD_IN_ABSTRACT_PROPERTY by error<KtBackingField>()
|
val EXPLICIT_BACKING_FIELD_IN_ABSTRACT_PROPERTY by error<KtBackingField>()
|
||||||
val ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS by error<KtModifierListOwner>(PositioningStrategy.ABSTRACT_MODIFIER)
|
val ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS by error<KtModifierListOwner>(PositioningStrategy.ABSTRACT_MODIFIER)
|
||||||
|
|||||||
@@ -484,8 +484,6 @@ object FirErrors {
|
|||||||
val PROPERTY_FIELD_DECLARATION_MISSING_INITIALIZER by error0<KtBackingField>()
|
val PROPERTY_FIELD_DECLARATION_MISSING_INITIALIZER by error0<KtBackingField>()
|
||||||
val PROPERTY_MUST_HAVE_GETTER by error0<KtProperty>()
|
val PROPERTY_MUST_HAVE_GETTER by error0<KtProperty>()
|
||||||
val PROPERTY_MUST_HAVE_SETTER by error0<KtProperty>()
|
val PROPERTY_MUST_HAVE_SETTER by error0<KtProperty>()
|
||||||
val INAPPLICABLE_BACKING_FIELD_VISIBILITY by error1<PsiElement, KtModifierKeywordToken>()
|
|
||||||
val INAPPLICABLE_BACKING_FIELD_MODIFIER by error1<PsiElement, KtModifierKeywordToken>()
|
|
||||||
val EXPLICIT_BACKING_FIELD_IN_INTERFACE by error0<KtBackingField>()
|
val EXPLICIT_BACKING_FIELD_IN_INTERFACE by error0<KtBackingField>()
|
||||||
val EXPLICIT_BACKING_FIELD_IN_ABSTRACT_PROPERTY by error0<KtBackingField>()
|
val EXPLICIT_BACKING_FIELD_IN_ABSTRACT_PROPERTY by error0<KtBackingField>()
|
||||||
val ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS by error0<KtModifierListOwner>(SourceElementPositioningStrategies.ABSTRACT_MODIFIER)
|
val ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS by error0<KtModifierListOwner>(SourceElementPositioningStrategies.ABSTRACT_MODIFIER)
|
||||||
|
|||||||
-1
@@ -62,7 +62,6 @@ object CommonDeclarationCheckers : DeclarationCheckers() {
|
|||||||
|
|
||||||
override val backingFieldCheckers: Set<FirBackingFieldChecker>
|
override val backingFieldCheckers: Set<FirBackingFieldChecker>
|
||||||
get() = setOf(
|
get() = setOf(
|
||||||
FirBackingFieldModifiersChecker,
|
|
||||||
FirExplicitBackingFieldInInterfaceChecker,
|
FirExplicitBackingFieldInInterfaceChecker,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -742,6 +742,7 @@ fun getActualTargetList(annotated: FirDeclaration): AnnotationTargetList {
|
|||||||
}
|
}
|
||||||
is FirTypeAlias -> TargetLists.T_TYPEALIAS
|
is FirTypeAlias -> TargetLists.T_TYPEALIAS
|
||||||
is FirPropertyAccessor -> if (annotated.isGetter) TargetLists.T_PROPERTY_GETTER else TargetLists.T_PROPERTY_SETTER
|
is FirPropertyAccessor -> if (annotated.isGetter) TargetLists.T_PROPERTY_GETTER else TargetLists.T_PROPERTY_SETTER
|
||||||
|
is FirBackingField -> TargetLists.T_BACKING_FIELD
|
||||||
is FirFile -> TargetLists.T_FILE
|
is FirFile -> TargetLists.T_FILE
|
||||||
is FirTypeParameter -> TargetLists.T_TYPE_PARAMETER
|
is FirTypeParameter -> TargetLists.T_TYPE_PARAMETER
|
||||||
is FirAnonymousInitializer -> TargetLists.T_INITIALIZER
|
is FirAnonymousInitializer -> TargetLists.T_INITIALIZER
|
||||||
|
|||||||
-46
@@ -1,46 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin.fir.analysis.checkers.declaration
|
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.FirModifier
|
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.getModifierList
|
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.toVisibilityOrNull
|
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.*
|
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirBackingField
|
|
||||||
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
|
||||||
|
|
||||||
object FirBackingFieldModifiersChecker : FirBackingFieldChecker() {
|
|
||||||
private val ALLOWED_MODIFIERS = setOf(
|
|
||||||
KtTokens.PRIVATE_KEYWORD,
|
|
||||||
KtTokens.INTERNAL_KEYWORD,
|
|
||||||
)
|
|
||||||
|
|
||||||
override fun check(declaration: FirBackingField, context: CheckerContext, reporter: DiagnosticReporter) {
|
|
||||||
val modifiers = declaration.source
|
|
||||||
?.getModifierList()
|
|
||||||
?.modifiers
|
|
||||||
?: return
|
|
||||||
|
|
||||||
modifiers.forEach {
|
|
||||||
if (it.token in ALLOWED_MODIFIERS) {
|
|
||||||
return@forEach
|
|
||||||
}
|
|
||||||
|
|
||||||
val diagnostic = reportInapplicable(it)
|
|
||||||
reporter.reportOn(it.source, diagnostic, it.token, context)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun reportInapplicable(modifier: FirModifier<*>): FirDiagnosticFactory1<KtModifierKeywordToken> {
|
|
||||||
return if (modifier.token.toVisibilityOrNull() != null) {
|
|
||||||
FirErrors.INAPPLICABLE_BACKING_FIELD_VISIBILITY
|
|
||||||
} else {
|
|
||||||
FirErrors.INAPPLICABLE_BACKING_FIELD_MODIFIER
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-12
@@ -270,8 +270,6 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MANY_LAMBDA_EXPRE
|
|||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.METHOD_OF_ANY_IMPLEMENTED_IN_INTERFACE
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.METHOD_OF_ANY_IMPLEMENTED_IN_INTERFACE
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MISPLACED_TYPE_PARAMETER_CONSTRAINTS
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MISPLACED_TYPE_PARAMETER_CONSTRAINTS
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MISSING_VAL_ON_ANNOTATION_PARAMETER
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MISSING_VAL_ON_ANNOTATION_PARAMETER
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INAPPLICABLE_BACKING_FIELD_MODIFIER
|
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.INAPPLICABLE_BACKING_FIELD_VISIBILITY
|
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MODIFIER_FORM_FOR_NON_BUILT_IN_SUSPEND
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MODIFIER_FORM_FOR_NON_BUILT_IN_SUSPEND
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MULTIPLE_VARARG_PARAMETERS
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MULTIPLE_VARARG_PARAMETERS
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MUST_BE_INITIALIZED
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MUST_BE_INITIALIZED
|
||||||
@@ -1291,16 +1289,6 @@ class FirDefaultErrorMessages {
|
|||||||
PROPERTY_MUST_HAVE_SETTER,
|
PROPERTY_MUST_HAVE_SETTER,
|
||||||
"This property needs a custom setter, because it's type is not a subtype of the backing field's type"
|
"This property needs a custom setter, because it's type is not a subtype of the backing field's type"
|
||||||
)
|
)
|
||||||
map.put(
|
|
||||||
INAPPLICABLE_BACKING_FIELD_VISIBILITY,
|
|
||||||
"Explicit backing field declarations may only be private or internal, but not ''{0}''",
|
|
||||||
TO_STRING
|
|
||||||
)
|
|
||||||
map.put(
|
|
||||||
INAPPLICABLE_BACKING_FIELD_MODIFIER,
|
|
||||||
"Modifier ''{0}'' is not applicable to explicit backing field declarations",
|
|
||||||
TO_STRING
|
|
||||||
)
|
|
||||||
map.put(
|
map.put(
|
||||||
EXPLICIT_BACKING_FIELD_IN_INTERFACE,
|
EXPLICIT_BACKING_FIELD_IN_INTERFACE,
|
||||||
"Backing fields are not allowed inside interfaces"
|
"Backing fields are not allowed inside interfaces"
|
||||||
|
|||||||
@@ -147,7 +147,7 @@ val featureDependenciesTargets = mapOf(
|
|||||||
val defaultVisibilityTargets: EnumSet<KotlinTarget> = EnumSet.of(
|
val defaultVisibilityTargets: EnumSet<KotlinTarget> = EnumSet.of(
|
||||||
KotlinTarget.CLASS_ONLY, KotlinTarget.OBJECT, KotlinTarget.INTERFACE, KotlinTarget.ENUM_CLASS, KotlinTarget.ANNOTATION_CLASS,
|
KotlinTarget.CLASS_ONLY, KotlinTarget.OBJECT, KotlinTarget.INTERFACE, KotlinTarget.ENUM_CLASS, KotlinTarget.ANNOTATION_CLASS,
|
||||||
KotlinTarget.MEMBER_FUNCTION, KotlinTarget.TOP_LEVEL_FUNCTION, KotlinTarget.PROPERTY_GETTER, KotlinTarget.PROPERTY_SETTER,
|
KotlinTarget.MEMBER_FUNCTION, KotlinTarget.TOP_LEVEL_FUNCTION, KotlinTarget.PROPERTY_GETTER, KotlinTarget.PROPERTY_SETTER,
|
||||||
KotlinTarget.MEMBER_PROPERTY, KotlinTarget.TOP_LEVEL_PROPERTY, KotlinTarget.CONSTRUCTOR, KotlinTarget.TYPEALIAS
|
KotlinTarget.MEMBER_PROPERTY, KotlinTarget.TOP_LEVEL_PROPERTY, KotlinTarget.CONSTRUCTOR, KotlinTarget.TYPEALIAS,
|
||||||
)
|
)
|
||||||
|
|
||||||
val possibleTargetMap = mapOf(
|
val possibleTargetMap = mapOf(
|
||||||
@@ -177,9 +177,9 @@ val possibleTargetMap = mapOf(
|
|||||||
SEALED_KEYWORD to EnumSet.of(KotlinTarget.CLASS_ONLY, KotlinTarget.INTERFACE),
|
SEALED_KEYWORD to EnumSet.of(KotlinTarget.CLASS_ONLY, KotlinTarget.INTERFACE),
|
||||||
INNER_KEYWORD to EnumSet.of(KotlinTarget.CLASS_ONLY),
|
INNER_KEYWORD to EnumSet.of(KotlinTarget.CLASS_ONLY),
|
||||||
OVERRIDE_KEYWORD to EnumSet.of(KotlinTarget.MEMBER_PROPERTY, KotlinTarget.MEMBER_FUNCTION),
|
OVERRIDE_KEYWORD to EnumSet.of(KotlinTarget.MEMBER_PROPERTY, KotlinTarget.MEMBER_FUNCTION),
|
||||||
PRIVATE_KEYWORD to defaultVisibilityTargets,
|
PRIVATE_KEYWORD to defaultVisibilityTargets + KotlinTarget.BACKING_FIELD,
|
||||||
PUBLIC_KEYWORD to defaultVisibilityTargets,
|
PUBLIC_KEYWORD to defaultVisibilityTargets,
|
||||||
INTERNAL_KEYWORD to defaultVisibilityTargets,
|
INTERNAL_KEYWORD to defaultVisibilityTargets + KotlinTarget.BACKING_FIELD,
|
||||||
PROTECTED_KEYWORD to EnumSet.of(
|
PROTECTED_KEYWORD to EnumSet.of(
|
||||||
KotlinTarget.CLASS_ONLY,
|
KotlinTarget.CLASS_ONLY,
|
||||||
KotlinTarget.OBJECT,
|
KotlinTarget.OBJECT,
|
||||||
|
|||||||
@@ -56,6 +56,8 @@ enum class KotlinTarget(val description: String, val isDefault: Boolean = true)
|
|||||||
TOP_LEVEL_PROPERTY_WITH_DELEGATE("top level property with delegate", false),
|
TOP_LEVEL_PROPERTY_WITH_DELEGATE("top level property with delegate", false),
|
||||||
TOP_LEVEL_PROPERTY_WITHOUT_FIELD_OR_DELEGATE("top level property without backing field or delegate", false),
|
TOP_LEVEL_PROPERTY_WITHOUT_FIELD_OR_DELEGATE("top level property without backing field or delegate", false),
|
||||||
|
|
||||||
|
BACKING_FIELD("backing field"),
|
||||||
|
|
||||||
INITIALIZER("initializer", false),
|
INITIALIZER("initializer", false),
|
||||||
DESTRUCTURING_DECLARATION("destructuring declaration", false),
|
DESTRUCTURING_DECLARATION("destructuring declaration", false),
|
||||||
LAMBDA_EXPRESSION("lambda expression", false),
|
LAMBDA_EXPRESSION("lambda expression", false),
|
||||||
|
|||||||
@@ -54,6 +54,7 @@ object AnnotationTargetLists {
|
|||||||
|
|
||||||
val T_PROPERTY_GETTER = targetList(PROPERTY_GETTER)
|
val T_PROPERTY_GETTER = targetList(PROPERTY_GETTER)
|
||||||
val T_PROPERTY_SETTER = targetList(PROPERTY_SETTER)
|
val T_PROPERTY_SETTER = targetList(PROPERTY_SETTER)
|
||||||
|
val T_BACKING_FIELD = targetList(BACKING_FIELD)
|
||||||
|
|
||||||
val T_VALUE_PARAMETER_WITHOUT_VAL = targetList(VALUE_PARAMETER)
|
val T_VALUE_PARAMETER_WITHOUT_VAL = targetList(VALUE_PARAMETER)
|
||||||
|
|
||||||
|
|||||||
-14
@@ -2430,20 +2430,6 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
|
|||||||
token,
|
token,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
add(FirErrors.INAPPLICABLE_BACKING_FIELD_VISIBILITY) { firDiagnostic ->
|
|
||||||
InapplicableBackingFieldVisibilityImpl(
|
|
||||||
firDiagnostic.a,
|
|
||||||
firDiagnostic as FirPsiDiagnostic,
|
|
||||||
token,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
add(FirErrors.INAPPLICABLE_BACKING_FIELD_MODIFIER) { firDiagnostic ->
|
|
||||||
InapplicableBackingFieldModifierImpl(
|
|
||||||
firDiagnostic.a,
|
|
||||||
firDiagnostic as FirPsiDiagnostic,
|
|
||||||
token,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
add(FirErrors.EXPLICIT_BACKING_FIELD_IN_INTERFACE) { firDiagnostic ->
|
add(FirErrors.EXPLICIT_BACKING_FIELD_IN_INTERFACE) { firDiagnostic ->
|
||||||
ExplicitBackingFieldInInterfaceImpl(
|
ExplicitBackingFieldInInterfaceImpl(
|
||||||
firDiagnostic as FirPsiDiagnostic,
|
firDiagnostic as FirPsiDiagnostic,
|
||||||
|
|||||||
-10
@@ -1719,16 +1719,6 @@ sealed class KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
|
|||||||
override val diagnosticClass get() = PropertyMustHaveSetter::class
|
override val diagnosticClass get() = PropertyMustHaveSetter::class
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class InapplicableBackingFieldVisibility : KtFirDiagnostic<PsiElement>() {
|
|
||||||
override val diagnosticClass get() = InapplicableBackingFieldVisibility::class
|
|
||||||
abstract val modifier: KtModifierKeywordToken
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract class InapplicableBackingFieldModifier : KtFirDiagnostic<PsiElement>() {
|
|
||||||
override val diagnosticClass get() = InapplicableBackingFieldModifier::class
|
|
||||||
abstract val modifier: KtModifierKeywordToken
|
|
||||||
}
|
|
||||||
|
|
||||||
abstract class ExplicitBackingFieldInInterface : KtFirDiagnostic<KtBackingField>() {
|
abstract class ExplicitBackingFieldInInterface : KtFirDiagnostic<KtBackingField>() {
|
||||||
override val diagnosticClass get() = ExplicitBackingFieldInInterface::class
|
override val diagnosticClass get() = ExplicitBackingFieldInInterface::class
|
||||||
}
|
}
|
||||||
|
|||||||
+7
@@ -2818,6 +2818,13 @@ internal class ExplicitBackingFieldInAbstractPropertyImpl(
|
|||||||
override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic)
|
override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal class AbstractPropertyInPrimaryConstructorParametersImpl(
|
||||||
|
firDiagnostic: FirPsiDiagnostic,
|
||||||
|
override val token: ValidityToken,
|
||||||
|
) : KtFirDiagnostic.AbstractPropertyInPrimaryConstructorParameters(), KtAbstractFirDiagnostic<KtModifierListOwner> {
|
||||||
|
override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic)
|
||||||
|
}
|
||||||
|
|
||||||
internal class ExpectedDeclarationWithBodyImpl(
|
internal class ExpectedDeclarationWithBodyImpl(
|
||||||
firDiagnostic: FirPsiDiagnostic,
|
firDiagnostic: FirPsiDiagnostic,
|
||||||
override val token: ValidityToken,
|
override val token: ValidityToken,
|
||||||
|
|||||||
Reference in New Issue
Block a user