Analysis API: Get argument mapping from candidate and type parameters
from candidate symbol.
This commit is contained in:
committed by
Ilya Kirillov
parent
0ed802bca4
commit
ace826c570
+19
-14
@@ -250,7 +250,7 @@ internal class KtFirCallResolver(
|
||||
?: return null
|
||||
if (targetSymbol !is FirCallableSymbol<*>) return null
|
||||
if (targetSymbol is FirErrorFunctionSymbol || targetSymbol is FirErrorPropertySymbol) return null
|
||||
val unsbustitutedKtSignature = targetSymbol.toKtSignature()
|
||||
val unsubstitutedKtSignature = targetSymbol.toKtSignature()
|
||||
|
||||
handleCompoundAccessCall(psi, fir, resolveFragmentOfCall)?.let { return it }
|
||||
|
||||
@@ -261,9 +261,9 @@ internal class KtFirCallResolver(
|
||||
// candidate, `Candidate.substitutor` is not complete. maybe we can carry over the final substitutor if it's available from
|
||||
// body resolve phase?
|
||||
val substitutor =
|
||||
(fir as? FirQualifiedAccess)?.createConeSubstitutorFromTypeArguments()?.toKtSubstitutor() ?: KtSubstitutor.Empty(token)
|
||||
(fir as? FirQualifiedAccess)?.createSubstitutorFromTypeArguments(targetSymbol) ?: KtSubstitutor.Empty(token)
|
||||
KtPartiallyAppliedSymbol(
|
||||
unsbustitutedKtSignature.substitute(substitutor),
|
||||
unsubstitutedKtSignature.substitute(substitutor),
|
||||
candidate.dispatchReceiverValue?.receiverExpression?.toKtReceiverValue(),
|
||||
candidate.extensionReceiverValue?.receiverExpression?.toKtReceiverValue(),
|
||||
)
|
||||
@@ -304,17 +304,17 @@ internal class KtFirCallResolver(
|
||||
}
|
||||
val substitutor = fir.createConeSubstitutorFromTypeArguments() ?: return null
|
||||
KtPartiallyAppliedSymbol(
|
||||
unsbustitutedKtSignature.substitute(substitutor.toKtSubstitutor()),
|
||||
unsubstitutedKtSignature.substitute(substitutor.toKtSubstitutor()),
|
||||
dispatchReceiver,
|
||||
extensionReceiver,
|
||||
)
|
||||
} else {
|
||||
KtPartiallyAppliedSymbol(unsbustitutedKtSignature, null, null)
|
||||
KtPartiallyAppliedSymbol(unsubstitutedKtSignature, _dispatchReceiver = null, _extensionReceiver = null)
|
||||
}
|
||||
|
||||
return when (fir) {
|
||||
is FirAnnotationCall -> {
|
||||
if (unsbustitutedKtSignature.symbol !is KtConstructorSymbol) return null
|
||||
if (unsubstitutedKtSignature.symbol !is KtConstructorSymbol) return null
|
||||
@Suppress("UNCHECKED_CAST") // safe because of the above check on targetKtSymbol
|
||||
KtAnnotationCall(
|
||||
partiallyAppliedSymbol as KtPartiallyAppliedFunctionSymbol<KtConstructorSymbol>,
|
||||
@@ -322,7 +322,7 @@ internal class KtFirCallResolver(
|
||||
)
|
||||
}
|
||||
is FirDelegatedConstructorCall -> {
|
||||
if (unsbustitutedKtSignature.symbol !is KtConstructorSymbol) return null
|
||||
if (unsubstitutedKtSignature.symbol !is KtConstructorSymbol) return null
|
||||
@Suppress("UNCHECKED_CAST") // safe because of the above check on targetKtSymbol
|
||||
KtDelegatedConstructorCall(
|
||||
partiallyAppliedSymbol as KtPartiallyAppliedFunctionSymbol<KtConstructorSymbol>,
|
||||
@@ -331,7 +331,7 @@ internal class KtFirCallResolver(
|
||||
)
|
||||
}
|
||||
is FirVariableAssignment -> {
|
||||
if (unsbustitutedKtSignature.symbol !is KtVariableLikeSymbol) return null
|
||||
if (unsubstitutedKtSignature.symbol !is KtVariableLikeSymbol) return null
|
||||
val rhs = fir.rValue.psi as? KtExpression
|
||||
@Suppress("UNCHECKED_CAST") // safe because of the above check on targetKtSymbol
|
||||
KtSimpleVariableAccessCall(
|
||||
@@ -340,7 +340,7 @@ internal class KtFirCallResolver(
|
||||
)
|
||||
}
|
||||
is FirPropertyAccessExpression -> {
|
||||
if (unsbustitutedKtSignature.symbol !is KtVariableLikeSymbol) return null
|
||||
if (unsubstitutedKtSignature.symbol !is KtVariableLikeSymbol) return null
|
||||
@Suppress("UNCHECKED_CAST") // safe because of the above check on targetKtSymbol
|
||||
KtSimpleVariableAccessCall(
|
||||
partiallyAppliedSymbol as KtPartiallyAppliedVariableSymbol<KtVariableLikeSymbol>,
|
||||
@@ -348,17 +348,22 @@ internal class KtFirCallResolver(
|
||||
)
|
||||
}
|
||||
is FirFunctionCall -> {
|
||||
if (unsbustitutedKtSignature.symbol !is KtFunctionLikeSymbol) return null
|
||||
val argumentMapping =
|
||||
if (unsubstitutedKtSignature.symbol !is KtFunctionLikeSymbol) return null
|
||||
val argumentMapping = if (candidate is Candidate) {
|
||||
candidate.argumentMapping
|
||||
} else {
|
||||
fir.argumentMapping
|
||||
}
|
||||
val argumentMappingWithoutExtensionReceiver =
|
||||
if (firstArgIsExtensionReceiver) {
|
||||
fir.argumentMapping?.entries?.drop(1)
|
||||
argumentMapping?.entries?.drop(1)
|
||||
} else {
|
||||
fir.argumentMapping?.entries
|
||||
argumentMapping?.entries
|
||||
}
|
||||
@Suppress("UNCHECKED_CAST") // safe because of the above check on targetKtSymbol
|
||||
KtSimpleFunctionCall(
|
||||
partiallyAppliedSymbol as KtPartiallyAppliedFunctionSymbol<KtFunctionLikeSymbol>,
|
||||
argumentMapping
|
||||
argumentMappingWithoutExtensionReceiver
|
||||
?.createArgumentMapping(partiallyAppliedSymbol.signature as KtFunctionLikeSignature<*>)
|
||||
?: LinkedHashMap(),
|
||||
fir is FirImplicitInvokeCall
|
||||
|
||||
+18
@@ -34,6 +34,24 @@ public class FirResolveCallTestGenerated extends AbstractResolveCallTest {
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/callResolver/resolveCall"), Pattern.compile("^(.+)\\.kt$"), null, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("ambiguous.kt")
|
||||
public void testAmbiguous() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/ambiguous.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("ambiguousWithExplicitTypeParameters.kt")
|
||||
public void testAmbiguousWithExplicitTypeParameters() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/ambiguousWithExplicitTypeParameters.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("ambiguousWithInferredTypeParameters.kt")
|
||||
public void testAmbiguousWithInferredTypeParameters() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/ambiguousWithInferredTypeParameters.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("annotationEntry.kt")
|
||||
public void testAnnotationEntry() throws Exception {
|
||||
|
||||
+28
@@ -40,6 +40,34 @@ public class FirResolveCandidatesTestGenerated extends AbstractResolveCandidates
|
||||
runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates.kt");
|
||||
}
|
||||
|
||||
@Nested
|
||||
@TestMetadata("analysis/analysis-api/testData/components/callResolver/resolveCandidates/multipleCandidates")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
public class MultipleCandidates {
|
||||
@Test
|
||||
public void testAllFilesPresentInMultipleCandidates() throws Exception {
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/callResolver/resolveCandidates/multipleCandidates"), Pattern.compile("^(.+)\\.kt$"), null, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("ambiguous.kt")
|
||||
public void testAmbiguous() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/multipleCandidates/ambiguous.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("ambiguousWithExplicitTypeParameters.kt")
|
||||
public void testAmbiguousWithExplicitTypeParameters() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/multipleCandidates/ambiguousWithExplicitTypeParameters.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("ambiguousWithInferredTypeParameters.kt")
|
||||
public void testAmbiguousWithInferredTypeParameters() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/multipleCandidates/ambiguousWithInferredTypeParameters.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
@TestMetadata("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
|
||||
Reference in New Issue
Block a user