diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Main.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Main.kt index 5aa202e41f5..503cc41b05c 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Main.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Main.kt @@ -29,6 +29,7 @@ fun main(args: Array) { alias("BasicExpressionChecker") alias("QualifiedAccessChecker") alias("QualifiedAccessExpressionChecker") + alias("CallChecker") alias("FunctionCallChecker") alias("VariableAssignmentChecker") alias("TryExpressionChecker") 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 bc017d8277e..ab4c5bbdf64 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 @@ -444,6 +444,7 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { val SPREAD_OF_NULLABLE by error(PositioningStrategy.SPREAD_OPERATOR) val ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION by deprecationError(LanguageFeature.ProhibitAssigningSingleElementsToVarargsInNamedForm) + val ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION by deprecationError(LanguageFeature.ProhibitAssigningSingleElementsToVarargsInNamedForm) } val AMBIGUITY by object : DiagnosticGroup("Ambiguity") { diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ComposedExpressionCheckers.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ComposedExpressionCheckers.kt index 36a9bd54c81..f6f36620b3b 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ComposedExpressionCheckers.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ComposedExpressionCheckers.kt @@ -19,6 +19,8 @@ class ComposedExpressionCheckers : ExpressionCheckers() { get() = _qualifiedAccessCheckers override val qualifiedAccessExpressionCheckers: Set get() = _qualifiedAccessExpressionCheckers + override val callCheckers: Set + get() = _callCheckers override val functionCallCheckers: Set get() = _functionCallCheckers override val variableAssignmentCheckers: Set @@ -73,6 +75,7 @@ class ComposedExpressionCheckers : ExpressionCheckers() { private val _basicExpressionCheckers: MutableSet = mutableSetOf() private val _qualifiedAccessCheckers: MutableSet = mutableSetOf() private val _qualifiedAccessExpressionCheckers: MutableSet = mutableSetOf() + private val _callCheckers: MutableSet = mutableSetOf() private val _functionCallCheckers: MutableSet = mutableSetOf() private val _variableAssignmentCheckers: MutableSet = mutableSetOf() private val _tryExpressionCheckers: MutableSet = mutableSetOf() @@ -104,6 +107,7 @@ class ComposedExpressionCheckers : ExpressionCheckers() { _basicExpressionCheckers += checkers.basicExpressionCheckers _qualifiedAccessCheckers += checkers.qualifiedAccessCheckers _qualifiedAccessExpressionCheckers += checkers.qualifiedAccessExpressionCheckers + _callCheckers += checkers.callCheckers _functionCallCheckers += checkers.functionCallCheckers _variableAssignmentCheckers += checkers.variableAssignmentCheckers _tryExpressionCheckers += checkers.tryExpressionCheckers diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckers.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckers.kt index 73fdb57468e..360d7f1dcff 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckers.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckers.kt @@ -20,6 +20,7 @@ abstract class ExpressionCheckers { open val basicExpressionCheckers: Set = emptySet() open val qualifiedAccessCheckers: Set = emptySet() open val qualifiedAccessExpressionCheckers: Set = emptySet() + open val callCheckers: Set = emptySet() open val functionCallCheckers: Set = emptySet() open val variableAssignmentCheckers: Set = emptySet() open val tryExpressionCheckers: Set = emptySet() @@ -49,7 +50,8 @@ abstract class ExpressionCheckers { @CheckersComponentInternal internal val allBasicExpressionCheckers: Set by lazy { basicExpressionCheckers } @CheckersComponentInternal internal val allQualifiedAccessCheckers: Set by lazy { qualifiedAccessCheckers + basicExpressionCheckers } @CheckersComponentInternal internal val allQualifiedAccessExpressionCheckers: Set by lazy { qualifiedAccessExpressionCheckers + basicExpressionCheckers + qualifiedAccessCheckers } - @CheckersComponentInternal internal val allFunctionCallCheckers: Set by lazy { functionCallCheckers + qualifiedAccessExpressionCheckers + basicExpressionCheckers + qualifiedAccessCheckers } + @CheckersComponentInternal internal val allCallCheckers: Set by lazy { callCheckers + basicExpressionCheckers } + @CheckersComponentInternal internal val allFunctionCallCheckers: Set by lazy { functionCallCheckers + qualifiedAccessExpressionCheckers + basicExpressionCheckers + qualifiedAccessCheckers + callCheckers } @CheckersComponentInternal internal val allVariableAssignmentCheckers: Set by lazy { variableAssignmentCheckers + qualifiedAccessCheckers + basicExpressionCheckers } @CheckersComponentInternal internal val allTryExpressionCheckers: Set by lazy { tryExpressionCheckers + basicExpressionCheckers } @CheckersComponentInternal internal val allWhenExpressionCheckers: Set by lazy { whenExpressionCheckers + basicExpressionCheckers } @@ -58,20 +60,20 @@ abstract class ExpressionCheckers { @CheckersComponentInternal internal val allLogicExpressionCheckers: Set by lazy { logicExpressionCheckers + basicExpressionCheckers } @CheckersComponentInternal internal val allReturnExpressionCheckers: Set by lazy { returnExpressionCheckers + basicExpressionCheckers } @CheckersComponentInternal internal val allBlockCheckers: Set by lazy { blockCheckers + basicExpressionCheckers } - @CheckersComponentInternal internal val allAnnotationCallCheckers: Set by lazy { annotationCallCheckers + basicExpressionCheckers } - @CheckersComponentInternal internal val allCheckNotNullCallCheckers: Set by lazy { checkNotNullCallCheckers + basicExpressionCheckers } + @CheckersComponentInternal internal val allAnnotationCallCheckers: Set by lazy { annotationCallCheckers + basicExpressionCheckers + callCheckers } + @CheckersComponentInternal internal val allCheckNotNullCallCheckers: Set by lazy { checkNotNullCallCheckers + basicExpressionCheckers + callCheckers } @CheckersComponentInternal internal val allElvisExpressionCheckers: Set by lazy { elvisExpressionCheckers + basicExpressionCheckers } - @CheckersComponentInternal internal val allGetClassCallCheckers: Set by lazy { getClassCallCheckers + basicExpressionCheckers } + @CheckersComponentInternal internal val allGetClassCallCheckers: Set by lazy { getClassCallCheckers + basicExpressionCheckers + callCheckers } @CheckersComponentInternal internal val allSafeCallExpressionCheckers: Set by lazy { safeCallExpressionCheckers + basicExpressionCheckers } - @CheckersComponentInternal internal val allEqualityOperatorCallCheckers: Set by lazy { equalityOperatorCallCheckers + basicExpressionCheckers } - @CheckersComponentInternal internal val allStringConcatenationCallCheckers: Set by lazy { stringConcatenationCallCheckers + basicExpressionCheckers } - @CheckersComponentInternal internal val allTypeOperatorCallCheckers: Set by lazy { typeOperatorCallCheckers + basicExpressionCheckers } + @CheckersComponentInternal internal val allEqualityOperatorCallCheckers: Set by lazy { equalityOperatorCallCheckers + basicExpressionCheckers + callCheckers } + @CheckersComponentInternal internal val allStringConcatenationCallCheckers: Set by lazy { stringConcatenationCallCheckers + callCheckers + basicExpressionCheckers } + @CheckersComponentInternal internal val allTypeOperatorCallCheckers: Set by lazy { typeOperatorCallCheckers + basicExpressionCheckers + callCheckers } @CheckersComponentInternal internal val allResolvedQualifierCheckers: Set by lazy { resolvedQualifierCheckers + basicExpressionCheckers } @CheckersComponentInternal internal val allConstExpressionCheckers: Set by lazy { constExpressionCheckers + basicExpressionCheckers } @CheckersComponentInternal internal val allCallableReferenceAccessCheckers: Set by lazy { callableReferenceAccessCheckers + qualifiedAccessExpressionCheckers + basicExpressionCheckers + qualifiedAccessCheckers } @CheckersComponentInternal internal val allThisReceiverExpressionCheckers: Set by lazy { thisReceiverExpressionCheckers + qualifiedAccessExpressionCheckers + basicExpressionCheckers + qualifiedAccessCheckers } @CheckersComponentInternal internal val allWhileLoopCheckers: Set by lazy { whileLoopCheckers + loopExpressionCheckers + basicExpressionCheckers } @CheckersComponentInternal internal val allDoWhileLoopCheckers: Set by lazy { doWhileLoopCheckers + loopExpressionCheckers + basicExpressionCheckers } - @CheckersComponentInternal internal val allArrayOfCallCheckers: Set by lazy { arrayOfCallCheckers + basicExpressionCheckers } + @CheckersComponentInternal internal val allArrayOfCallCheckers: Set by lazy { arrayOfCallCheckers + basicExpressionCheckers + callCheckers } @CheckersComponentInternal internal val allClassReferenceExpressionCheckers: Set by lazy { classReferenceExpressionCheckers + basicExpressionCheckers } } diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirExpressionCheckerAliases.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirExpressionCheckerAliases.kt index c687cd5bb4f..ed76ddb915f 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirExpressionCheckerAliases.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirExpressionCheckerAliases.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.expressions.FirAnnotationCall import org.jetbrains.kotlin.fir.expressions.FirArrayOfCall import org.jetbrains.kotlin.fir.expressions.FirBinaryLogicExpression import org.jetbrains.kotlin.fir.expressions.FirBlock +import org.jetbrains.kotlin.fir.expressions.FirCall import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess import org.jetbrains.kotlin.fir.expressions.FirCheckNotNullCall import org.jetbrains.kotlin.fir.expressions.FirClassReferenceExpression @@ -42,6 +43,7 @@ import org.jetbrains.kotlin.fir.expressions.FirWhileLoop typealias FirBasicExpressionChecker = FirExpressionChecker typealias FirQualifiedAccessChecker = FirExpressionChecker typealias FirQualifiedAccessExpressionChecker = FirExpressionChecker +typealias FirCallChecker = FirExpressionChecker typealias FirFunctionCallChecker = FirExpressionChecker typealias FirVariableAssignmentChecker = FirExpressionChecker typealias FirTryExpressionChecker = FirExpressionChecker 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 351d894a139..578037e08d3 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 @@ -307,6 +307,7 @@ object FirErrors { val NEW_INFERENCE_NO_INFORMATION_FOR_PARAMETER by error1() val SPREAD_OF_NULLABLE by error0(SourceElementPositioningStrategies.SPREAD_OPERATOR) val ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION by deprecationError0(ProhibitAssigningSingleElementsToVarargsInNamedForm) + val ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION by deprecationError0(ProhibitAssigningSingleElementsToVarargsInNamedForm) // Ambiguity val OVERLOAD_RESOLUTION_AMBIGUITY by error1>>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt index 07e8bbfbf4f..a1ed6ea7409 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt @@ -45,6 +45,11 @@ object CommonExpressionCheckers : ExpressionCheckers() { FirSuspendCallChecker, ) + override val callCheckers: Set + get() = setOf( + FirNamedVarargChecker, + ) + override val functionCallCheckers: Set get() = setOf( FirConventionFunctionCallChecker, diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirDeprecationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirDeprecationChecker.kt index 378074f10c5..5bfdb975156 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirDeprecationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirDeprecationChecker.kt @@ -32,7 +32,7 @@ object FirDeprecationChecker : FirBasicExpressionChecker() { override fun check(expression: FirStatement, context: CheckerContext, reporter: DiagnosticReporter) { if (!allowedSourceKinds.contains(expression.source?.kind)) return - if (expression is FirAnnotationCall) return //checked by FirDeprecatedTypeChecker + if (expression is FirAnnotationCall || expression is FirDelegatedConstructorCall) return //checked by FirDeprecatedTypeChecker val resolvable = expression as? FirResolvable ?: return val reference = resolvable.calleeReference as? FirResolvedNamedReference ?: return val referencedSymbol = reference.resolvedSymbol diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirNamedVarargChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirNamedVarargChecker.kt index 2fd7d6e7a56..3c31f39a12a 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirNamedVarargChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirNamedVarargChecker.kt @@ -20,10 +20,17 @@ import org.jetbrains.kotlin.fir.languageVersionSettings import org.jetbrains.kotlin.fir.types.FirErrorTypeRef import org.jetbrains.kotlin.fir.types.isArrayType -object FirNamedVarargChecker : FirFunctionCallChecker() { - override fun check(expression: FirFunctionCall, context: CheckerContext, reporter: DiagnosticReporter) { +object FirNamedVarargChecker : FirCallChecker() { + override fun check(expression: FirCall, context: CheckerContext, reporter: DiagnosticReporter) { + if (expression !is FirFunctionCall && expression !is FirAnnotationCall && expression !is FirDelegatedConstructorCall) return + val isAnnotation = expression is FirAnnotationCall + val errorFactory = + if (isAnnotation) FirErrors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION + else FirErrors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION + val allowAssignArray = context.session.languageVersionSettings.supportsFeature( - LanguageFeature.AllowAssigningArrayElementsToVarargsInNamedFormForFunctions + if (isAnnotation) LanguageFeature.AssigningArraysToVarargsInNamedFormInAnnotations + else LanguageFeature.AllowAssigningArrayElementsToVarargsInNamedFormForFunctions ) fun checkArgument(argument: FirExpression) { @@ -34,7 +41,7 @@ object FirNamedVarargChecker : FirFunctionCallChecker() { if (argument.expression is FirArrayOfCall) return if (allowAssignArray && typeRef.isArrayType) return - reporter.reportOn(argument.expression.source, FirErrors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION, context) + reporter.reportOn(argument.expression.source, errorFactory, context) } val argumentMap = expression.argumentMapping ?: return diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ExpressionCheckersDiagnosticComponent.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ExpressionCheckersDiagnosticComponent.kt index 14d7ea30cf1..514b6aca56c 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ExpressionCheckersDiagnosticComponent.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ExpressionCheckersDiagnosticComponent.kt @@ -12,7 +12,6 @@ import org.jetbrains.kotlin.fir.analysis.checkers.expression.ExpressionCheckers import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirExpressionChecker import org.jetbrains.kotlin.fir.analysis.checkersComponent import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter -import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction import org.jetbrains.kotlin.fir.expressions.* @OptIn(CheckersComponentInternal::class) @@ -137,6 +136,10 @@ class ExpressionCheckersDiagnosticComponent( checkers.allBlockCheckers.check(block, data, reporter) } + override fun visitDelegatedConstructorCall(delegatedConstructorCall: FirDelegatedConstructorCall, data: CheckerContext) { + checkers.allCallCheckers.check(delegatedConstructorCall, data, reporter) + } + private fun Collection>.check( expression: E, context: CheckerContext, diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt index 5139fc2468f..c6bdab2ec3c 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirDefaultErrorMessages.kt @@ -65,6 +65,8 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ARGUMENT_TYPE_MIS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ARRAY_EQUALITY_OPERATOR_CAN_BE_REPLACED_WITH_EQUALS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ASSIGNED_VALUE_IS_NEVER_READ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ASSIGNMENT_OPERATOR_SHOULD_RETURN_UNIT +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ASSIGNMENT_TYPE_MISMATCH import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.ASSIGN_OPERATOR_AMBIGUITY import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.BACKING_FIELD_IN_INTERFACE @@ -759,7 +761,8 @@ class FirDefaultErrorMessages { map.put(NAMED_PARAMETER_NOT_FOUND, "Cannot find a parameter with this name: {0}", TO_STRING) map.put(MANY_LAMBDA_EXPRESSION_ARGUMENTS, "Only one lambda expression is allowed outside a parenthesized argument list") map.put(SPREAD_OF_NULLABLE, "The spread operator (*foo) may not be applied to an argument of nullable type") - map.put(SPREAD_OF_NULLABLE, "Assigning single elements to varargs in named form is forbidden") + map.put(ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION, "Assigning single elements to varargs in named form is forbidden") + map.put(ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION, "Assigning single elements to varargs in named form is forbidden") map.put(TYPE_MISMATCH, "Type mismatch: inferred type is {1} but {0} was expected", TO_STRING, TO_STRING) map.put(THROWABLE_TYPE_MISMATCH, "Throwable type mismatch: actual type is {0}", TO_STRING) diff --git a/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_3.fir.kt b/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_3.fir.kt index d1070c5cec8..1f7b595fc64 100644 --- a/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_3.fir.kt +++ b/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_3.fir.kt @@ -30,6 +30,6 @@ fun test_ann(s: String, arr: Array) { @Ann("", x = 1) foo() - @Ann(s = "", x = 1) + @Ann(s = "", x = 1) foo() } diff --git a/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_4.fir.kt b/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_4.fir.kt index 2fac9bc8610..0d83adc756d 100644 --- a/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_4.fir.kt +++ b/compiler/testData/diagnostics/tests/varargs/assignArrayToVararagInNamedForm_1_4.fir.kt @@ -30,6 +30,6 @@ fun test_ann(s: String, arr: Array) { @Ann("", x = 1) foo() - @Ann(s = "", x = 1) + @Ann(s = "", x = 1) foo() } diff --git a/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormAnnDeprecation_after.fir.kt b/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormAnnDeprecation_after.fir.kt index e9dd8453b09..3c255f49e0a 100644 --- a/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormAnnDeprecation_after.fir.kt +++ b/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormAnnDeprecation_after.fir.kt @@ -11,7 +11,7 @@ annotation class Ann(vararg val s: String) -@Ann(s = "value") +@Ann(s = "value") fun test1() {} @Ann(s = *arrayOf("value")) @@ -20,7 +20,7 @@ fun test2() {} @Ann(s = *["value"]) fun test3() {} -@JavaAnn(value = "value") +@JavaAnn(value = "value") fun test4() {} @JavaAnn("value", path = arrayOf("path")) diff --git a/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormAnnDeprecation_before.fir.kt b/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormAnnDeprecation_before.fir.kt index 628c0b4dfb4..819fcc96de0 100644 --- a/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormAnnDeprecation_before.fir.kt +++ b/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormAnnDeprecation_before.fir.kt @@ -11,7 +11,7 @@ annotation class Ann(vararg val s: String) -@Ann(s = "value") +@Ann(s = "value") fun test1() {} @Ann(s = *arrayOf("value")) @@ -20,7 +20,7 @@ fun test2() {} @Ann(s = *["value"]) fun test3() {} -@JavaAnn(value = "value") +@JavaAnn(value = "value") fun test4() {} @JavaAnn("value", path = arrayOf("path")) diff --git a/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormFunDeprecation_after.fir.kt b/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormFunDeprecation_after.fir.kt index 15cc3183670..e46b4cb2a32 100644 --- a/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormFunDeprecation_after.fir.kt +++ b/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormFunDeprecation_after.fir.kt @@ -15,9 +15,9 @@ fun test(i: IntArray) { Cls(p = 1) - class Sub : Cls(p = 1) + class Sub : Cls(p = 1) - val c = object : Cls(p = 1) {} + val c = object : Cls(p = 1) {} foo(s = *intArrayOf(elements = 1)) } diff --git a/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormFunDeprecation_before.fir.kt b/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormFunDeprecation_before.fir.kt index 7185888487f..5da1ffdf4b1 100644 --- a/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormFunDeprecation_before.fir.kt +++ b/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormFunDeprecation_before.fir.kt @@ -15,9 +15,9 @@ fun test(i: IntArray) { Cls(p = 1) - class Sub : Cls(p = 1) + class Sub : Cls(p = 1) - val c = object : Cls(p = 1) {} + val c = object : Cls(p = 1) {} foo(s = *intArrayOf(elements = 1)) } diff --git a/compiler/testData/diagnostics/tests/varargs/noAssigningArraysToVarargsFeature.fir.kt b/compiler/testData/diagnostics/tests/varargs/noAssigningArraysToVarargsFeature.fir.kt index 1181825a0d3..cdf7a12dd5a 100644 --- a/compiler/testData/diagnostics/tests/varargs/noAssigningArraysToVarargsFeature.fir.kt +++ b/compiler/testData/diagnostics/tests/varargs/noAssigningArraysToVarargsFeature.fir.kt @@ -42,7 +42,7 @@ fun foo2() {} fun foo(vararg i: Int) {} -@Ann(s = "value") +@Ann(s = "value") fun dep1() { foo(i = 1) } diff --git a/compiler/testData/diagnostics/tests/varargs/prohibitAssigningSingleElementsInNamedForm.fir.kt b/compiler/testData/diagnostics/tests/varargs/prohibitAssigningSingleElementsInNamedForm.fir.kt index 7d2b42c741b..4aea436cf72 100644 --- a/compiler/testData/diagnostics/tests/varargs/prohibitAssigningSingleElementsInNamedForm.fir.kt +++ b/compiler/testData/diagnostics/tests/varargs/prohibitAssigningSingleElementsInNamedForm.fir.kt @@ -4,7 +4,7 @@ annotation class Anno1(vararg val s: String) annotation class Anno2(vararg val i: Int) -@Anno1(s = "foo") +@Anno1(s = "foo") @Anno2(i = *intArrayOf(1)) fun f1() {} diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt index 997e0cc8bfe..c2edaa4c62e 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -1334,14 +1334,24 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert } add(FirErrors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION.errorFactory) { firDiagnostic -> AssigningSingleElementToVarargInNamedFormFunctionErrorImpl( - firSymbolBuilder.typeBuilder.buildKtType(firDiagnostic.a), firDiagnostic as FirPsiDiagnostic, token, ) } add(FirErrors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_FUNCTION.warningFactory) { firDiagnostic -> AssigningSingleElementToVarargInNamedFormFunctionWarningImpl( - firSymbolBuilder.typeBuilder.buildKtType(firDiagnostic.a), + firDiagnostic as FirPsiDiagnostic, + token, + ) + } + add(FirErrors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION.errorFactory) { firDiagnostic -> + AssigningSingleElementToVarargInNamedFormAnnotationErrorImpl( + firDiagnostic as FirPsiDiagnostic, + token, + ) + } + add(FirErrors.ASSIGNING_SINGLE_ELEMENT_TO_VARARG_IN_NAMED_FORM_ANNOTATION.warningFactory) { firDiagnostic -> + AssigningSingleElementToVarargInNamedFormAnnotationWarningImpl( firDiagnostic as FirPsiDiagnostic, token, ) diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt index ecad763f877..e9b86b74f0f 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnostics.kt @@ -958,12 +958,18 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { abstract class AssigningSingleElementToVarargInNamedFormFunctionError : KtFirDiagnostic() { override val diagnosticClass get() = AssigningSingleElementToVarargInNamedFormFunctionError::class - abstract val type: KtType } abstract class AssigningSingleElementToVarargInNamedFormFunctionWarning : KtFirDiagnostic() { override val diagnosticClass get() = AssigningSingleElementToVarargInNamedFormFunctionWarning::class - abstract val type: KtType + } + + abstract class AssigningSingleElementToVarargInNamedFormAnnotationError : KtFirDiagnostic() { + override val diagnosticClass get() = AssigningSingleElementToVarargInNamedFormAnnotationError::class + } + + abstract class AssigningSingleElementToVarargInNamedFormAnnotationWarning : KtFirDiagnostic() { + override val diagnosticClass get() = AssigningSingleElementToVarargInNamedFormAnnotationWarning::class } abstract class OverloadResolutionAmbiguity : KtFirDiagnostic() { diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index eadd0d72fcf..758c125235b 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -1528,7 +1528,6 @@ internal class SpreadOfNullableImpl( } internal class AssigningSingleElementToVarargInNamedFormFunctionErrorImpl( - override val type: KtType, firDiagnostic: FirPsiDiagnostic, override val token: ValidityToken, ) : KtFirDiagnostic.AssigningSingleElementToVarargInNamedFormFunctionError(), KtAbstractFirDiagnostic { @@ -1536,13 +1535,26 @@ internal class AssigningSingleElementToVarargInNamedFormFunctionErrorImpl( } internal class AssigningSingleElementToVarargInNamedFormFunctionWarningImpl( - override val type: KtType, firDiagnostic: FirPsiDiagnostic, override val token: ValidityToken, ) : KtFirDiagnostic.AssigningSingleElementToVarargInNamedFormFunctionWarning(), KtAbstractFirDiagnostic { override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) } +internal class AssigningSingleElementToVarargInNamedFormAnnotationErrorImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.AssigningSingleElementToVarargInNamedFormAnnotationError(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} + +internal class AssigningSingleElementToVarargInNamedFormAnnotationWarningImpl( + firDiagnostic: FirPsiDiagnostic, + override val token: ValidityToken, +) : KtFirDiagnostic.AssigningSingleElementToVarargInNamedFormAnnotationWarning(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic by weakRef(firDiagnostic) +} + internal class OverloadResolutionAmbiguityImpl( override val candidates: List, firDiagnostic: FirPsiDiagnostic,