[FIR IDE] Add a special type of KtCall for generic type qualifiers
^KTIJ-21672 Fixed
This commit is contained in:
+22
-1
@@ -30,6 +30,8 @@ import org.jetbrains.kotlin.diagnostics.Errors
|
||||
import org.jetbrains.kotlin.diagnostics.Severity
|
||||
import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getPossiblyQualifiedCallExpression
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getQualifiedExpressionForSelector
|
||||
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.DelegatingBindingTrace
|
||||
@@ -156,7 +158,9 @@ internal class KtFe10CallResolver(
|
||||
handleAsCheckNotNullCall(unwrappedPsi)?.let { return@with it }
|
||||
handleAsFunctionCall(this, unwrappedPsi)
|
||||
}
|
||||
else -> handleAsFunctionCall(this, unwrappedPsi) ?: handleAsPropertyRead(this, unwrappedPsi)
|
||||
else -> handleAsFunctionCall(this, unwrappedPsi)
|
||||
?: handleAsPropertyRead(this, unwrappedPsi)
|
||||
?: handleAsGenericTypeQualifier(unwrappedPsi)
|
||||
} ?: handleResolveErrors(this, psi)
|
||||
}
|
||||
|
||||
@@ -385,6 +389,23 @@ internal class KtFe10CallResolver(
|
||||
return call.toPropertyRead(context)?.let { createCallInfo(context, element, it, listOf(call)) }
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles call expressions like `Foo<Bar>` or `test.Foo<Bar>` in calls like `Foo<Bar>::foo` and `test.Foo<Bar>::foo`.
|
||||
*
|
||||
* ATM does not perform any resolve checks, since it does not seem possible with [BindingContext], so it might give some
|
||||
* false positives.
|
||||
*/
|
||||
private fun handleAsGenericTypeQualifier(element: KtElement): KtCallInfo? {
|
||||
if (element !is KtExpression) return null
|
||||
|
||||
val wholeQualifier = element.getQualifiedExpressionForSelector() as? KtDotQualifiedExpression ?: element
|
||||
|
||||
val call = wholeQualifier.getPossiblyQualifiedCallExpression() ?: return null
|
||||
if (call.typeArgumentList == null || call.valueArgumentList != null) return null
|
||||
|
||||
return KtSuccessCallInfo(KtGenericTypeQualifier(token, wholeQualifier))
|
||||
}
|
||||
|
||||
private fun ResolvedCall<*>.toPropertyRead(context: BindingContext): KtVariableAccessCall? {
|
||||
val partiallyAppliedSymbol = toPartiallyAppliedVariableSymbol(context) ?: return null
|
||||
return KtSimpleVariableAccessCall(partiallyAppliedSymbol, KtSimpleVariableAccess.Read)
|
||||
|
||||
+12
@@ -214,6 +214,18 @@ public class Fe10IdeNormalAnalysisSourceModuleResolveCallTestGenerated extends A
|
||||
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/builderInference.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("callableReference_genericQualifier1.kt")
|
||||
public void testCallableReference_genericQualifier1() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReference_genericQualifier1.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("callableReference_genericQualifier2.kt")
|
||||
public void testCallableReference_genericQualifier2() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/callableReference_genericQualifier2.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("calleeExpressionOfImplicitInvoke.kt")
|
||||
public void testCalleeExpressionOfImplicitInvoke() throws Exception {
|
||||
|
||||
Reference in New Issue
Block a user