From e008ad03a21aeef9b3982d53e552a8ae58f0c8b9 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 29 Jan 2021 20:53:42 +0100 Subject: [PATCH] FIR: add groups to diagnostics DSL --- .../generator/diagnostics/Diagnostic.kt | 4 +- .../diagnostics/DiagnosticListBuilder.kt | 18 +- .../ErrorListDiagnosticListRenderer.kt | 16 +- .../diagnostics/FirDiagnosticsList.kt | 552 +++++++++--------- .../fir/analysis/diagnostics/FirErrors.kt | 40 ++ 5 files changed, 358 insertions(+), 272 deletions(-) diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/Diagnostic.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/Diagnostic.kt index aa68768b292..f4b7c89a1d8 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/Diagnostic.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/Diagnostic.kt @@ -5,10 +5,7 @@ package org.jetbrains.kotlin.fir.checkers.generator.diagnostics -import com.intellij.psi.PsiElement import org.jetbrains.kotlin.diagnostics.Severity -import org.jetbrains.kotlin.fir.FirSourceElement -import kotlin.reflect.KClass import kotlin.reflect.KType data class Diagnostic( @@ -18,6 +15,7 @@ data class Diagnostic( val psiType: KType, val parameters: List, val positioningStrategy: PositioningStrategy, + val group: String?, ) data class DiagnosticParameter( diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticListBuilder.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticListBuilder.kt index 5c83b0e8382..74752b3fbf6 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticListBuilder.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/DiagnosticListBuilder.kt @@ -19,6 +19,19 @@ class DiagnosticListBuilder private constructor() { @PrivateForInline val diagnostics = mutableListOf() + @PrivateForInline + var currentGroupName: String? = null + + @OptIn(PrivateForInline::class) + inline fun group(groupName: String, inner: () -> Unit) { + if (currentGroupName != null) { + error("Groups can not be nested ") + } + currentGroupName = groupName + inner() + currentGroupName = null + } + @OptIn(PrivateForInline::class) inline fun error( positioningStrategy: PositioningStrategy = PositioningStrategy.DEFAULT, @@ -45,6 +58,7 @@ class DiagnosticListBuilder private constructor() { sourceElementType = typeOf(), psiType = typeOf

(), positioningStrategy, + group = currentGroupName, ).apply(init).build() AlwaysReturningUnitPropertyDelegate } @@ -68,7 +82,8 @@ class DiagnosticBuilder( private val name: String, private val sourceElementType: KType, private val psiType: KType, - private val positioningStrategy: PositioningStrategy + private val positioningStrategy: PositioningStrategy, + private val group: String? ) { @PrivateForInline val parameters = mutableListOf() @@ -92,5 +107,6 @@ class DiagnosticBuilder( psiType, parameters, positioningStrategy, + group ) } \ No newline at end of file diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/ErrorListDiagnosticListRenderer.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/ErrorListDiagnosticListRenderer.kt index d860ae84753..a3b67c4f651 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/ErrorListDiagnosticListRenderer.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/ErrorListDiagnosticListRenderer.kt @@ -33,12 +33,24 @@ object ErrorListDiagnosticListRenderer : DiagnosticListRenderer() { private fun SmartPrinter.printErrorsObject(diagnosticList: DiagnosticList) { inBracketsWithIndent("object FirErrors") { - for (it in diagnosticList.diagnostics) { - printDiagnostic(it) + val groups = diagnosticList.diagnostics.groupBy { it.group } + for ((group, diagnostics) in groups) { + printDiagnosticGroup(group, diagnostics) + println() } } } + private fun SmartPrinter.printDiagnosticGroup( + group: String?, + diagnostics: List + ) { + println("// ${group ?: "NO GROUP"}") + for (it in diagnostics) { + printDiagnostic(it) + } + } + private fun SmartPrinter.printDiagnostic(diagnostic: Diagnostic) { print("val ${diagnostic.name} by ${diagnostic.getFactoryFunction()}") printTypeArguments(diagnostic.getAllTypeArguments()) diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index d4a22b134d2..f9e1f8c11c0 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -25,294 +25,314 @@ import org.jetbrains.kotlin.psi.* @Suppress("UNUSED_VARIABLE", "LocalVariableName") @OptIn(PrivateForInline::class) val DIAGNOSTICS_LIST = DiagnosticListBuilder.buildDiagnosticList { - // Miscellaneous - val SYNTAX by error() - val OTHER_ERROR by error() - - // General syntax - val ILLEGAL_CONST_EXPRESSION by error() - val ILLEGAL_UNDERSCORE by error() - val EXPRESSION_REQUIRED by error() - val BREAK_OR_CONTINUE_OUTSIDE_A_LOOP by error() - val NOT_A_LOOP_LABEL by error() - val VARIABLE_EXPECTED by error() - val RETURN_NOT_ALLOWED by error() - val DELEGATION_IN_INTERFACE by error() - - // Unresolved - val HIDDEN by error { - parameter>("hidden") - } - val UNRESOLVED_REFERENCE by error { - parameter("reference") - } - val UNRESOLVED_LABEL by error() - val DESERIALIZATION_ERROR by error() - val ERROR_FROM_JAVA_RESOLUTION by error() - val UNKNOWN_CALLABLE_KIND by error() - val MISSING_STDLIB_CLASS by error() - val NO_THIS by error() - - // Super - val SUPER_IS_NOT_AN_EXPRESSION by error() - val SUPER_NOT_AVAILABLE by error() - val ABSTRACT_SUPER_CALL by error() - val INSTANCE_ACCESS_BEFORE_SUPER_CALL by error() { - parameter("target") + group("Miscellaneous") { + val SYNTAX by error() + val OTHER_ERROR by error() } - // Supertypes - val TYPE_PARAMETER_AS_SUPERTYPE by error() - val ENUM_AS_SUPERTYPE by error() - val RECURSION_IN_SUPERTYPES by error() - val NOT_A_SUPERTYPE by error() - val SUPERCLASS_NOT_ACCESSIBLE_FROM_INTERFACE by error() - val QUALIFIED_SUPERTYPE_EXTENDED_BY_OTHER_SUPERTYPE by error() { - parameter>("otherSuperType") - } - val SUPERTYPE_INITIALIZED_IN_INTERFACE by error() - val INTERFACE_WITH_SUPERCLASS by error() - val CLASS_IN_SUPERTYPE_FOR_ENUM by error() - val SEALED_SUPERTYPE by error() - val SEALED_SUPERTYPE_IN_LOCAL_CLASS by error() - - // Constructor problems - val CONSTRUCTOR_IN_OBJECT by error(PositioningStrategy.DECLARATION_SIGNATURE) - val CONSTRUCTOR_IN_INTERFACE by error(PositioningStrategy.DECLARATION_SIGNATURE) - val NON_PRIVATE_CONSTRUCTOR_IN_ENUM by error() - val NON_PRIVATE_CONSTRUCTOR_IN_SEALED by error() - val CYCLIC_CONSTRUCTOR_DELEGATION_CALL by warning() - val PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED by warning(PositioningStrategy.SECONDARY_CONSTRUCTOR_DELEGATION_CALL) - val SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR by warning() - val DELEGATION_SUPER_CALL_IN_ENUM_CONSTRUCTOR by warning() - val PRIMARY_CONSTRUCTOR_REQUIRED_FOR_DATA_CLASS by warning() - val EXPLICIT_DELEGATION_CALL_REQUIRED by warning(PositioningStrategy.SECONDARY_CONSTRUCTOR_DELEGATION_CALL) - val SEALED_CLASS_CONSTRUCTOR_CALL by error() - - // Annotations - val ANNOTATION_ARGUMENT_KCLASS_LITERAL_OF_TYPE_PARAMETER_ERROR by error() - val ANNOTATION_ARGUMENT_MUST_BE_CONST by error() - val ANNOTATION_ARGUMENT_MUST_BE_ENUM_CONST by error() - val ANNOTATION_ARGUMENT_MUST_BE_KCLASS_LITERAL by error() - val ANNOTATION_CLASS_MEMBER by error() - val ANNOTATION_PARAMETER_DEFAULT_VALUE_MUST_BE_CONSTANT by error() - val INVALID_TYPE_OF_ANNOTATION_MEMBER by error() - val LOCAL_ANNOTATION_CLASS_ERROR by error() - val MISSING_VAL_ON_ANNOTATION_PARAMETER by error() - val NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION by error() - val NOT_AN_ANNOTATION_CLASS by error { - parameter("annotationName") - } - val NULLABLE_TYPE_OF_ANNOTATION_MEMBER by error() - val VAR_ANNOTATION_PARAMETER by error(PositioningStrategy.VAL_OR_VAR_NODE) - - // Exposed visibility group - val EXPOSED_TYPEALIAS_EXPANDED_TYPE by exposedVisibilityError(PositioningStrategy.DECLARATION_NAME) - val EXPOSED_FUNCTION_RETURN_TYPE by exposedVisibilityError(PositioningStrategy.DECLARATION_NAME) - - val EXPOSED_RECEIVER_TYPE by exposedVisibilityError() - val EXPOSED_PROPERTY_TYPE by exposedVisibilityError(PositioningStrategy.DECLARATION_NAME) - val EXPOSED_PARAMETER_TYPE by exposedVisibilityError(/* // NB: for parameter FE 1.0 reports not on a name for some reason */) - val EXPOSED_SUPER_INTERFACE by exposedVisibilityError() - val EXPOSED_SUPER_CLASS by exposedVisibilityError< KtTypeReference>() - val EXPOSED_TYPE_PARAMETER_BOUND by exposedVisibilityError() - - // Modifiers - val INAPPLICABLE_INFIX_MODIFIER by error { - parameter("modifier") // TODO or it should be a message? - } - val REPEATED_MODIFIER by error { - parameter("modifier") - } - val REDUNDANT_MODIFIER by error { - parameter("redundantModifier") - parameter("conflictingModifier") - } - val DEPRECATED_MODIFIER_PAIR by error { - parameter("deprecatedModifier") - parameter("conflictingModifier") - } - val INCOMPATIBLE_MODIFIERS by error { - parameter("modifier1") - parameter("modifier2") - } - val REDUNDANT_OPEN_IN_INTERFACE by warning(PositioningStrategy.MODALITY_MODIFIER) - - // Applicability - val NONE_APPLICABLE by error { - parameter>>("candidates") + group("General syntax") { + val ILLEGAL_CONST_EXPRESSION by error() + val ILLEGAL_UNDERSCORE by error() + val EXPRESSION_REQUIRED by error() + val BREAK_OR_CONTINUE_OUTSIDE_A_LOOP by error() + val NOT_A_LOOP_LABEL by error() + val VARIABLE_EXPECTED by error() + val RETURN_NOT_ALLOWED by error() + val DELEGATION_IN_INTERFACE by error() } - val INAPPLICABLE_CANDIDATE by error { - parameter>("candidate") - } - val INAPPLICABLE_LATEINIT_MODIFIER by error() { - parameter("reason") + group("Unresolved") { + val HIDDEN by error { + parameter>("hidden") + } + val UNRESOLVED_REFERENCE by error { + parameter("reference") + } + val UNRESOLVED_LABEL by error() + val DESERIALIZATION_ERROR by error() + val ERROR_FROM_JAVA_RESOLUTION by error() + val UNKNOWN_CALLABLE_KIND by error() + val MISSING_STDLIB_CLASS by error() + val NO_THIS by error() } - // Ambiguity - val AMBIGUITY by error { - parameter>>("candidates") - } - val ASSIGN_OPERATOR_AMBIGUITY by error { - parameter>>("candidates") + group("Super") { + val SUPER_IS_NOT_AN_EXPRESSION by error() + val SUPER_NOT_AVAILABLE by error() + val ABSTRACT_SUPER_CALL by error() + val INSTANCE_ACCESS_BEFORE_SUPER_CALL by error() { + parameter("target") + } } - // Types & type parameters - val TYPE_MISMATCH by error{ - parameter("expectedType") - parameter("actualType") - } - val RECURSION_IN_IMPLICIT_TYPES by error() - val INFERENCE_ERROR by error() - val PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT by error() - val UPPER_BOUND_VIOLATED by error { - parameter("typeParameter") - parameter("violatedType") - } - val TYPE_ARGUMENTS_NOT_ALLOWED by error() - val WRONG_NUMBER_OF_TYPE_ARGUMENTS by error { - parameter("expectedCount") - parameter>("classifier") - } - val NO_TYPE_FOR_TYPE_PARAMETER by error() - val TYPE_PARAMETERS_IN_OBJECT by error() - val ILLEGAL_PROJECTION_USAGE by error() - val TYPE_PARAMETERS_IN_ENUM by error() - val CONFLICTING_PROJECTION by error { - parameter("type") // TODO use ConeType instead of String - } - val VARIANCE_ON_TYPE_PARAMETER_NOT_ALLOWED by error() - val RETURN_TYPE_MISMATCH_ON_OVERRIDE by error { - parameter("returnType") // TODO use ConeType instead of String - parameter("superFunction") - } - val PROPERTY_TYPE_MISMATCH_ON_OVERRIDE by error { - parameter("propertyType") // TODO use ConeType instead of String - parameter("targetProperty") - } - val VAR_TYPE_MISMATCH_ON_OVERRIDE by error { - parameter("variableType") // TODO use ConeType instead of String - parameter("targetVariable") + group("Supertypes") { + val TYPE_PARAMETER_AS_SUPERTYPE by error() + val ENUM_AS_SUPERTYPE by error() + val RECURSION_IN_SUPERTYPES by error() + val NOT_A_SUPERTYPE by error() + val SUPERCLASS_NOT_ACCESSIBLE_FROM_INTERFACE by error() + val QUALIFIED_SUPERTYPE_EXTENDED_BY_OTHER_SUPERTYPE by error() { + parameter>("otherSuperType") + } + val SUPERTYPE_INITIALIZED_IN_INTERFACE by error() + val INTERFACE_WITH_SUPERCLASS by error() + val CLASS_IN_SUPERTYPE_FOR_ENUM by error() + val SEALED_SUPERTYPE by error() + val SEALED_SUPERTYPE_IN_LOCAL_CLASS by error() } - // Redeclarations - val MANY_COMPANION_OBJECTS by error() - val CONFLICTING_OVERLOADS by error(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) { - parameter("conflictingOverloads") // TODO use Collection instead of String - } - val REDECLARATION by error() { - parameter("conflictingDeclaration") // TODO use Collection instead of String - } - val ANY_METHOD_IMPLEMENTED_IN_INTERFACE by error() - - // Invalid local declarations - val LOCAL_OBJECT_NOT_ALLOWED by error(PositioningStrategy.DECLARATION_NAME) { - parameter("objectName") - } - val LOCAL_INTERFACE_NOT_ALLOWED by error(PositioningStrategy.DECLARATION_NAME) { - parameter("interfaceName") + group(" Constructor problems") { + val CONSTRUCTOR_IN_OBJECT by error(PositioningStrategy.DECLARATION_SIGNATURE) + val CONSTRUCTOR_IN_INTERFACE by error(PositioningStrategy.DECLARATION_SIGNATURE) + val NON_PRIVATE_CONSTRUCTOR_IN_ENUM by error() + val NON_PRIVATE_CONSTRUCTOR_IN_SEALED by error() + val CYCLIC_CONSTRUCTOR_DELEGATION_CALL by warning() + val PRIMARY_CONSTRUCTOR_DELEGATION_CALL_EXPECTED by warning(PositioningStrategy.SECONDARY_CONSTRUCTOR_DELEGATION_CALL) + val SUPERTYPE_INITIALIZED_WITHOUT_PRIMARY_CONSTRUCTOR by warning() + val DELEGATION_SUPER_CALL_IN_ENUM_CONSTRUCTOR by warning() + val PRIMARY_CONSTRUCTOR_REQUIRED_FOR_DATA_CLASS by warning() + val EXPLICIT_DELEGATION_CALL_REQUIRED by warning(PositioningStrategy.SECONDARY_CONSTRUCTOR_DELEGATION_CALL) + val SEALED_CLASS_CONSTRUCTOR_CALL by error() } - // Functions - val ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS by error(PositioningStrategy.MODALITY_MODIFIER) { - parameter("function") - parameter("containingClass") // TODO use FirClass instead of FirMemberDeclaration - } - val ABSTRACT_FUNCTION_WITH_BODY by error(PositioningStrategy.MODALITY_MODIFIER) { - parameter("function") - } - val NON_ABSTRACT_FUNCTION_WITH_NO_BODY by error(PositioningStrategy.DECLARATION_SIGNATURE) { - parameter("function") - } - val PRIVATE_FUNCTION_WITH_NO_BODY by error(PositioningStrategy.VISIBILITY_MODIFIER) { - parameter("function") + group("Annotations") { + val ANNOTATION_ARGUMENT_KCLASS_LITERAL_OF_TYPE_PARAMETER_ERROR by error() + val ANNOTATION_ARGUMENT_MUST_BE_CONST by error() + val ANNOTATION_ARGUMENT_MUST_BE_ENUM_CONST by error() + val ANNOTATION_ARGUMENT_MUST_BE_KCLASS_LITERAL by error() + val ANNOTATION_CLASS_MEMBER by error() + val ANNOTATION_PARAMETER_DEFAULT_VALUE_MUST_BE_CONSTANT by error() + val INVALID_TYPE_OF_ANNOTATION_MEMBER by error() + val LOCAL_ANNOTATION_CLASS_ERROR by error() + val MISSING_VAL_ON_ANNOTATION_PARAMETER by error() + val NON_CONST_VAL_USED_IN_CONSTANT_EXPRESSION by error() + val NOT_AN_ANNOTATION_CLASS by error { + parameter("annotationName") + } + val NULLABLE_TYPE_OF_ANNOTATION_MEMBER by error() + val VAR_ANNOTATION_PARAMETER by error(PositioningStrategy.VAL_OR_VAR_NODE) } - val NON_MEMBER_FUNCTION_NO_BODY by error(PositioningStrategy.DECLARATION_SIGNATURE) { - parameter("function") + group("Exposed visibility group") { + val EXPOSED_TYPEALIAS_EXPANDED_TYPE by exposedVisibilityError(PositioningStrategy.DECLARATION_NAME) + val EXPOSED_FUNCTION_RETURN_TYPE by exposedVisibilityError(PositioningStrategy.DECLARATION_NAME) + + val EXPOSED_RECEIVER_TYPE by exposedVisibilityError() + val EXPOSED_PROPERTY_TYPE by exposedVisibilityError(PositioningStrategy.DECLARATION_NAME) + val EXPOSED_PARAMETER_TYPE by exposedVisibilityError(/* // NB: for parameter FE 1.0 reports not on a name for some reason */) + val EXPOSED_SUPER_INTERFACE by exposedVisibilityError() + val EXPOSED_SUPER_CLASS by exposedVisibilityError() + val EXPOSED_TYPE_PARAMETER_BOUND by exposedVisibilityError() + } + + group("Modifiers") { + val INAPPLICABLE_INFIX_MODIFIER by error { + parameter("modifier") // TODO or it should be a message? + } + val REPEATED_MODIFIER by error { + parameter("modifier") + } + val REDUNDANT_MODIFIER by error { + parameter("redundantModifier") + parameter("conflictingModifier") + } + val DEPRECATED_MODIFIER_PAIR by error { + parameter("deprecatedModifier") + parameter("conflictingModifier") + } + val INCOMPATIBLE_MODIFIERS by error { + parameter("modifier1") + parameter("modifier2") + } + val REDUNDANT_OPEN_IN_INTERFACE by warning(PositioningStrategy.MODALITY_MODIFIER) + } + + group("Applicability") { + val NONE_APPLICABLE by error { + parameter>>("candidates") + } + + val INAPPLICABLE_CANDIDATE by error { + parameter>("candidate") + } + val INAPPLICABLE_LATEINIT_MODIFIER by error() { + parameter("reason") + } + } + + group("Ambiguity") { + val AMBIGUITY by error { + parameter>>("candidates") + } + val ASSIGN_OPERATOR_AMBIGUITY by error { + parameter>>("candidates") + } + } + + group("Types & type parameters") { + val TYPE_MISMATCH by error { + parameter("expectedType") + parameter("actualType") + } + val RECURSION_IN_IMPLICIT_TYPES by error() + val INFERENCE_ERROR by error() + val PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT by error() + val UPPER_BOUND_VIOLATED by error { + parameter("typeParameter") + parameter("violatedType") + } + val TYPE_ARGUMENTS_NOT_ALLOWED by error() + val WRONG_NUMBER_OF_TYPE_ARGUMENTS by error { + parameter("expectedCount") + parameter>("classifier") + } + val NO_TYPE_FOR_TYPE_PARAMETER by error() + val TYPE_PARAMETERS_IN_OBJECT by error() + val ILLEGAL_PROJECTION_USAGE by error() + val TYPE_PARAMETERS_IN_ENUM by error() + val CONFLICTING_PROJECTION by error { + parameter("type") // TODO use ConeType instead of String + } + val VARIANCE_ON_TYPE_PARAMETER_NOT_ALLOWED by error() + val RETURN_TYPE_MISMATCH_ON_OVERRIDE by error { + parameter("returnType") // TODO use ConeType instead of String + parameter("superFunction") + } + val PROPERTY_TYPE_MISMATCH_ON_OVERRIDE by error { + parameter("propertyType") // TODO use ConeType instead of String + parameter("targetProperty") + } + val VAR_TYPE_MISMATCH_ON_OVERRIDE by error { + parameter("variableType") // TODO use ConeType instead of String + parameter("targetVariable") + } + } + + group("Redeclarations") { + val MANY_COMPANION_OBJECTS by error() + val CONFLICTING_OVERLOADS by error(PositioningStrategy.DECLARATION_SIGNATURE_OR_DEFAULT) { + parameter("conflictingOverloads") // TODO use Collection instead of String + } + val REDECLARATION by error() { + parameter("conflictingDeclaration") // TODO use Collection instead of String + } + val ANY_METHOD_IMPLEMENTED_IN_INTERFACE by error() + } + + group("Invalid local declarations") { + val LOCAL_OBJECT_NOT_ALLOWED by error(PositioningStrategy.DECLARATION_NAME) { + parameter("objectName") + } + val LOCAL_INTERFACE_NOT_ALLOWED by error(PositioningStrategy.DECLARATION_NAME) { + parameter("interfaceName") + } + } + + group("Functions") { + val ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS by error(PositioningStrategy.MODALITY_MODIFIER) { + parameter("function") + parameter("containingClass") // TODO use FirClass instead of FirMemberDeclaration + } + val ABSTRACT_FUNCTION_WITH_BODY by error(PositioningStrategy.MODALITY_MODIFIER) { + parameter("function") + } + val NON_ABSTRACT_FUNCTION_WITH_NO_BODY by error(PositioningStrategy.DECLARATION_SIGNATURE) { + parameter("function") + } + val PRIVATE_FUNCTION_WITH_NO_BODY by error(PositioningStrategy.VISIBILITY_MODIFIER) { + parameter("function") + } + + val NON_MEMBER_FUNCTION_NO_BODY by error(PositioningStrategy.DECLARATION_SIGNATURE) { + parameter("function") + } + + + val FUNCTION_DECLARATION_WITH_NO_NAME by error(PositioningStrategy.DECLARATION_SIGNATURE) + + // TODO: val ANONYMOUS_FUNCTION_WITH_NAME by error1(SourceElementPositioningStrategies.DECLARATION_NAME) + val ANONYMOUS_FUNCTION_PARAMETER_WITH_DEFAULT_VALUE by error(PositioningStrategy.PARAMETER_DEFAULT_VALUE) + val USELESS_VARARG_ON_PARAMETER by warning() + + } + + group("Properties & accessors") { + val ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS by error(PositioningStrategy.MODALITY_MODIFIER) { + parameter("property") + parameter("containingClass") // TODO use FirClass instead of FirMemberDeclaration + } + val PRIVATE_PROPERTY_IN_INTERFACE by error(PositioningStrategy.VISIBILITY_MODIFIER) + + val ABSTRACT_PROPERTY_WITH_INITIALIZER by error() + val PROPERTY_INITIALIZER_IN_INTERFACE by error() + val PROPERTY_WITH_NO_TYPE_NO_INITIALIZER by error(PositioningStrategy.DECLARATION_SIGNATURE) + + val ABSTRACT_DELEGATED_PROPERTY by error() + val DELEGATED_PROPERTY_IN_INTERFACE by error() + // TODO: val ACCESSOR_FOR_DELEGATED_PROPERTY by error1() + + val ABSTRACT_PROPERTY_WITH_GETTER by error() + val ABSTRACT_PROPERTY_WITH_SETTER by error() + val PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY by error() + val PRIVATE_SETTER_FOR_OPEN_PROPERTY by error() + val EXPECTED_PRIVATE_DECLARATION by error(PositioningStrategy.VISIBILITY_MODIFIER) + } + + group("Multi-platform projects") { + val EXPECTED_DECLARATION_WITH_BODY by error(PositioningStrategy.DECLARATION_SIGNATURE) + val EXPECTED_PROPERTY_INITIALIZER by error() + // TODO: need to cover `by` as well as delegate expression + val EXPECTED_DELEGATED_PROPERTY by error() } - val FUNCTION_DECLARATION_WITH_NO_NAME by error(PositioningStrategy.DECLARATION_SIGNATURE) - - // TODO: val ANONYMOUS_FUNCTION_WITH_NAME by error1(SourceElementPositioningStrategies.DECLARATION_NAME) - val ANONYMOUS_FUNCTION_PARAMETER_WITH_DEFAULT_VALUE by error(PositioningStrategy.PARAMETER_DEFAULT_VALUE) - val USELESS_VARARG_ON_PARAMETER by warning() - - - // Properties & accessors - val ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS by error(PositioningStrategy.MODALITY_MODIFIER) { - parameter("property") - parameter("containingClass") // TODO use FirClass instead of FirMemberDeclaration + group("Destructuring declaration") { + val INITIALIZER_REQUIRED_FOR_DESTRUCTURING_DECLARATION by error() + val COMPONENT_FUNCTION_MISSING by error { + parameter("missingFunctionName") + parameter("destructingType") + } + val COMPONENT_FUNCTION_AMBIGUITY by error { + parameter("functionWithAmbiguityName") + parameter>>("candidates") + } + // TODO: val COMPONENT_FUNCTION_ON_NULLABLE by ... + // TODO: val COMPONENT_FUNCTION_RETURN_TYPE_MISMATCH by ... } - val PRIVATE_PROPERTY_IN_INTERFACE by error(PositioningStrategy.VISIBILITY_MODIFIER) - val ABSTRACT_PROPERTY_WITH_INITIALIZER by error() - val PROPERTY_INITIALIZER_IN_INTERFACE by error() - val PROPERTY_WITH_NO_TYPE_NO_INITIALIZER by error(PositioningStrategy.DECLARATION_SIGNATURE) - - val ABSTRACT_DELEGATED_PROPERTY by error() - val DELEGATED_PROPERTY_IN_INTERFACE by error() - // TODO: val ACCESSOR_FOR_DELEGATED_PROPERTY by error1() - - val ABSTRACT_PROPERTY_WITH_GETTER by error() - val ABSTRACT_PROPERTY_WITH_SETTER by error() - val PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY by error() - val PRIVATE_SETTER_FOR_OPEN_PROPERTY by error() - val EXPECTED_PRIVATE_DECLARATION by error(PositioningStrategy.VISIBILITY_MODIFIER) - - // Multi-platform projects - val EXPECTED_DECLARATION_WITH_BODY by error(PositioningStrategy.DECLARATION_SIGNATURE) - val EXPECTED_PROPERTY_INITIALIZER by error() - // TODO: need to cover `by` as well as delegate expression - val EXPECTED_DELEGATED_PROPERTY by error() - - - // Destructuring declaration - val INITIALIZER_REQUIRED_FOR_DESTRUCTURING_DECLARATION by error() - val COMPONENT_FUNCTION_MISSING by error { - parameter("missingFunctionName") - parameter("destructingType") + group("Control flow diagnostics") { + val UNINITIALIZED_VARIABLE by error { + parameter("variable") + } + val WRONG_INVOCATION_KIND by warning { + parameter>("declaration") + parameter("requiredRange") + parameter("actualRange") + } + val LEAKED_IN_PLACE_LAMBDA by error { + parameter>("lambda") + } + val WRONG_IMPLIES_CONDITION by warning() } - val COMPONENT_FUNCTION_AMBIGUITY by error { - parameter("functionWithAmbiguityName") - parameter>>("candidates") - } - // TODO: val COMPONENT_FUNCTION_ON_NULLABLE by ... - // TODO: val COMPONENT_FUNCTION_RETURN_TYPE_MISMATCH by ... - // Control flow diagnostics - val UNINITIALIZED_VARIABLE by error { - parameter("variable") + group(" Extended checkers") { + val REDUNDANT_VISIBILITY_MODIFIER by warning(PositioningStrategy.VISIBILITY_MODIFIER) + val REDUNDANT_MODALITY_MODIFIER by warning(PositioningStrategy.MODALITY_MODIFIER) + val REDUNDANT_RETURN_UNIT_TYPE by warning() + val REDUNDANT_EXPLICIT_TYPE by warning() + val REDUNDANT_SINGLE_EXPRESSION_STRING_TEMPLATE by warning() + val CAN_BE_VAL by warning(PositioningStrategy.VAL_OR_VAR_NODE) + val CAN_BE_REPLACED_WITH_OPERATOR_ASSIGNMENT by warning(PositioningStrategy.OPERATOR) + val REDUNDANT_CALL_OF_CONVERSION_METHOD by warning() + val ARRAY_EQUALITY_OPERATOR_CAN_BE_REPLACED_WITH_EQUALS by warning(PositioningStrategy.OPERATOR) + val EMPTY_RANGE by warning() + val REDUNDANT_SETTER_PARAMETER_TYPE by warning() + val UNUSED_VARIABLE by warning(PositioningStrategy.DECLARATION_NAME) + val ASSIGNED_VALUE_IS_NEVER_READ by warning() + val VARIABLE_INITIALIZER_IS_REDUNDANT by warning() + val VARIABLE_NEVER_READ by warning(PositioningStrategy.DECLARATION_NAME) + val USELESS_CALL_ON_NOT_NULL by warning() } - val WRONG_INVOCATION_KIND by warning { - parameter< AbstractFirBasedSymbol<*>>("declaration") - parameter("requiredRange") - parameter("actualRange") - } - val LEAKED_IN_PLACE_LAMBDA by error { - parameter>("lambda") - } - val WRONG_IMPLIES_CONDITION by warning() - - // Extended checkers group - val REDUNDANT_VISIBILITY_MODIFIER by warning(PositioningStrategy.VISIBILITY_MODIFIER) - val REDUNDANT_MODALITY_MODIFIER by warning(PositioningStrategy.MODALITY_MODIFIER) - val REDUNDANT_RETURN_UNIT_TYPE by warning() - val REDUNDANT_EXPLICIT_TYPE by warning() - val REDUNDANT_SINGLE_EXPRESSION_STRING_TEMPLATE by warning() - val CAN_BE_VAL by warning(PositioningStrategy.VAL_OR_VAR_NODE) - val CAN_BE_REPLACED_WITH_OPERATOR_ASSIGNMENT by warning(PositioningStrategy.OPERATOR) - val REDUNDANT_CALL_OF_CONVERSION_METHOD by warning() - val ARRAY_EQUALITY_OPERATOR_CAN_BE_REPLACED_WITH_EQUALS by warning(PositioningStrategy.OPERATOR) - val EMPTY_RANGE by warning() - val REDUNDANT_SETTER_PARAMETER_TYPE by warning() - val UNUSED_VARIABLE by warning(PositioningStrategy.DECLARATION_NAME) - val ASSIGNED_VALUE_IS_NEVER_READ by warning() - val VARIABLE_INITIALIZER_IS_REDUNDANT by warning() - val VARIABLE_NEVER_READ by warning(PositioningStrategy.DECLARATION_NAME) - val USELESS_CALL_ON_NOT_NULL by warning() } private inline fun DiagnosticListBuilder.exposedVisibilityError( diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index a96a12e3ecc..228018df80a 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -40,8 +40,11 @@ import org.jetbrains.kotlin.psi.KtTypeReference */ object FirErrors { + // Miscellaneous val SYNTAX by error0() val OTHER_ERROR by error0() + + // General syntax val ILLEGAL_CONST_EXPRESSION by error0() val ILLEGAL_UNDERSCORE by error0() val EXPRESSION_REQUIRED by error0() @@ -50,6 +53,8 @@ object FirErrors { val VARIABLE_EXPECTED by error0() val RETURN_NOT_ALLOWED by error0() val DELEGATION_IN_INTERFACE by error0() + + // Unresolved val HIDDEN by error1>() val UNRESOLVED_REFERENCE by error1() val UNRESOLVED_LABEL by error0() @@ -58,10 +63,14 @@ object FirErrors { val UNKNOWN_CALLABLE_KIND by error0() val MISSING_STDLIB_CLASS by error0() val NO_THIS by error0() + + // Super val SUPER_IS_NOT_AN_EXPRESSION by error0() val SUPER_NOT_AVAILABLE by error0() val ABSTRACT_SUPER_CALL by error0() val INSTANCE_ACCESS_BEFORE_SUPER_CALL by error1() + + // Supertypes val TYPE_PARAMETER_AS_SUPERTYPE by error0() val ENUM_AS_SUPERTYPE by error0() val RECURSION_IN_SUPERTYPES by error0() @@ -73,6 +82,8 @@ object FirErrors { val CLASS_IN_SUPERTYPE_FOR_ENUM by error0() val SEALED_SUPERTYPE by error0() val SEALED_SUPERTYPE_IN_LOCAL_CLASS by error0() + + // Constructor problems val CONSTRUCTOR_IN_OBJECT by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val CONSTRUCTOR_IN_INTERFACE by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val NON_PRIVATE_CONSTRUCTOR_IN_ENUM by error0() @@ -84,6 +95,8 @@ object FirErrors { val PRIMARY_CONSTRUCTOR_REQUIRED_FOR_DATA_CLASS by warning0() val EXPLICIT_DELEGATION_CALL_REQUIRED by warning0(SourceElementPositioningStrategies.SECONDARY_CONSTRUCTOR_DELEGATION_CALL) val SEALED_CLASS_CONSTRUCTOR_CALL by error0() + + // Annotations val ANNOTATION_ARGUMENT_KCLASS_LITERAL_OF_TYPE_PARAMETER_ERROR by error0() val ANNOTATION_ARGUMENT_MUST_BE_CONST by error0() val ANNOTATION_ARGUMENT_MUST_BE_ENUM_CONST by error0() @@ -97,6 +110,8 @@ object FirErrors { val NOT_AN_ANNOTATION_CLASS by error1() val NULLABLE_TYPE_OF_ANNOTATION_MEMBER by error0() val VAR_ANNOTATION_PARAMETER by error0(SourceElementPositioningStrategies.VAL_OR_VAR_NODE) + + // Exposed visibility group val EXPOSED_TYPEALIAS_EXPANDED_TYPE by error3(SourceElementPositioningStrategies.DECLARATION_NAME) val EXPOSED_FUNCTION_RETURN_TYPE by error3(SourceElementPositioningStrategies.DECLARATION_NAME) val EXPOSED_RECEIVER_TYPE by error3() @@ -105,17 +120,25 @@ object FirErrors { val EXPOSED_SUPER_INTERFACE by error3() val EXPOSED_SUPER_CLASS by error3() val EXPOSED_TYPE_PARAMETER_BOUND by error3() + + // Modifiers val INAPPLICABLE_INFIX_MODIFIER by error1() val REPEATED_MODIFIER by error1() val REDUNDANT_MODIFIER by error2() val DEPRECATED_MODIFIER_PAIR by error2() val INCOMPATIBLE_MODIFIERS by error2() val REDUNDANT_OPEN_IN_INTERFACE by warning0(SourceElementPositioningStrategies.MODALITY_MODIFIER) + + // Applicability val NONE_APPLICABLE by error1>>() val INAPPLICABLE_CANDIDATE by error1>() val INAPPLICABLE_LATEINIT_MODIFIER by error1() + + // Ambiguity val AMBIGUITY by error1>>() val ASSIGN_OPERATOR_AMBIGUITY by error1>>() + + // Types & type parameters val TYPE_MISMATCH by error2() val RECURSION_IN_IMPLICIT_TYPES by error0() val INFERENCE_ERROR by error0() @@ -132,12 +155,18 @@ object FirErrors { val RETURN_TYPE_MISMATCH_ON_OVERRIDE by error2() val PROPERTY_TYPE_MISMATCH_ON_OVERRIDE by error2() val VAR_TYPE_MISMATCH_ON_OVERRIDE by error2() + + // Redeclarations val MANY_COMPANION_OBJECTS by error0() val CONFLICTING_OVERLOADS by error1(SourceElementPositioningStrategies.DECLARATION_SIGNATURE_OR_DEFAULT) val REDECLARATION by error1() val ANY_METHOD_IMPLEMENTED_IN_INTERFACE by error0() + + // Invalid local declarations val LOCAL_OBJECT_NOT_ALLOWED by error1(SourceElementPositioningStrategies.DECLARATION_NAME) val LOCAL_INTERFACE_NOT_ALLOWED by error1(SourceElementPositioningStrategies.DECLARATION_NAME) + + // Functions val ABSTRACT_FUNCTION_IN_NON_ABSTRACT_CLASS by error2(SourceElementPositioningStrategies.MODALITY_MODIFIER) val ABSTRACT_FUNCTION_WITH_BODY by error1(SourceElementPositioningStrategies.MODALITY_MODIFIER) val NON_ABSTRACT_FUNCTION_WITH_NO_BODY by error1(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) @@ -146,6 +175,8 @@ object FirErrors { val FUNCTION_DECLARATION_WITH_NO_NAME by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val ANONYMOUS_FUNCTION_PARAMETER_WITH_DEFAULT_VALUE by error0(SourceElementPositioningStrategies.PARAMETER_DEFAULT_VALUE) val USELESS_VARARG_ON_PARAMETER by warning0() + + // Properties & accessors val ABSTRACT_PROPERTY_IN_NON_ABSTRACT_CLASS by error2(SourceElementPositioningStrategies.MODALITY_MODIFIER) val PRIVATE_PROPERTY_IN_INTERFACE by error0(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) val ABSTRACT_PROPERTY_WITH_INITIALIZER by error0() @@ -158,16 +189,24 @@ object FirErrors { val PRIVATE_SETTER_FOR_ABSTRACT_PROPERTY by error0() val PRIVATE_SETTER_FOR_OPEN_PROPERTY by error0() val EXPECTED_PRIVATE_DECLARATION by error0(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) + + // Multi-platform projects val EXPECTED_DECLARATION_WITH_BODY by error0(SourceElementPositioningStrategies.DECLARATION_SIGNATURE) val EXPECTED_PROPERTY_INITIALIZER by error0() val EXPECTED_DELEGATED_PROPERTY by error0() + + // Destructuring declaration val INITIALIZER_REQUIRED_FOR_DESTRUCTURING_DECLARATION by error0() val COMPONENT_FUNCTION_MISSING by error2() val COMPONENT_FUNCTION_AMBIGUITY by error2>>() + + // Control flow diagnostics val UNINITIALIZED_VARIABLE by error1() val WRONG_INVOCATION_KIND by warning3, EventOccurrencesRange, EventOccurrencesRange>() val LEAKED_IN_PLACE_LAMBDA by error1>() val WRONG_IMPLIES_CONDITION by warning0() + + // Extended checkers val REDUNDANT_VISIBILITY_MODIFIER by warning0(SourceElementPositioningStrategies.VISIBILITY_MODIFIER) val REDUNDANT_MODALITY_MODIFIER by warning0(SourceElementPositioningStrategies.MODALITY_MODIFIER) val REDUNDANT_RETURN_UNIT_TYPE by warning0() @@ -184,4 +223,5 @@ object FirErrors { val VARIABLE_INITIALIZER_IS_REDUNDANT by warning0() val VARIABLE_NEVER_READ by warning0(SourceElementPositioningStrategies.DECLARATION_NAME) val USELESS_CALL_ON_NOT_NULL by warning0() + }