[Analysis API] Provide type mapping for callable references

Strictly speaking, callable references are not calls. However, type
arguments are still inferred for references, and 'KtCall' is the only
place in Analysis API that exposes call-substituted types.

^KT-66485 Fixed
This commit is contained in:
Yan Zhulanow
2024-02-22 02:17:14 +09:00
committed by Space Team
parent 6028595ce4
commit 0147d725fb
45 changed files with 940 additions and 6 deletions
@@ -154,6 +154,7 @@ internal class KtFe10CallResolver(
val parentBinaryExpression = psi.parentOfType<KtBinaryExpression>()
val lhs = KtPsiUtil.deparenthesize(parentBinaryExpression?.left)
val unwrappedPsi = KtPsiUtil.deparenthesize(psi as? KtExpression) ?: psi
if (parentBinaryExpression != null &&
parentBinaryExpression.operationToken == KtTokens.EQ &&
(lhs == unwrappedPsi || (lhs as? KtQualifiedExpression)?.selectorExpression == unwrappedPsi) &&
@@ -163,6 +164,11 @@ internal class KtFe10CallResolver(
// treated as a property read.
return resolveCall(parentBinaryExpression)
}
if (psi is KtCallableReferenceExpression) {
return resolveCall(psi.callableReference)
}
when (unwrappedPsi) {
is KtBinaryExpression -> {
handleAsCompoundAssignment(this, unwrappedPsi)?.let { return@with it }
@@ -1010,6 +1010,130 @@ public class Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated extends A
}
}
@Nested
@TestMetadata("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences")
@TestDataPath("$PROJECT_ROOT")
public class CallableReferences {
@Test
public void testAllFilesPresentInCallableReferences() {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("annotationConstructor.kt")
public void testAnnotationConstructor() {
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/annotationConstructor.kt");
}
@Test
@TestMetadata("boundMemberExtensionFunction.kt")
public void testBoundMemberExtensionFunction() {
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberExtensionFunction.kt");
}
@Test
@TestMetadata("boundMemberFunction.kt")
public void testBoundMemberFunction() {
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberFunction.kt");
}
@Test
@TestMetadata("boundMemberProperty.kt")
public void testBoundMemberProperty() {
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundMemberProperty.kt");
}
@Test
@TestMetadata("boundTopLevelExtensionFunction.kt")
public void testBoundTopLevelExtensionFunction() {
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionFunction.kt");
}
@Test
@TestMetadata("boundTopLevelExtensionProperty.kt")
public void testBoundTopLevelExtensionProperty() {
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/boundTopLevelExtensionProperty.kt");
}
@Test
@TestMetadata("constructor.kt")
public void testConstructor() {
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/constructor.kt");
}
@Test
@TestMetadata("genericParameterType.kt")
public void testGenericParameterType() {
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterType.kt");
}
@Test
@TestMetadata("genericParameterTypeGenericConsumer.kt")
public void testGenericParameterTypeGenericConsumer() {
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericParameterTypeGenericConsumer.kt");
}
@Test
@TestMetadata("genericReturnType.kt")
public void testGenericReturnType() {
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnType.kt");
}
@Test
@TestMetadata("genericReturnTypeGenericConsumer.kt")
public void testGenericReturnTypeGenericConsumer() {
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/genericReturnTypeGenericConsumer.kt");
}
@Test
@TestMetadata("memberExtensionProperty.kt")
public void testMemberExtensionProperty() {
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberExtensionProperty.kt");
}
@Test
@TestMetadata("memberFunction.kt")
public void testMemberFunction() {
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberFunction.kt");
}
@Test
@TestMetadata("memberProperty.kt")
public void testMemberProperty() {
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/memberProperty.kt");
}
@Test
@TestMetadata("simple.kt")
public void testSimple() {
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/simple.kt");
}
@Test
@TestMetadata("topLevelExtensionFunction.kt")
public void testTopLevelExtensionFunction() {
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionFunction.kt");
}
@Test
@TestMetadata("topLevelExtensionProperty.kt")
public void testTopLevelExtensionProperty() {
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelExtensionProperty.kt");
}
@Test
@TestMetadata("topLevelFunction.kt")
public void testTopLevelFunction() {
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelFunction.kt");
}
@Test
@TestMetadata("topLevelProperty.kt")
public void testTopLevelProperty() {
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReferences/topLevelProperty.kt");
}
}
@Nested
@TestMetadata("analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode")
@TestDataPath("$PROJECT_ROOT")