diff --git a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/resolve/FirReferenceResolveTestGenerated.java b/idea/idea-fir/tests/org/jetbrains/kotlin/idea/resolve/FirReferenceResolveTestGenerated.java index b1e231b4d87..1e5df1e9ac4 100644 --- a/idea/idea-fir/tests/org/jetbrains/kotlin/idea/resolve/FirReferenceResolveTestGenerated.java +++ b/idea/idea-fir/tests/org/jetbrains/kotlin/idea/resolve/FirReferenceResolveTestGenerated.java @@ -279,6 +279,11 @@ public class FirReferenceResolveTestGenerated extends AbstractFirReferenceResolv runTest("idea/testData/resolve/references/PackageReferenceInImport.kt"); } + @TestMetadata("parameterByName.kt") + public void testParameterByName() throws Exception { + runTest("idea/testData/resolve/references/parameterByName.kt"); + } + @TestMetadata("PropertyPlaceInClassObjectInObject.kt") public void testPropertyPlaceInClassObjectInObject() throws Exception { runTest("idea/testData/resolve/references/PropertyPlaceInClassObjectInObject.kt"); diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt index 6fcae082c60..8c7fcd13ab3 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/references/FirReferenceResolveHelper.kt @@ -24,6 +24,7 @@ import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef import org.jetbrains.kotlin.fir.types.classId import org.jetbrains.kotlin.idea.fir.* import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFir +import org.jetbrains.kotlin.idea.fir.low.level.api.api.getOrBuildFirSafe import org.jetbrains.kotlin.idea.frontend.api.fir.KtFirAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.fir.KtSymbolByFirBuilder import org.jetbrains.kotlin.idea.frontend.api.fir.buildSymbol @@ -35,6 +36,7 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelector +import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult internal object FirReferenceResolveHelper { fun FirResolvedTypeRef.toTargetSymbol(session: FirSession, symbolBuilder: KtSymbolByFirBuilder): KtSymbol? { @@ -155,10 +157,32 @@ internal object FirReferenceResolveHelper { is FirReturnExpression -> getSymbolsByReturnExpression(expression, fir, symbolBuilder) is FirErrorNamedReference -> getSymbolsByErrorNamedReference(fir, symbolBuilder) is FirResolvable -> getSymbolsByResolvable(fir, expression, session, symbolBuilder) + is FirNamedArgumentExpression -> getSymbolsByNameArgumentExpression(expression, analysisSession, symbolBuilder) else -> handleUnknownFirElement(expression, analysisSession, session, symbolBuilder) } } + private fun getSymbolsByNameArgumentExpression( + expression: KtSimpleNameExpression, + analysisSession: KtFirAnalysisSession, + symbolBuilder: KtSymbolByFirBuilder + ): Collection { + val ktValueArgumentName = expression.parent as? KtValueArgumentName ?: return emptyList() + val ktValueArgument = ktValueArgumentName.parent as? KtValueArgument ?: return emptyList() + val ktValueArgumentList = ktValueArgument.parent as? KtValueArgumentList ?: return emptyList() + val ktCallExpression = ktValueArgumentList.parent as? KtCallExpression ?: return emptyList() + + val firCall = ktCallExpression.getOrBuildFirSafe(analysisSession.firResolveState) ?: return emptyList() + val parameter = firCall.findCorrespondingParameter(ktValueArgument) ?: return emptyList() + return listOfNotNull(parameter.buildSymbol(symbolBuilder)) + } + + private fun FirFunctionCall.findCorrespondingParameter(ktValueArgument: KtValueArgument): FirValueParameter? = + argumentMapping?.entries?.firstNotNullResult { (firArgument, firParameter) -> + if (firArgument.psi == ktValueArgument) firParameter + else null + } + private fun handleUnknownFirElement( expression: KtSimpleNameExpression, analysisSession: KtFirAnalysisSession, diff --git a/idea/testData/resolve/references/JavaParameter.kt b/idea/testData/resolve/references/JavaParameter.kt index 6a675b9bc44..09415412879 100644 --- a/idea/testData/resolve/references/JavaParameter.kt +++ b/idea/testData/resolve/references/JavaParameter.kt @@ -1,5 +1,3 @@ -// IGNORE_FIR - lateinit var x: java.lang.Readable lateinit var y: java.nio.CharBuffer diff --git a/idea/testData/resolve/references/parameterByName.kt b/idea/testData/resolve/references/parameterByName.kt new file mode 100644 index 00000000000..7bae5fceadb --- /dev/null +++ b/idea/testData/resolve/references/parameterByName.kt @@ -0,0 +1,7 @@ +fun sum(aa: Int, bb: Int) = a + b + +fun main() { + println(sum(bb = 1, aa = 2)) +} + +// REF: bb diff --git a/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java index f03a2add44a..ef2b824fbad 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/resolve/ReferenceResolveTestGenerated.java @@ -279,6 +279,11 @@ public class ReferenceResolveTestGenerated extends AbstractReferenceResolveTest runTest("idea/testData/resolve/references/PackageReferenceInImport.kt"); } + @TestMetadata("parameterByName.kt") + public void testParameterByName() throws Exception { + runTest("idea/testData/resolve/references/parameterByName.kt"); + } + @TestMetadata("PropertyPlaceInClassObjectInObject.kt") public void testPropertyPlaceInClassObjectInObject() throws Exception { runTest("idea/testData/resolve/references/PropertyPlaceInClassObjectInObject.kt");