diff --git a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java index 1f080a88bde..73c780c7c9e 100644 --- a/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java +++ b/compiler/fir/analysis-tests/legacy-fir-tests/tests-gen/org/jetbrains/kotlin/fir/LazyBodyIsNotTouchedTilContractsPhaseTestGenerated.java @@ -571,6 +571,11 @@ public class LazyBodyIsNotTouchedTilContractsPhaseTestGenerated extends Abstract runTest("compiler/fir/analysis-tests/testData/resolve/arguments/namedArrayInAnnotation.kt"); } + @TestMetadata("noParameterForName.kt") + public void testNoParameterForName() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/arguments/noParameterForName.kt"); + } + @TestMetadata("operatorsOverLiterals.kt") public void testOperatorsOverLiterals() throws Exception { runTest("compiler/fir/analysis-tests/testData/resolve/arguments/operatorsOverLiterals.kt"); diff --git a/compiler/fir/analysis-tests/testData/resolve/arguments/noParameterForName.fir.txt b/compiler/fir/analysis-tests/testData/resolve/arguments/noParameterForName.fir.txt new file mode 100644 index 00000000000..d93c624c082 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/arguments/noParameterForName.fir.txt @@ -0,0 +1,6 @@ +FILE: noParameterForName.kt + public final fun foo(x: R|kotlin/Int|): R|kotlin/Unit| { + } + public final fun bar(): R|kotlin/Unit| { + #(y = Int(1)) + } diff --git a/compiler/fir/analysis-tests/testData/resolve/arguments/noParameterForName.kt b/compiler/fir/analysis-tests/testData/resolve/arguments/noParameterForName.kt new file mode 100644 index 00000000000..379178e5804 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/arguments/noParameterForName.kt @@ -0,0 +1,5 @@ +fun foo(x: Int) {} + +fun bar() { + foo(y = 1) +} diff --git a/compiler/fir/analysis-tests/testData/resolve/arguments/simple.kt b/compiler/fir/analysis-tests/testData/resolve/arguments/simple.kt index 067d60f6a9e..38d5c6046a8 100644 --- a/compiler/fir/analysis-tests/testData/resolve/arguments/simple.kt +++ b/compiler/fir/analysis-tests/testData/resolve/arguments/simple.kt @@ -13,5 +13,5 @@ fun test() { foo(second = 0.0, first = 0, fourth = "") foo(first = 0.0, second = 0, third = "", fourth = false) foo(first = 0, second = 0.0, third = false, fourth = "", first = 1) - foo(0, 0.0, false, foth = "") + foo(0, 0.0, false, foth = "") } diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java index 913341cf950..1110c8752b2 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticTestGenerated.java @@ -671,6 +671,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest { runTest("compiler/fir/analysis-tests/testData/resolve/arguments/namedArrayInAnnotation.kt"); } + @Test + @TestMetadata("noParameterForName.kt") + public void testNoParameterForName() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/arguments/noParameterForName.kt"); + } + @Test @TestMetadata("operatorsOverLiterals.kt") public void testOperatorsOverLiterals() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java index 1411df75b37..3e14207f9f6 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirDiagnosticsWithLightTreeTestGenerated.java @@ -675,6 +675,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos runTest("compiler/fir/analysis-tests/testData/resolve/arguments/namedArrayInAnnotation.kt"); } + @Test + @TestMetadata("noParameterForName.kt") + public void testNoParameterForName() throws Exception { + runTest("compiler/fir/analysis-tests/testData/resolve/arguments/noParameterForName.kt"); + } + @Test @TestMetadata("operatorsOverLiterals.kt") public void testOperatorsOverLiterals() throws Exception { 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 7a030d1f5e0..09baaf16e1b 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 @@ -233,6 +233,10 @@ object DIAGNOSTICS_LIST : DiagnosticList() { val NO_VALUE_FOR_PARAMETER by error(PositioningStrategy.VALUE_ARGUMENTS) { parameter("violatedParameter") } + + val NAMED_PARAMETER_NOT_FOUND by error(PositioningStrategy.NAME_OF_NAMED_ARGUMENT) { + parameter("name") + } } val AMBIGUITY by object : DiagnosticGroup("Ambiguity") { 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 b2b35c7bd72..3acc5bdfbc4 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 @@ -187,6 +187,7 @@ object FirErrors { val ARGUMENT_PASSED_TWICE by error0(SourceElementPositioningStrategies.NAME_OF_NAMED_ARGUMENT) val TOO_MANY_ARGUMENTS by error1>() val NO_VALUE_FOR_PARAMETER by error1(SourceElementPositioningStrategies.VALUE_ARGUMENTS) + val NAMED_PARAMETER_NOT_FOUND by error1(SourceElementPositioningStrategies.NAME_OF_NAMED_ARGUMENT) // Ambiguity val OVERLOAD_RESOLUTION_AMBIGUITY by error1>>(SourceElementPositioningStrategies.REFERENCE_BY_QUALIFIED) 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 0b91a829183..8cfc3f1dc67 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 @@ -131,6 +131,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MULTIPLE_VARARG_P import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MUST_BE_INITIALIZED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MUST_BE_INITIALIZED_OR_BE_ABSTRACT import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NAMED_ARGUMENTS_NOT_ALLOWED +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NAMED_PARAMETER_NOT_FOUND import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NESTED_CLASS_NOT_ALLOWED import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NONE_APPLICABLE import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.NON_ABSTRACT_FUNCTION_WITH_NO_BODY @@ -394,6 +395,7 @@ class FirDefaultErrorMessages : DefaultErrorMessages.Extension { map.put(TOO_MANY_ARGUMENTS, "Too many arguments for {0}", FQ_NAMES_IN_TYPES) map.put(ARGUMENT_PASSED_TWICE, "An argument is already passed for this parameter") map.put(NO_VALUE_FOR_PARAMETER, "No value passed for parameter ''{0}''", NAME) + map.put(NAMED_PARAMETER_NOT_FOUND, "Cannot find a parameter with this name: {0}", TO_STRING) // Ambiguity map.put(OVERLOAD_RESOLUTION_AMBIGUITY, "Overload resolution ambiguity between candidates: {0}", SYMBOLS) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt index 9b4679652f0..67043f2c2f7 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/coneDiagnosticToFirDiagnostic.kt @@ -141,6 +141,10 @@ private fun mapInapplicableCandidateError( is ArgumentPassedTwice -> FirErrors.ARGUMENT_PASSED_TWICE.on(rootCause.argument.source) is TooManyArguments -> FirErrors.TOO_MANY_ARGUMENTS.on(rootCause.argument.source ?: source, rootCause.function) is NoValueForParameter -> FirErrors.NO_VALUE_FOR_PARAMETER.on(qualifiedAccessSource ?: source, rootCause.valueParameter) + is NameNotFound -> FirErrors.NAMED_PARAMETER_NOT_FOUND.on( + rootCause.argument.source ?: source, + rootCause.argument.name.asString() + ) else -> null } }.ifEmpty { listOf(FirErrors.INAPPLICABLE_CANDIDATE.on(source, diagnostic.candidate.symbol)) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirArgumentsToParametersMapper.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirArgumentsToParametersMapper.kt index fa3bb6ad249..afb7f214702 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirArgumentsToParametersMapper.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/FirArgumentsToParametersMapper.kt @@ -120,10 +120,8 @@ private class FirCallArgumentsProcessor( fun processArgumentsInParenthesis(arguments: List) { for (argument in arguments) { - val argumentName = argument.argumentName - // process position argument - if (argumentName == null) { + if (argument !is FirNamedArgumentExpression) { if (processPositionArgument(argument)) { state = State.VARARG_POSITION } @@ -134,7 +132,7 @@ private class FirCallArgumentsProcessor( completeVarargPositionArguments() } - processNamedArgument(argument, argumentName) + processNamedArgument(argument) } } if (state == State.VARARG_POSITION) { @@ -168,14 +166,14 @@ private class FirCallArgumentsProcessor( } } - private fun processNamedArgument(argument: FirExpression, name: Name) { + private fun processNamedArgument(argument: FirNamedArgumentExpression) { forbiddenNamedArgumentsTarget?.let { addDiagnostic(NamedArgumentNotAllowed(argument, function, it)) } val stateAllowsMixedNamedAndPositionArguments = state != State.NAMED_ONLY_ARGUMENTS state = State.NAMED_ONLY_ARGUMENTS - val parameter = findParameterByName(argument, name) ?: return + val parameter = findParameterByName(argument) ?: return result[parameter]?.let { addDiagnostic(ArgumentPassedTwice(argument, parameter, it)) @@ -257,8 +255,8 @@ private class FirCallArgumentsProcessor( return nameToParameter!![name] } - private fun findParameterByName(argument: FirExpression, name: Name): FirValueParameter? { - val parameter = getParameterByName(name) + private fun findParameterByName(argument: FirNamedArgumentExpression): FirValueParameter? { + val parameter = getParameterByName(argument.name) // TODO // if (descriptor is CallableMemberDescriptor && descriptor.kind == CallableMemberDescriptor.Kind.FAKE_OVERRIDE) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionDiagnostic.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionDiagnostic.kt index 696167ab019..cf2296ab974 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionDiagnostic.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ResolutionDiagnostic.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.resolve.ForbiddenNamedArgumentsTarget import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirValueParameter import org.jetbrains.kotlin.fir.expressions.FirExpression +import org.jetbrains.kotlin.fir.expressions.FirNamedArgumentExpression import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.resolve.calls.tower.CandidateApplicability import org.jetbrains.kotlin.resolve.calls.tower.CandidateApplicability.* @@ -51,9 +52,9 @@ class NoValueForParameter( ) : ResolutionDiagnostic(INAPPLICABLE_ARGUMENTS_MAPPING_ERROR) class NameNotFound( - override val argument: FirExpression, + val argument: FirNamedArgumentExpression, val function: FirFunction<*> -) : InapplicableArgumentDiagnostic() +) : ResolutionDiagnostic(INAPPLICABLE_ARGUMENTS_MAPPING_ERROR) object InapplicableCandidate : ResolutionDiagnostic(INAPPLICABLE) diff --git a/compiler/testData/diagnostics/tests/checkArguments/kt1897_diagnostic_part.fir.kt b/compiler/testData/diagnostics/tests/checkArguments/kt1897_diagnostic_part.fir.kt index b63a5b4f488..49e6d2c1c1e 100644 --- a/compiler/testData/diagnostics/tests/checkArguments/kt1897_diagnostic_part.fir.kt +++ b/compiler/testData/diagnostics/tests/checkArguments/kt1897_diagnostic_part.fir.kt @@ -15,7 +15,7 @@ fun test() { foo("", 1, xx) - foo(r = xx, i = "", s = "") + foo(r = xx, i = "", s = "") foo(i = 1, i = 1, s = 11) diff --git a/compiler/testData/diagnostics/tests/namedArguments/ambiguousNamedArguments1.fir.kt b/compiler/testData/diagnostics/tests/namedArguments/ambiguousNamedArguments1.fir.kt index 1a4e95387fe..5c61c7e11f1 100644 --- a/compiler/testData/diagnostics/tests/namedArguments/ambiguousNamedArguments1.fir.kt +++ b/compiler/testData/diagnostics/tests/namedArguments/ambiguousNamedArguments1.fir.kt @@ -11,8 +11,8 @@ interface D : B, A fun foo(x : C, y : D){ x.foo(x = 0) - x.foo(y = 0) - y.foo(x = 0) + x.foo(y = 0) + y.foo(x = 0) y.foo(y = 0) } @@ -21,7 +21,7 @@ abstract class D1 : A, B fun bar(x : C1, y : D1){ x.foo(x = 0) - x.foo(y = 0) + x.foo(y = 0) y.foo(x = 0) - y.foo(y = 0) + y.foo(y = 0) } diff --git a/compiler/testData/diagnostics/tests/namedArguments/ambiguousNamedArguments2.fir.kt b/compiler/testData/diagnostics/tests/namedArguments/ambiguousNamedArguments2.fir.kt index 058d2c1c35a..08ce689b611 100644 --- a/compiler/testData/diagnostics/tests/namedArguments/ambiguousNamedArguments2.fir.kt +++ b/compiler/testData/diagnostics/tests/namedArguments/ambiguousNamedArguments2.fir.kt @@ -14,11 +14,11 @@ interface C : A, B { // Warning here, this is correct } fun test(c: C) { - c.foo(b1 = 1, b2 = 1.0) - c.foo(a1 = 1, b2 = 1.0) + c.foo(b1 = 1, b2 = 1.0) + c.foo(a1 = 1, b2 = 1.0) c.foo(a1 = 1, a2 = 1.0) c.foo(a1 = 1, a2 = 1.0) - c.bar(a1 = 1, a2 = 1.0, b3= "") - c.baz(a1 = 1, b2 = 1.0, a3 = "", b4 = 2, a5 = "") - c.baz(a1 = 1, a2 = 1.0, a3 = "", b4 = 2, a5 = "") + c.bar(a1 = 1, a2 = 1.0, b3= "") + c.baz(a1 = 1, b2 = 1.0, a3 = "", b4 = 2, a5 = "") + c.baz(a1 = 1, a2 = 1.0, a3 = "", b4 = 2, a5 = "") } diff --git a/compiler/testData/diagnostics/tests/namedArguments/ambiguousNamedArgumentsWithGenerics1.fir.kt b/compiler/testData/diagnostics/tests/namedArguments/ambiguousNamedArgumentsWithGenerics1.fir.kt index d6d96276071..f8518920075 100644 --- a/compiler/testData/diagnostics/tests/namedArguments/ambiguousNamedArgumentsWithGenerics1.fir.kt +++ b/compiler/testData/diagnostics/tests/namedArguments/ambiguousNamedArgumentsWithGenerics1.fir.kt @@ -11,5 +11,5 @@ interface C : A, B { // Warning here, this is correct fun test(c: C) { c.foo(a = 1) - c.foo(b = 1) + c.foo(b = 1) } diff --git a/compiler/testData/diagnostics/tests/namedArguments/ambiguousNamedArgumentsWithGenerics2.fir.kt b/compiler/testData/diagnostics/tests/namedArguments/ambiguousNamedArgumentsWithGenerics2.fir.kt index f2d84a634b0..bb54a33c595 100644 --- a/compiler/testData/diagnostics/tests/namedArguments/ambiguousNamedArgumentsWithGenerics2.fir.kt +++ b/compiler/testData/diagnostics/tests/namedArguments/ambiguousNamedArgumentsWithGenerics2.fir.kt @@ -11,5 +11,5 @@ interface C : A, B { // Warning here, this is correct fun test(c: C) { c.foo(a = 1) - c.foo(b = 1) + c.foo(b = 1) } diff --git a/compiler/testData/diagnostics/tests/namedArguments/ambiguousNamedArgumentsWithGenerics3.fir.kt b/compiler/testData/diagnostics/tests/namedArguments/ambiguousNamedArgumentsWithGenerics3.fir.kt index 9cd47f23117..966c59ad0c1 100644 --- a/compiler/testData/diagnostics/tests/namedArguments/ambiguousNamedArgumentsWithGenerics3.fir.kt +++ b/compiler/testData/diagnostics/tests/namedArguments/ambiguousNamedArgumentsWithGenerics3.fir.kt @@ -11,5 +11,5 @@ interface C : A, B { // Warning here, this is correct fun test(c: C) { c.foo(a = 1) - c.foo(b = 1) + c.foo(b = 1) } diff --git a/compiler/testData/diagnostics/tests/namedArguments/disallowForJavaMethods.fir.kt b/compiler/testData/diagnostics/tests/namedArguments/disallowForJavaMethods.fir.kt index c7d4c996df1..b061f3680de 100644 --- a/compiler/testData/diagnostics/tests/namedArguments/disallowForJavaMethods.fir.kt +++ b/compiler/testData/diagnostics/tests/namedArguments/disallowForJavaMethods.fir.kt @@ -21,7 +21,7 @@ class KotlinSubSubClass : KotlinSubClass() { fun viaRealOverride() = KotlinSubSubClass().foo(kotlinName = 3) -fun unresolvedParameter() = JavaSuperClass().foo(nonexistentName = 4) +fun unresolvedParameter() = JavaSuperClass().foo(nonexistentName = 4) fun multipleParameters() = JavaSuperClass().multipleParameters(first = 1, second = 2L, third = "3") diff --git a/compiler/testData/diagnostics/tests/namedArguments/namedArgumentsAndDefaultValues.fir.kt b/compiler/testData/diagnostics/tests/namedArguments/namedArgumentsAndDefaultValues.fir.kt index 2374bab59f7..0204e21d7ed 100644 --- a/compiler/testData/diagnostics/tests/namedArguments/namedArgumentsAndDefaultValues.fir.kt +++ b/compiler/testData/diagnostics/tests/namedArguments/namedArgumentsAndDefaultValues.fir.kt @@ -21,7 +21,7 @@ fun test() { bar(1, z = "") bar(1, z = "", y = 2) bar(z = "", 1) - bar(1, zz = "", + bar(1, zz = "", zz.foo ) } diff --git a/compiler/testData/diagnostics/tests/namedArguments/namedArgumentsInOverrides.fir.kt b/compiler/testData/diagnostics/tests/namedArguments/namedArgumentsInOverrides.fir.kt index 09ce8b303e7..aff65f1c5d8 100644 --- a/compiler/testData/diagnostics/tests/namedArguments/namedArgumentsInOverrides.fir.kt +++ b/compiler/testData/diagnostics/tests/namedArguments/namedArgumentsInOverrides.fir.kt @@ -18,5 +18,5 @@ fun test1(d: D) { } fun test2(c: C) { - c.foo(b1 = 1, b2 = 1.0) + c.foo(b1 = 1, b2 = 1.0) } diff --git a/compiler/testData/diagnostics/tests/override/parameterNames/invokeInFunctionClass.fir.kt b/compiler/testData/diagnostics/tests/override/parameterNames/invokeInFunctionClass.fir.kt index 36f23c088f8..85d2cad8c5e 100644 --- a/compiler/testData/diagnostics/tests/override/parameterNames/invokeInFunctionClass.fir.kt +++ b/compiler/testData/diagnostics/tests/override/parameterNames/invokeInFunctionClass.fir.kt @@ -4,24 +4,24 @@ class Function1Impl : (String) -> Unit { fun test1(f: Function1Impl) { f("") - f(p0 = "") + f(p0 = "") f(myParamName = "") f.invoke("") - f.invoke(p0 = "") + f.invoke(p0 = "") f.invoke(myParamName = "") } fun test2(f: (String) -> Unit) { f("") - f(p0 = "") - f(myParamName = "") + f(p0 = "") + f(myParamName = "") f.invoke("") - f.invoke(p0 = "") - f.invoke(myParamName = "") + f.invoke(p0 = "") + f.invoke(myParamName = "") } fun test3(f: String.(String) -> Unit) { "".f("") - "".f(p0 = "") - "".f(zzz = "") + "".f(p0 = "") + "".f(zzz = "") } diff --git a/compiler/testData/diagnostics/tests/resolve/nestedCalls/analyzeUnmappedArguments.fir.kt b/compiler/testData/diagnostics/tests/resolve/nestedCalls/analyzeUnmappedArguments.fir.kt deleted file mode 100644 index f748d007e89..00000000000 --- a/compiler/testData/diagnostics/tests/resolve/nestedCalls/analyzeUnmappedArguments.fir.kt +++ /dev/null @@ -1,9 +0,0 @@ -package c - -fun test() { - with (1) l@ { - foo(1, zz = { this@l } ) - } -} - -fun foo(x: Int) = x diff --git a/compiler/testData/diagnostics/tests/resolve/nestedCalls/analyzeUnmappedArguments.kt b/compiler/testData/diagnostics/tests/resolve/nestedCalls/analyzeUnmappedArguments.kt index 9c24fdd8879..7b93a745818 100644 --- a/compiler/testData/diagnostics/tests/resolve/nestedCalls/analyzeUnmappedArguments.kt +++ b/compiler/testData/diagnostics/tests/resolve/nestedCalls/analyzeUnmappedArguments.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL package c fun test() { diff --git a/compiler/testData/diagnostics/tests/resolve/nestedCalls/completeUnmappedArguments.fir.kt b/compiler/testData/diagnostics/tests/resolve/nestedCalls/completeUnmappedArguments.fir.kt deleted file mode 100644 index 215bd134df8..00000000000 --- a/compiler/testData/diagnostics/tests/resolve/nestedCalls/completeUnmappedArguments.fir.kt +++ /dev/null @@ -1,14 +0,0 @@ -package c - -fun zzz(i: Int, f: (Int) -> Int) { throw Exception("$i $f")} - -fun test() { - fun foo(): Int = 42 - - fun bar(i: Int) = i - - bar(foo(xx = zzz(11) { j: Int -> j + 7 })) - - bar(zz = foo( - xx = zzz(12) { i: Int -> i + i })) -} diff --git a/compiler/testData/diagnostics/tests/resolve/nestedCalls/completeUnmappedArguments.kt b/compiler/testData/diagnostics/tests/resolve/nestedCalls/completeUnmappedArguments.kt index 4214ee72398..f936b4c1350 100644 --- a/compiler/testData/diagnostics/tests/resolve/nestedCalls/completeUnmappedArguments.kt +++ b/compiler/testData/diagnostics/tests/resolve/nestedCalls/completeUnmappedArguments.kt @@ -1,3 +1,4 @@ +// FIR_IDENTICAL package c fun zzz(i: Int, f: (Int) -> Int) { throw Exception("$i $f")} diff --git a/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormFunDeprecation_after.fir.kt b/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormFunDeprecation_after.fir.kt index 1255027b784..464a298a01e 100644 --- a/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormFunDeprecation_after.fir.kt +++ b/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormFunDeprecation_after.fir.kt @@ -53,8 +53,8 @@ fun testMany(a: Any) { manyFoo(s = "") manyFoo(a) - manyFoo(v = a) - manyFoo(s = a) - manyFoo(v = a as Int) - manyFoo(s = a as String) + manyFoo(v = a) + manyFoo(s = a) + manyFoo(v = a as Int) + manyFoo(s = a as String) } diff --git a/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormFunDeprecation_before.fir.kt b/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormFunDeprecation_before.fir.kt index a2efef520e7..a2e2455a240 100644 --- a/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormFunDeprecation_before.fir.kt +++ b/compiler/testData/diagnostics/tests/varargs/assigningSingleElementsInNamedFormFunDeprecation_before.fir.kt @@ -53,8 +53,8 @@ fun testMany(a: Any) { manyFoo(s = "") manyFoo(a) - manyFoo(v = a) - manyFoo(s = a) - manyFoo(v = a as Int) - manyFoo(s = a as String) + manyFoo(v = a) + manyFoo(s = a) + manyFoo(v = a as Int) + manyFoo(s = a as String) } 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 77a56efaa8f..489bf6bcdf4 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 @@ -726,6 +726,13 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.NAMED_PARAMETER_NOT_FOUND) { firDiagnostic -> + NamedParameterNotFoundImpl( + firDiagnostic.a, + firDiagnostic as FirPsiDiagnostic<*>, + token, + ) + } add(FirErrors.OVERLOAD_RESOLUTION_AMBIGUITY) { firDiagnostic -> OverloadResolutionAmbiguityImpl( firDiagnostic.a.map { abstractFirBasedSymbol -> 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 7335f525051..222c5d08cbf 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 @@ -523,6 +523,11 @@ sealed class KtFirDiagnostic : KtDiagnosticWithPsi { abstract val violatedParameter: KtSymbol } + abstract class NamedParameterNotFound : KtFirDiagnostic() { + override val diagnosticClass get() = NamedParameterNotFound::class + abstract val name: String + } + abstract class OverloadResolutionAmbiguity : KtFirDiagnostic() { override val diagnosticClass get() = OverloadResolutionAmbiguity::class abstract val candidates: List 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 485df0ef79e..4a92fc20e69 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 @@ -836,6 +836,14 @@ internal class NoValueForParameterImpl( override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) } +internal class NamedParameterNotFoundImpl( + override val name: String, + firDiagnostic: FirPsiDiagnostic<*>, + override val token: ValidityToken, +) : KtFirDiagnostic.NamedParameterNotFound(), KtAbstractFirDiagnostic { + override val firDiagnostic: FirPsiDiagnostic<*> by weakRef(firDiagnostic) +} + internal class OverloadResolutionAmbiguityImpl( override val candidates: List, firDiagnostic: FirPsiDiagnostic<*>,