[FIR] Add a modifiers diagnostic for the backing field
This commit is contained in:
committed by
TeamCityServer
parent
d4d43b9907
commit
47abdf2de1
+6
@@ -877,6 +877,12 @@ 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 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)
|
||||||
val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING by warning<KtProperty>(PositioningStrategy.TYPE_PARAMETERS_LIST)
|
val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING by warning<KtProperty>(PositioningStrategy.TYPE_PARAMETERS_LIST)
|
||||||
val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS by error<KtProperty>(PositioningStrategy.TYPE_PARAMETERS_LIST)
|
val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS by error<KtProperty>(PositioningStrategy.TYPE_PARAMETERS_LIST)
|
||||||
|
|||||||
@@ -484,6 +484,8 @@ 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 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)
|
||||||
val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING by warning0<KtProperty>(SourceElementPositioningStrategies.TYPE_PARAMETERS_LIST)
|
val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING by warning0<KtProperty>(SourceElementPositioningStrategies.TYPE_PARAMETERS_LIST)
|
||||||
val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS by error0<KtProperty>(SourceElementPositioningStrategies.TYPE_PARAMETERS_LIST)
|
val LOCAL_VARIABLE_WITH_TYPE_PARAMETERS by error0<KtProperty>(SourceElementPositioningStrategies.TYPE_PARAMETERS_LIST)
|
||||||
|
|||||||
+5
@@ -60,6 +60,11 @@ object CommonDeclarationCheckers : DeclarationCheckers() {
|
|||||||
FirLocalVariableTypeParametersSyntaxChecker,
|
FirLocalVariableTypeParametersSyntaxChecker,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
override val backingFieldCheckers: Set<FirBackingFieldChecker>
|
||||||
|
get() = setOf(
|
||||||
|
FirBackingFieldModifiersChecker,
|
||||||
|
)
|
||||||
|
|
||||||
override val classCheckers: Set<FirClassChecker>
|
override val classCheckers: Set<FirClassChecker>
|
||||||
get() = setOf(
|
get() = setOf(
|
||||||
FirOverrideChecker,
|
FirOverrideChecker,
|
||||||
|
|||||||
+46
@@ -0,0 +1,46 @@
|
|||||||
|
/*
|
||||||
|
* 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
@@ -268,6 +268,8 @@ 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
|
||||||
@@ -1287,6 +1289,16 @@ 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(ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS, "This property cannot be declared abstract")
|
map.put(ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS, "This property cannot be declared abstract")
|
||||||
map.put(LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING, "Type parameters for local variables are deprecated")
|
map.put(LOCAL_VARIABLE_WITH_TYPE_PARAMETERS_WARNING, "Type parameters for local variables are deprecated")
|
||||||
map.put(LOCAL_VARIABLE_WITH_TYPE_PARAMETERS, "Local variables are not allowed to have type parameters")
|
map.put(LOCAL_VARIABLE_WITH_TYPE_PARAMETERS, "Local variables are not allowed to have type parameters")
|
||||||
|
|||||||
+14
@@ -2430,6 +2430,20 @@ 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.ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS) { firDiagnostic ->
|
add(FirErrors.ABSTRACT_PROPERTY_IN_PRIMARY_CONSTRUCTOR_PARAMETERS) { firDiagnostic ->
|
||||||
AbstractPropertyInPrimaryConstructorParametersImpl(
|
AbstractPropertyInPrimaryConstructorParametersImpl(
|
||||||
firDiagnostic as FirPsiDiagnostic,
|
firDiagnostic as FirPsiDiagnostic,
|
||||||
|
|||||||
+10
@@ -1719,6 +1719,16 @@ 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 AbstractPropertyInPrimaryConstructorParameters : KtFirDiagnostic<KtModifierListOwner>() {
|
abstract class AbstractPropertyInPrimaryConstructorParameters : KtFirDiagnostic<KtModifierListOwner>() {
|
||||||
override val diagnosticClass get() = AbstractPropertyInPrimaryConstructorParameters::class
|
override val diagnosticClass get() = AbstractPropertyInPrimaryConstructorParameters::class
|
||||||
}
|
}
|
||||||
|
|||||||
+16
@@ -2788,6 +2788,22 @@ internal class LocalVariableWithTypeParametersImpl(
|
|||||||
override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic)
|
override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal class InapplicableBackingFieldVisibilityImpl(
|
||||||
|
override val modifier: KtModifierKeywordToken,
|
||||||
|
firDiagnostic: FirPsiDiagnostic,
|
||||||
|
override val token: ValidityToken,
|
||||||
|
) : KtFirDiagnostic.InapplicableBackingFieldVisibility(), KtAbstractFirDiagnostic<PsiElement> {
|
||||||
|
override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal class InapplicableBackingFieldModifierImpl(
|
||||||
|
override val modifier: KtModifierKeywordToken,
|
||||||
|
firDiagnostic: FirPsiDiagnostic,
|
||||||
|
override val token: ValidityToken,
|
||||||
|
) : KtFirDiagnostic.InapplicableBackingFieldModifier(), KtAbstractFirDiagnostic<PsiElement> {
|
||||||
|
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