[Analysis API FIR] fix call resolution of non-resolvable elements

This commit is contained in:
Ilya Kirillov
2022-10-01 10:36:02 +02:00
parent ccdb6fc599
commit ab3f916f3f
13 changed files with 124 additions and 24 deletions
@@ -86,18 +86,20 @@ internal class KtFirCallResolver(
result
}
override fun resolveCall(psi: KtElement): KtCallInfo? = wrapError(psi) {
val ktCallInfos = getCallInfo(psi) { psiToResolve, resolveCalleeExpressionOfFunctionCall, resolveFragmentOfCall ->
listOfNotNull(
toKtCallInfo(
psiToResolve,
resolveCalleeExpressionOfFunctionCall,
resolveFragmentOfCall
override fun resolveCall(psi: KtElement): KtCallInfo? {
return wrapError(psi) {
val ktCallInfos = getCallInfo(psi) { psiToResolve, resolveCalleeExpressionOfFunctionCall, resolveFragmentOfCall ->
listOfNotNull(
toKtCallInfo(
psiToResolve,
resolveCalleeExpressionOfFunctionCall,
resolveFragmentOfCall
)
)
)
}
check(ktCallInfos.size <= 1) { "Should only return 1 KtCallInfo" }
ktCallInfos.singleOrNull()
}
check(ktCallInfos.size <= 1) { "Should only return 1 KtCallInfo" }
ktCallInfos.singleOrNull()
}
private inline fun <T> getCallInfo(
@@ -108,7 +110,7 @@ internal class KtFirCallResolver(
resolveFragmentOfCall: Boolean
) -> List<T>
): List<T> {
if (psi.isNotResolvable()) return emptyList()
if (!canBeResolvedAsCall(psi)) return emptyList()
val containingCallExpressionForCalleeExpression = psi.getContainingCallExpressionForCalleeExpression()
val containingBinaryExpressionForLhs = psi.getContainingBinaryExpressionForIncompleteLhs()
@@ -854,6 +854,34 @@ public class FirIdeNormalAnalysisSourceModuleResolveCallTestGenerated extends Ab
}
}
@Nested
@TestMetadata("analysis/analysis-api/testData/components/callResolver/resolveCall/nonCalls")
@TestDataPath("$PROJECT_ROOT")
public class NonCalls {
@Test
public void testAllFilesPresentInNonCalls() throws Exception {
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/callResolver/resolveCall/nonCalls"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
@Test
@TestMetadata("ifExpression.kt")
public void testIfExpression() throws Exception {
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/nonCalls/ifExpression.kt");
}
@Test
@TestMetadata("literalExpression.kt")
public void testLiteralExpression() throws Exception {
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/nonCalls/literalExpression.kt");
}
@Test
@TestMetadata("whenExpression.kt")
public void testWhenExpression() throws Exception {
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/nonCalls/whenExpression.kt");
}
}
@Nested
@TestMetadata("analysis/analysis-api/testData/components/callResolver/resolveCall/withTestCompilerPluginEnabled")
@TestDataPath("$PROJECT_ROOT")