From 58c6c25fe94529d13df376ed931730edac622dd3 Mon Sep 17 00:00:00 2001 From: Mark Punzalan Date: Mon, 31 Jan 2022 17:58:37 +0000 Subject: [PATCH] Analysis API: Handle other FirElements in KtCallResolver.resolveCandidates() and copy over remaining tests. --- .../api/fir/components/KtFirCallResolver.kt | 112 +++++- .../FirResolveCandidatesTestGenerated.java | 322 +++++++++++++++++- .../noCandidates/hiddenDeprecated.kt | 6 + .../hiddenDeprecated.txt} | 0 .../unresolvableOperator_elvis_1.kt | 5 + .../unresolvableOperator_elvis_1.txt | 1 + .../unresolvableOperator_elvis_2.kt | 5 + .../unresolvableOperator_elvis_2.txt | 1 + .../unresolvableOperator_eqeqeq_1.kt | 5 + .../unresolvableOperator_eqeqeq_1.txt | 1 + .../unresolvableOperator_eqeqeq_2.kt | 5 + .../unresolvableOperator_eqeqeq_2.txt | 1 + .../unresolvableOperator_excleqeq_1.kt | 5 + .../unresolvableOperator_excleqeq_1.txt | 1 + .../unresolvableOperator_excleqeq_2.kt | 5 + .../unresolvableOperator_excleqeq_2.txt | 1 + .../unresolvedReference.kt} | 0 .../noCandidates/unresolvedReference.txt | 1 + .../singleCandidate/arrayOfInAnnotation.kt | 4 + .../singleCandidate/arrayOfInAnnotation.txt | 34 ++ .../singleCandidate/builderInference.kt | 14 + .../singleCandidate/builderInference.txt | 27 ++ .../singleCandidate/checkNotNullCall.kt | 3 + .../singleCandidate/checkNotNullCall.txt | 3 + .../checkNotNullCallAsCallee.kt | 3 + .../checkNotNullCallAsCallee.txt | 3 + .../singleCandidate/comparisonCall.kt | 3 + .../singleCandidate/comparisonCall.txt | 26 ++ .../consecutiveImplicitInvoke1.txt | 2 +- .../consecutiveImplicitInvoke2.txt | 2 +- .../consecutiveImplicitInvoke3.txt | 2 +- .../singleCandidate/eqEqCall_fromAny.kt | 5 + .../singleCandidate/eqEqCall_fromAny.txt | 26 ++ .../singleCandidate/eqEqCall_fromSuperType.kt | 11 + .../eqEqCall_fromSuperType.txt | 26 ++ .../singleCandidate/eqEqCall_overridden.kt | 9 + .../singleCandidate/eqEqCall_overridden.txt | 26 ++ ...onCall.kt => functionCallInTheSameFile.kt} | 0 ...Call.txt => functionCallInTheSameFile.txt} | 0 ...allWithExtensionReceiverAndTypeArgument.kt | 5 + ...llWithExtensionReceiverAndTypeArgument.txt | 26 ++ .../functionCallWithLambdaArgument.kt | 5 + .../functionCallWithLambdaArgument.txt | 34 ++ ...gs.kt => functionCallWithNamedArgument.kt} | 2 +- .../functionCallWithNamedArgument.txt | 34 ++ ...nctionCallWithNonTrailingLambdaArgument.kt | 5 + ...ctionCallWithNonTrailingLambdaArgument.txt | 34 ++ .../functionCallWithSpreadArgument.kt | 6 + .../functionCallWithSpreadArgument.txt | 24 ++ .../functionCallWithTypeArgument.kt | 5 + .../functionCallWithTypeArgument.txt | 34 ++ .../functionCallWithVarargArgument.kt | 5 + .../functionCallWithVarargArgument.txt | 34 ++ ...nctionTypeVariableCall_dispatchReceiver.kt | 6 + ...ctionTypeVariableCall_dispatchReceiver.txt | 22 ++ ...ctionTypeVariableCall_extensionReceiver.kt | 7 + ...tionTypeVariableCall_extensionReceiver.txt | 22 ++ .../functionWithReceiverCall.kt | 5 + .../functionWithReceiverCall.txt | 26 ++ .../functionWithReceiverSafeCall.kt | 5 + .../functionWithReceiverSafeCall.txt | 26 ++ .../singleCandidate/hiddenConstructor.kt | 5 + .../singleCandidate/hiddenConstructor.txt | 15 + .../implicitConstructorDelegationCall.kt | 7 + .../implicitConstructorDelegationCall.txt | 24 ++ .../singleCandidate/implicitConstuctorCall.kt | 5 + .../implicitConstuctorCall.txt | 12 + .../implicitJavaConstuctorCall.kt | 7 + .../implicitJavaConstuctorCall.txt | 12 + .../indexedGetWithTooManyArgs.kt | 7 + ...Args.txt => indexedGetWithTooManyArgs.txt} | 17 +- .../indexedSetWithTooManyArgs.kt | 7 + .../indexedSetWithTooManyArgs.txt | 49 +++ .../singleCandidate/intArrayOfInAnnotation.kt | 4 + .../intArrayOfInAnnotation.txt | 34 ++ .../singleCandidate/javaFunctionCall.kt | 10 + .../singleCandidate/javaFunctionCall.txt | 14 + .../memberFunctionCallWithTypeArgument.kt | 7 + .../memberFunctionCallWithTypeArgument.txt | 26 ++ .../singleCandidate/privateMember.kt | 7 + .../singleCandidate/privateMember.txt | 17 + .../resolveCallInSuperConstructorParam.kt | 5 + .../resolveCallInSuperConstructorParam.txt | 26 ++ .../simpleCallWithNonMatchingArgs.kt | 5 + .../simpleCallWithNonMatchingArgs.txt | 15 + .../smartCastExplicitExtensionReceiver.kt | 7 + .../smartCastExplicitExtensionReceiver.txt | 16 + .../variableAsFunctionWithParameterName.kt | 3 + .../variableAsFunctionWithParameterName.txt | 36 ++ ...leAsFunctionWithParameterNameAnnotation.kt | 3 + ...eAsFunctionWithParameterNameAnnotation.txt | 36 ++ ...tionWithParameterNameAnnotationConflict.kt | 4 + ...ionWithParameterNameAnnotationConflict.txt | 36 ++ ...iableAsFunctionWithParameterNameGeneric.kt | 6 + ...ableAsFunctionWithParameterNameGeneric.txt | 26 ++ ...ctionWithParameterNameInNonFunctionType.kt | 4 + ...tionWithParameterNameInNonFunctionType.txt | 34 ++ ...ariableAsFunctionWithParameterNameMixed.kt | 3 + ...riableAsFunctionWithParameterNameMixed.txt | 36 ++ .../variableWithExtensionInvoke.kt | 7 + .../variableWithExtensionInvoke.txt | 26 ++ ...WithInvokeFunctionCall_dispatchReceiver.kt | 7 + ...ithInvokeFunctionCall_dispatchReceiver.txt | 14 + ...ithInvokeFunctionCall_extensionReceiver.kt | 8 + ...thInvokeFunctionCall_extensionReceiver.txt | 14 + .../variableWithMemberInvoke.kt | 7 + .../variableWithMemberInvoke.txt | 26 ++ 107 files changed, 1736 insertions(+), 38 deletions(-) create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/hiddenDeprecated.kt rename analysis/analysis-api/testData/components/callResolver/resolveCandidates/{noCandidates.txt => noCandidates/hiddenDeprecated.txt} (100%) create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_elvis_1.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_elvis_1.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_elvis_2.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_elvis_2.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_eqeqeq_1.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_eqeqeq_1.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_eqeqeq_2.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_eqeqeq_2.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_excleqeq_1.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_excleqeq_1.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_excleqeq_2.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_excleqeq_2.txt rename analysis/analysis-api/testData/components/callResolver/resolveCandidates/{noCandidates.kt => noCandidates/unresolvedReference.kt} (100%) create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvedReference.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/arrayOfInAnnotation.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/arrayOfInAnnotation.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/checkNotNullCall.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/checkNotNullCall.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/checkNotNullCallAsCallee.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/checkNotNullCallAsCallee.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/comparisonCall.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/comparisonCall.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_fromAny.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_fromAny.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_fromSuperType.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_fromSuperType.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_overridden.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_overridden.txt rename analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/{functionCall.kt => functionCallInTheSameFile.kt} (100%) rename analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/{functionCall.txt => functionCallInTheSameFile.txt} (100%) create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithExtensionReceiverAndTypeArgument.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithExtensionReceiverAndTypeArgument.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithLambdaArgument.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithLambdaArgument.txt rename analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/{functionCallWithNotEnoughArgs.kt => functionCallWithNamedArgument.kt} (53%) create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNamedArgument.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNonTrailingLambdaArgument.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNonTrailingLambdaArgument.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithSpreadArgument.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithSpreadArgument.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithTypeArgument.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithTypeArgument.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithVarargArgument.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithVarargArgument.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionTypeVariableCall_dispatchReceiver.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionTypeVariableCall_dispatchReceiver.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionTypeVariableCall_extensionReceiver.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionTypeVariableCall_extensionReceiver.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionWithReceiverCall.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionWithReceiverCall.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionWithReceiverSafeCall.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionWithReceiverSafeCall.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/hiddenConstructor.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/hiddenConstructor.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitConstructorDelegationCall.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitConstructorDelegationCall.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitConstuctorCall.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitConstuctorCall.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitJavaConstuctorCall.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitJavaConstuctorCall.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/indexedGetWithTooManyArgs.kt rename analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/{functionCallWithNotEnoughArgs.txt => indexedGetWithTooManyArgs.txt} (57%) create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/indexedSetWithTooManyArgs.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/indexedSetWithTooManyArgs.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/intArrayOfInAnnotation.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/intArrayOfInAnnotation.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/javaFunctionCall.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/javaFunctionCall.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/memberFunctionCallWithTypeArgument.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/memberFunctionCallWithTypeArgument.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/privateMember.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/privateMember.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/resolveCallInSuperConstructorParam.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/resolveCallInSuperConstructorParam.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/simpleCallWithNonMatchingArgs.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/simpleCallWithNonMatchingArgs.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/smartCastExplicitExtensionReceiver.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/smartCastExplicitExtensionReceiver.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterName.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterName.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameAnnotation.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameAnnotation.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameAnnotationConflict.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameAnnotationConflict.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameGeneric.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameGeneric.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameInNonFunctionType.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameInNonFunctionType.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameMixed.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameMixed.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithExtensionInvoke.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithExtensionInvoke.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithInvokeFunctionCall_dispatchReceiver.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithInvokeFunctionCall_dispatchReceiver.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithInvokeFunctionCall_extensionReceiver.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithInvokeFunctionCall_extensionReceiver.txt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithMemberInvoke.kt create mode 100644 analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithMemberInvoke.txt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt index 212795c5dc1..c21f6a15e1e 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt @@ -84,7 +84,28 @@ internal class KtFirCallResolver( } override fun resolveCall(psi: KtElement): KtCallInfo? = withValidityAssertion { - if (psi.isNotResolvable()) return null + val ktCallInfos = getKtCallInfos(psi) { psiToResolve, resolveCalleeExpressionOfFunctionCall, resolveFragmentOfCall -> + listOfNotNull( + toKtCallInfo( + psiToResolve, + resolveCalleeExpressionOfFunctionCall, + resolveFragmentOfCall + ) + ) + } + check(ktCallInfos.size <= 1) { "Should only return 1 KtCallInfo" } + return ktCallInfos.singleOrNull() + } + + private inline fun getKtCallInfos( + psi: KtElement, + getKtCallInfos: FirElement.( + psiToResolve: KtElement, + resolveCalleeExpressionOfFunctionCall: Boolean, + resolveFragmentOfCall: Boolean + ) -> List + ): List { + if (psi.isNotResolvable()) return emptyList() val containingCallExpressionForCalleeExpression = psi.getContainingCallExpressionForCalleeExpression() val containingBinaryExpressionForLhs = psi.getContainingBinaryExpressionForIncompleteLhs() @@ -94,11 +115,11 @@ internal class KtFirCallResolver( ?: containingBinaryExpressionForLhs ?: containingUnaryExpressionForIncOrDec ?: psi - val fir = psiToResolve.getOrBuildFir(analysisSession.firResolveState) ?: return null - fir.toKtCallInfo( + val fir = psiToResolve.getOrBuildFir(analysisSession.firResolveState) ?: return emptyList() + return fir.getKtCallInfos( psiToResolve, - resolveCalleeExpressionOfFunctionCall = psiToResolve == containingCallExpressionForCalleeExpression, - resolveFragmentOfCall = psiToResolve == containingBinaryExpressionForLhs || psiToResolve == containingUnaryExpressionForIncOrDec + psiToResolve == containingCallExpressionForCalleeExpression, + psiToResolve == containingBinaryExpressionForLhs || psiToResolve == containingUnaryExpressionForIncOrDec ) } @@ -678,14 +699,62 @@ internal class KtFirCallResolver( firSymbolBuilder.variableLikeBuilder.buildValueParameterSymbol(this) override fun resolveCandidates(psi: KtElement): List = withValidityAssertion { - val firCall = when (val fir = psi.getOrBuildFir(firResolveState)) { - is FirFunctionCall -> fir - is FirSafeCallExpression -> fir.selector.safeAs() - // TODO: FirDelegatedConstructorColl, FirAnnotationCall, FirArrayOfCall, FirConstructor - else -> null - } ?: return@withValidityAssertion emptyList() - val firFile = psi.containingKtFile.getOrBuildFirFile(firResolveState) - AllCandidatesResolver(analysisSession.rootModuleSession, firFile).getAllCandidates(firCall, psi) + getKtCallInfos(psi) { psiToResolve, resolveCalleeExpressionOfFunctionCall, resolveFragmentOfCall -> + resolveCandidates( + psiToResolve, + resolveCalleeExpressionOfFunctionCall, + resolveFragmentOfCall + ) + } + } + + // TODO: Refactor common code with FirElement.toKtCallInfo() when other FirResolvables are handled + private fun FirElement.resolveCandidates( + psi: KtElement, + resolveCalleeExpressionOfFunctionCall: Boolean, + resolveFragmentOfCall: Boolean, + ): List { + if (this is FirCheckNotNullCall) + return listOf(KtSuccessCallInfo(KtCheckNotNullCall(token, argumentList.arguments.first().psi as KtExpression))) + if (resolveCalleeExpressionOfFunctionCall && this is FirImplicitInvokeCall) { + // For implicit invoke, we resolve the calleeExpression of the CallExpression to the call that creates the receiver of this + // implicit invoke call. For example, + // ``` + // fun test(f: () -> Unit) { + // f() // calleeExpression `f` resolves to the local variable access, while `f()` resolves to the implicit `invoke` call. + // // This way `f` is also the explicit receiver of this implicit `invoke` call + // } + // ``` + return explicitReceiver?.resolveCandidates( + psi, + resolveCalleeExpressionOfFunctionCall = false, + resolveFragmentOfCall = resolveFragmentOfCall + ) ?: emptyList() + } + return when (this) { + is FirFunctionCall -> { + val firFile = psi.containingKtFile.getOrBuildFirFile(firResolveState) + AllCandidatesResolver(analysisSession.rootModuleSession, firFile).getAllCandidates(this, psi, resolveFragmentOfCall) + } + is FirSafeCallExpression -> selector.resolveCandidates( + psi, + resolveCalleeExpressionOfFunctionCall, + resolveFragmentOfCall + ) + is FirArrayOfCall, is FirComparisonExpression, is FirEqualityOperatorCall -> { + listOfNotNull( + toKtCallInfo( + psi, + resolveCalleeExpressionOfFunctionCall, + resolveFragmentOfCall + ) + ) + } + else -> { + // TODO: FirDelegatedConstructorCall, FirAnnotationCall, FirPropertyAccessExpression, FirVariableAssignment + listOf() + } + } } private inner class AllCandidatesResolver(private val firSession: FirSession, private val firFile: FirFile) { @@ -709,7 +778,7 @@ internal class KtFirCallResolver( private val resolutionContext = ResolutionContext(firSession, bodyResolveComponents, stubBodyResolveTransformer.context) - fun getAllCandidates(functionCall: FirFunctionCall, element: KtElement): List { + fun getAllCandidates(functionCall: FirFunctionCall, element: KtElement, resolveFragmentOfCall: Boolean): List { initializeBodyResolveContext(element) // If a function call is resolved to an implicit invoke call, the FirImplicitInvokeCall will have the `invoke()` function as the @@ -740,7 +809,15 @@ internal class KtFirCallResolver( resolutionContext ) } - return candidates.mapNotNull { convertToKtCallInfo(originalFunctionCall, element, it.candidate, it.isInBestCandidates) } + return candidates.mapNotNull { + convertToKtCallInfo( + originalFunctionCall, + element, + it.candidate, + it.isInBestCandidates, + resolveFragmentOfCall + ) + } } @OptIn(PrivateForInline::class, SymbolInternals::class) @@ -757,9 +834,10 @@ internal class KtFirCallResolver( functionCall: FirFunctionCall, element: KtElement, candidate: Candidate, - isInBestCandidates: Boolean + isInBestCandidates: Boolean, + resolveFragmentOfCall: Boolean ): KtCallInfo? { - val call = createKtCall(element, functionCall, candidate, resolveFragmentOfCall = false) // TODO: resolveFragmentOfCall + val call = createKtCall(element, functionCall, candidate, resolveFragmentOfCall) ?: error("expect `createKtCall` to succeed for candidate") return if (candidate.isSuccessful && isInBestCandidates) { KtSuccessCallInfo(call) diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirResolveCandidatesTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirResolveCandidatesTestGenerated.java index a276897f003..b0507319932 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirResolveCandidatesTestGenerated.java +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/FirResolveCandidatesTestGenerated.java @@ -34,12 +34,6 @@ public class FirResolveCandidatesTestGenerated extends AbstractResolveCandidates KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/callResolver/resolveCandidates"), Pattern.compile("^(.+)\\.kt$"), null, true); } - @Test - @TestMetadata("noCandidates.kt") - public void testNoCandidates() throws Exception { - runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates.kt"); - } - @Nested @TestMetadata("analysis/analysis-api/testData/components/callResolver/resolveCandidates/multipleCandidates") @TestDataPath("$PROJECT_ROOT") @@ -86,6 +80,64 @@ public class FirResolveCandidatesTestGenerated extends AbstractResolveCandidates } } + @Nested + @TestMetadata("analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates") + @TestDataPath("$PROJECT_ROOT") + public class NoCandidates { + @Test + public void testAllFilesPresentInNoCandidates() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("hiddenDeprecated.kt") + public void testHiddenDeprecated() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/hiddenDeprecated.kt"); + } + + @Test + @TestMetadata("unresolvableOperator_elvis_1.kt") + public void testUnresolvableOperator_elvis_1() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_elvis_1.kt"); + } + + @Test + @TestMetadata("unresolvableOperator_elvis_2.kt") + public void testUnresolvableOperator_elvis_2() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_elvis_2.kt"); + } + + @Test + @TestMetadata("unresolvableOperator_eqeqeq_1.kt") + public void testUnresolvableOperator_eqeqeq_1() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_eqeqeq_1.kt"); + } + + @Test + @TestMetadata("unresolvableOperator_eqeqeq_2.kt") + public void testUnresolvableOperator_eqeqeq_2() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_eqeqeq_2.kt"); + } + + @Test + @TestMetadata("unresolvableOperator_excleqeq_1.kt") + public void testUnresolvableOperator_excleqeq_1() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_excleqeq_1.kt"); + } + + @Test + @TestMetadata("unresolvableOperator_excleqeq_2.kt") + public void testUnresolvableOperator_excleqeq_2() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_excleqeq_2.kt"); + } + + @Test + @TestMetadata("unresolvedReference.kt") + public void testUnresolvedReference() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvedReference.kt"); + } + } + @Nested @TestMetadata("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate") @TestDataPath("$PROJECT_ROOT") @@ -95,6 +147,36 @@ public class FirResolveCandidatesTestGenerated extends AbstractResolveCandidates KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate"), Pattern.compile("^(.+)\\.kt$"), null, true); } + @Test + @TestMetadata("arrayOfInAnnotation.kt") + public void testArrayOfInAnnotation() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/arrayOfInAnnotation.kt"); + } + + @Test + @TestMetadata("builderInference.kt") + public void testBuilderInference() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.kt"); + } + + @Test + @TestMetadata("checkNotNullCall.kt") + public void testCheckNotNullCall() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/checkNotNullCall.kt"); + } + + @Test + @TestMetadata("checkNotNullCallAsCallee.kt") + public void testCheckNotNullCallAsCallee() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/checkNotNullCallAsCallee.kt"); + } + + @Test + @TestMetadata("comparisonCall.kt") + public void testComparisonCall() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/comparisonCall.kt"); + } + @Test @TestMetadata("consecutiveImplicitInvoke1.kt") public void testConsecutiveImplicitInvoke1() throws Exception { @@ -114,15 +196,117 @@ public class FirResolveCandidatesTestGenerated extends AbstractResolveCandidates } @Test - @TestMetadata("functionCall.kt") - public void testFunctionCall() throws Exception { - runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCall.kt"); + @TestMetadata("eqEqCall_fromAny.kt") + public void testEqEqCall_fromAny() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_fromAny.kt"); } @Test - @TestMetadata("functionCallWithNotEnoughArgs.kt") - public void testFunctionCallWithNotEnoughArgs() throws Exception { - runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNotEnoughArgs.kt"); + @TestMetadata("eqEqCall_fromSuperType.kt") + public void testEqEqCall_fromSuperType() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_fromSuperType.kt"); + } + + @Test + @TestMetadata("eqEqCall_overridden.kt") + public void testEqEqCall_overridden() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_overridden.kt"); + } + + @Test + @TestMetadata("functionCallInTheSameFile.kt") + public void testFunctionCallInTheSameFile() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallInTheSameFile.kt"); + } + + @Test + @TestMetadata("functionCallWithExtensionReceiverAndTypeArgument.kt") + public void testFunctionCallWithExtensionReceiverAndTypeArgument() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithExtensionReceiverAndTypeArgument.kt"); + } + + @Test + @TestMetadata("functionCallWithLambdaArgument.kt") + public void testFunctionCallWithLambdaArgument() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithLambdaArgument.kt"); + } + + @Test + @TestMetadata("functionCallWithNamedArgument.kt") + public void testFunctionCallWithNamedArgument() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNamedArgument.kt"); + } + + @Test + @TestMetadata("functionCallWithNonTrailingLambdaArgument.kt") + public void testFunctionCallWithNonTrailingLambdaArgument() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNonTrailingLambdaArgument.kt"); + } + + @Test + @TestMetadata("functionCallWithSpreadArgument.kt") + public void testFunctionCallWithSpreadArgument() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithSpreadArgument.kt"); + } + + @Test + @TestMetadata("functionCallWithTypeArgument.kt") + public void testFunctionCallWithTypeArgument() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithTypeArgument.kt"); + } + + @Test + @TestMetadata("functionCallWithVarargArgument.kt") + public void testFunctionCallWithVarargArgument() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithVarargArgument.kt"); + } + + @Test + @TestMetadata("functionTypeVariableCall_dispatchReceiver.kt") + public void testFunctionTypeVariableCall_dispatchReceiver() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionTypeVariableCall_dispatchReceiver.kt"); + } + + @Test + @TestMetadata("functionTypeVariableCall_extensionReceiver.kt") + public void testFunctionTypeVariableCall_extensionReceiver() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionTypeVariableCall_extensionReceiver.kt"); + } + + @Test + @TestMetadata("functionWithReceiverCall.kt") + public void testFunctionWithReceiverCall() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionWithReceiverCall.kt"); + } + + @Test + @TestMetadata("functionWithReceiverSafeCall.kt") + public void testFunctionWithReceiverSafeCall() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionWithReceiverSafeCall.kt"); + } + + @Test + @TestMetadata("hiddenConstructor.kt") + public void testHiddenConstructor() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/hiddenConstructor.kt"); + } + + @Test + @TestMetadata("implicitConstructorDelegationCall.kt") + public void testImplicitConstructorDelegationCall() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitConstructorDelegationCall.kt"); + } + + @Test + @TestMetadata("implicitConstuctorCall.kt") + public void testImplicitConstuctorCall() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitConstuctorCall.kt"); + } + + @Test + @TestMetadata("implicitJavaConstuctorCall.kt") + public void testImplicitJavaConstuctorCall() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitJavaConstuctorCall.kt"); } @Test @@ -137,6 +321,12 @@ public class FirResolveCandidatesTestGenerated extends AbstractResolveCandidates runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/indexedGetWithNotEnoughArgs.kt"); } + @Test + @TestMetadata("indexedGetWithTooManyArgs.kt") + public void testIndexedGetWithTooManyArgs() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/indexedGetWithTooManyArgs.kt"); + } + @Test @TestMetadata("indexedSet.kt") public void testIndexedSet() throws Exception { @@ -149,12 +339,60 @@ public class FirResolveCandidatesTestGenerated extends AbstractResolveCandidates runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/indexedSetWithNotEnoughArgs.kt"); } + @Test + @TestMetadata("indexedSetWithTooManyArgs.kt") + public void testIndexedSetWithTooManyArgs() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/indexedSetWithTooManyArgs.kt"); + } + + @Test + @TestMetadata("intArrayOfInAnnotation.kt") + public void testIntArrayOfInAnnotation() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/intArrayOfInAnnotation.kt"); + } + + @Test + @TestMetadata("javaFunctionCall.kt") + public void testJavaFunctionCall() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/javaFunctionCall.kt"); + } + + @Test + @TestMetadata("memberFunctionCallWithTypeArgument.kt") + public void testMemberFunctionCallWithTypeArgument() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/memberFunctionCallWithTypeArgument.kt"); + } + + @Test + @TestMetadata("privateMember.kt") + public void testPrivateMember() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/privateMember.kt"); + } + + @Test + @TestMetadata("resolveCallInSuperConstructorParam.kt") + public void testResolveCallInSuperConstructorParam() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/resolveCallInSuperConstructorParam.kt"); + } + @Test @TestMetadata("samConstructorCall.kt") public void testSamConstructorCall() throws Exception { runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/samConstructorCall.kt"); } + @Test + @TestMetadata("simpleCallWithNonMatchingArgs.kt") + public void testSimpleCallWithNonMatchingArgs() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/simpleCallWithNonMatchingArgs.kt"); + } + + @Test + @TestMetadata("smartCastExplicitExtensionReceiver.kt") + public void testSmartCastExplicitExtensionReceiver() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/smartCastExplicitExtensionReceiver.kt"); + } + @Test @TestMetadata("variableAsFunction.kt") public void testVariableAsFunction() throws Exception { @@ -166,5 +404,65 @@ public class FirResolveCandidatesTestGenerated extends AbstractResolveCandidates public void testVariableAsFunctionLikeCall() throws Exception { runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionLikeCall.kt"); } + + @Test + @TestMetadata("variableAsFunctionWithParameterName.kt") + public void testVariableAsFunctionWithParameterName() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterName.kt"); + } + + @Test + @TestMetadata("variableAsFunctionWithParameterNameAnnotation.kt") + public void testVariableAsFunctionWithParameterNameAnnotation() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameAnnotation.kt"); + } + + @Test + @TestMetadata("variableAsFunctionWithParameterNameAnnotationConflict.kt") + public void testVariableAsFunctionWithParameterNameAnnotationConflict() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameAnnotationConflict.kt"); + } + + @Test + @TestMetadata("variableAsFunctionWithParameterNameGeneric.kt") + public void testVariableAsFunctionWithParameterNameGeneric() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameGeneric.kt"); + } + + @Test + @TestMetadata("variableAsFunctionWithParameterNameInNonFunctionType.kt") + public void testVariableAsFunctionWithParameterNameInNonFunctionType() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameInNonFunctionType.kt"); + } + + @Test + @TestMetadata("variableAsFunctionWithParameterNameMixed.kt") + public void testVariableAsFunctionWithParameterNameMixed() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameMixed.kt"); + } + + @Test + @TestMetadata("variableWithExtensionInvoke.kt") + public void testVariableWithExtensionInvoke() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithExtensionInvoke.kt"); + } + + @Test + @TestMetadata("variableWithInvokeFunctionCall_dispatchReceiver.kt") + public void testVariableWithInvokeFunctionCall_dispatchReceiver() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithInvokeFunctionCall_dispatchReceiver.kt"); + } + + @Test + @TestMetadata("variableWithInvokeFunctionCall_extensionReceiver.kt") + public void testVariableWithInvokeFunctionCall_extensionReceiver() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithInvokeFunctionCall_extensionReceiver.kt"); + } + + @Test + @TestMetadata("variableWithMemberInvoke.kt") + public void testVariableWithMemberInvoke() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithMemberInvoke.kt"); + } } } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/hiddenDeprecated.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/hiddenDeprecated.kt new file mode 100644 index 00000000000..f64f0ad6a5b --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/hiddenDeprecated.kt @@ -0,0 +1,6 @@ +@Deprecated("", level=DeprecationLevel.HIDDEN) +fun a() {} + +fun test() { + a() +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/hiddenDeprecated.txt similarity index 100% rename from analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates.txt rename to analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/hiddenDeprecated.txt diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_elvis_1.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_elvis_1.kt new file mode 100644 index 00000000000..6d639fdac7f --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_elvis_1.kt @@ -0,0 +1,5 @@ +class A + +fun test(a: A, b: A) { + a ?: b +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_elvis_1.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_elvis_1.txt new file mode 100644 index 00000000000..1d7254b6ac6 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_elvis_1.txt @@ -0,0 +1 @@ +NO_CANDIDATES \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_elvis_2.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_elvis_2.kt new file mode 100644 index 00000000000..88fb2cc7f6b --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_elvis_2.kt @@ -0,0 +1,5 @@ +class A + +fun test(a: A, b: A) { + a ?: b +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_elvis_2.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_elvis_2.txt new file mode 100644 index 00000000000..1d7254b6ac6 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_elvis_2.txt @@ -0,0 +1 @@ +NO_CANDIDATES \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_eqeqeq_1.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_eqeqeq_1.kt new file mode 100644 index 00000000000..28678a2ca4e --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_eqeqeq_1.kt @@ -0,0 +1,5 @@ +class A + +fun test(a: A, b: A) { + a === b +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_eqeqeq_1.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_eqeqeq_1.txt new file mode 100644 index 00000000000..1d7254b6ac6 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_eqeqeq_1.txt @@ -0,0 +1 @@ +NO_CANDIDATES \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_eqeqeq_2.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_eqeqeq_2.kt new file mode 100644 index 00000000000..b414f0339ec --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_eqeqeq_2.kt @@ -0,0 +1,5 @@ +class A + +fun test(a: A, b: A) { + a === b +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_eqeqeq_2.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_eqeqeq_2.txt new file mode 100644 index 00000000000..1d7254b6ac6 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_eqeqeq_2.txt @@ -0,0 +1 @@ +NO_CANDIDATES \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_excleqeq_1.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_excleqeq_1.kt new file mode 100644 index 00000000000..81c2f24a336 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_excleqeq_1.kt @@ -0,0 +1,5 @@ +class A + +fun test(a: A, b: A) { + a !== b +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_excleqeq_1.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_excleqeq_1.txt new file mode 100644 index 00000000000..1d7254b6ac6 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_excleqeq_1.txt @@ -0,0 +1 @@ +NO_CANDIDATES \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_excleqeq_2.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_excleqeq_2.kt new file mode 100644 index 00000000000..f0b0ea02066 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_excleqeq_2.kt @@ -0,0 +1,5 @@ +class A + +fun test(a: A, b: A) { + a !== b +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_excleqeq_2.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_excleqeq_2.txt new file mode 100644 index 00000000000..1d7254b6ac6 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvableOperator_excleqeq_2.txt @@ -0,0 +1 @@ +NO_CANDIDATES \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvedReference.kt similarity index 100% rename from analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates.kt rename to analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvedReference.kt diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvedReference.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvedReference.txt new file mode 100644 index 00000000000..1d7254b6ac6 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/noCandidates/unresolvedReference.txt @@ -0,0 +1 @@ +NO_CANDIDATES \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/arrayOfInAnnotation.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/arrayOfInAnnotation.kt new file mode 100644 index 00000000000..e58cfe0561d --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/arrayOfInAnnotation.kt @@ -0,0 +1,4 @@ +annotation class RequiresPermission(val anyOf: IntArray) + +@RequiresPermission(anyOf = arrayOf(1, 2, 3)) +fun foo(): Int = 5 diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/arrayOfInAnnotation.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/arrayOfInAnnotation.txt new file mode 100644 index 00000000000..cea6aab2847 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/arrayOfInAnnotation.txt @@ -0,0 +1,34 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Array + symbol = kotlin/arrayOf(vararg elements: T): kotlin.Array + valueParameters = [ + KtVariableLikeSignature: + name = elements + receiverType = null + returnType = kotlin.Int + symbol = vararg elements: T + ] + argumentMapping = { + 1 -> (KtVariableLikeSignature: + name = elements + receiverType = null + returnType = kotlin.Int + symbol = vararg elements: T), + 2 -> (KtVariableLikeSignature: + name = elements + receiverType = null + returnType = kotlin.Int + symbol = vararg elements: T), + 3 -> (KtVariableLikeSignature: + name = elements + receiverType = null + returnType = kotlin.Int + symbol = vararg elements: T) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.kt new file mode 100644 index 00000000000..3eb65be9805 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.kt @@ -0,0 +1,14 @@ +// WITH_STDLIB +package test + +class Target { + fun add(t: T) {} +} + +fun buildTarget(@BuilderInference block: Target.() -> Unit): Target { + return Target().apply { block() } +} + +fun test(s: String) { + val result = buildTarget { add(s) } +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.txt new file mode 100644 index 00000000000..bd7e066c33d --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/builderInference.txt @@ -0,0 +1,27 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtImplicitReceiverValue: + symbol = KtReceiverParameterSymbol: + origin: SOURCE + type: test/Target + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = test/Target.add(: test.Target, t: T): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = t + receiverType = null + returnType = T + symbol = t: T + ] + argumentMapping = { + s -> (KtVariableLikeSignature: + name = t + receiverType = null + returnType = T + symbol = t: T) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/checkNotNullCall.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/checkNotNullCall.kt new file mode 100644 index 00000000000..2c64e1ea185 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/checkNotNullCall.kt @@ -0,0 +1,3 @@ +fun test(a: Any?) { + a!! +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/checkNotNullCall.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/checkNotNullCall.txt new file mode 100644 index 00000000000..080c9e375f4 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/checkNotNullCall.txt @@ -0,0 +1,3 @@ +KtSuccessCallInfo: + call = KtCheckNotNullCall: + baseExpression = a diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/checkNotNullCallAsCallee.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/checkNotNullCallAsCallee.kt new file mode 100644 index 00000000000..4d87677a2c3 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/checkNotNullCallAsCallee.kt @@ -0,0 +1,3 @@ +fun test(a: (() -> Unit)?) { + a!!() +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/checkNotNullCallAsCallee.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/checkNotNullCallAsCallee.txt new file mode 100644 index 00000000000..080c9e375f4 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/checkNotNullCallAsCallee.txt @@ -0,0 +1,3 @@ +KtSuccessCallInfo: + call = KtCheckNotNullCall: + baseExpression = a diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/comparisonCall.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/comparisonCall.kt new file mode 100644 index 00000000000..ac74eb4cf54 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/comparisonCall.kt @@ -0,0 +1,3 @@ +fun test(i: Int, j: Int) { + i < j +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/comparisonCall.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/comparisonCall.txt new file mode 100644 index 00000000000..3d8c6b7b381 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/comparisonCall.txt @@ -0,0 +1,26 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = i + isSafeNavigation = false + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Int + symbol = kotlin/Int.compareTo(: kotlin.Int, other: kotlin.Int): kotlin.Int + valueParameters = [ + KtVariableLikeSignature: + name = other + receiverType = null + returnType = kotlin.Int + symbol = other: kotlin.Int + ] + argumentMapping = { + j -> (KtVariableLikeSignature: + name = other + receiverType = null + returnType = kotlin.Int + symbol = other: kotlin.Int) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke1.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke1.txt index 720bc989686..0edd3b72b98 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke1.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke1.txt @@ -47,4 +47,4 @@ KtErrorCallInfo: valueParameters = [] argumentMapping = {} ] - diagnostic = ERROR \ No newline at end of file + diagnostic = ERROR diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke2.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke2.txt index 59b46c6a026..a1329cc68b1 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke2.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke2.txt @@ -47,4 +47,4 @@ KtErrorCallInfo: valueParameters = [] argumentMapping = {} ] - diagnostic = ERROR \ No newline at end of file + diagnostic = ERROR diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke3.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke3.txt index 22d60cc7122..e4a25295922 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke3.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/consecutiveImplicitInvoke3.txt @@ -47,4 +47,4 @@ KtSuccessCallInfo: returnType = kotlin.Unit symbol = /invoke(: kotlin.Double): kotlin.Unit valueParameters = [] - argumentMapping = {} \ No newline at end of file + argumentMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_fromAny.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_fromAny.kt new file mode 100644 index 00000000000..b1055774cc9 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_fromAny.kt @@ -0,0 +1,5 @@ +class B + +fun test(b1: B, b2: B) { + b1 == b2 +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_fromAny.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_fromAny.txt new file mode 100644 index 00000000000..df54910c4aa --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_fromAny.txt @@ -0,0 +1,26 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = b1 + isSafeNavigation = false + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Boolean + symbol = kotlin/Any.equals(: kotlin.Any, other: kotlin.Any?): kotlin.Boolean + valueParameters = [ + KtVariableLikeSignature: + name = other + receiverType = null + returnType = kotlin.Any? + symbol = other: kotlin.Any? + ] + argumentMapping = { + b2 -> (KtVariableLikeSignature: + name = other + receiverType = null + returnType = kotlin.Any? + symbol = other: kotlin.Any?) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_fromSuperType.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_fromSuperType.kt new file mode 100644 index 00000000000..4ec4fecb90e --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_fromSuperType.kt @@ -0,0 +1,11 @@ +open class A { + override fun equals(other: Any?): Boolean { + return true + } +} + +class B : A() + +fun test(b1: B, b2: B) { + b1 == b2 +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_fromSuperType.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_fromSuperType.txt new file mode 100644 index 00000000000..997c5e2da33 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_fromSuperType.txt @@ -0,0 +1,26 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = b1 + isSafeNavigation = false + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Boolean + symbol = /A.equals(: A, other: kotlin.Any?): kotlin.Boolean + valueParameters = [ + KtVariableLikeSignature: + name = other + receiverType = null + returnType = kotlin.Any? + symbol = other: kotlin.Any? + ] + argumentMapping = { + b2 -> (KtVariableLikeSignature: + name = other + receiverType = null + returnType = kotlin.Any? + symbol = other: kotlin.Any?) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_overridden.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_overridden.kt new file mode 100644 index 00000000000..8f7273ee7fd --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_overridden.kt @@ -0,0 +1,9 @@ +open class A { + override fun equals(other: Any?): Boolean { + return true + } +} + +fun test(a1: A, a2: A) { + a1 == a2 +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_overridden.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_overridden.txt new file mode 100644 index 00000000000..0ef806aba1d --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/eqEqCall_overridden.txt @@ -0,0 +1,26 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = a1 + isSafeNavigation = false + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Boolean + symbol = /A.equals(: A, other: kotlin.Any?): kotlin.Boolean + valueParameters = [ + KtVariableLikeSignature: + name = other + receiverType = null + returnType = kotlin.Any? + symbol = other: kotlin.Any? + ] + argumentMapping = { + a2 -> (KtVariableLikeSignature: + name = other + receiverType = null + returnType = kotlin.Any? + symbol = other: kotlin.Any?) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCall.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallInTheSameFile.kt similarity index 100% rename from analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCall.kt rename to analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallInTheSameFile.kt diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCall.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallInTheSameFile.txt similarity index 100% rename from analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCall.txt rename to analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallInTheSameFile.txt diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithExtensionReceiverAndTypeArgument.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithExtensionReceiverAndTypeArgument.kt new file mode 100644 index 00000000000..3dca2ee3309 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithExtensionReceiverAndTypeArgument.kt @@ -0,0 +1,5 @@ +fun A.function(a: B) {} + +fun call() { + "str".function(1) +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithExtensionReceiverAndTypeArgument.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithExtensionReceiverAndTypeArgument.txt new file mode 100644 index 00000000000..21828b82cb5 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithExtensionReceiverAndTypeArgument.txt @@ -0,0 +1,26 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = KtExplicitReceiverValue: + expression = "str" + isSafeNavigation = false + signature = KtFunctionLikeSignature: + receiverType = kotlin.String + returnType = kotlin.Unit + symbol = /function(: A, a: B): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = a: B + ] + argumentMapping = { + 1 -> (KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = a: B) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithLambdaArgument.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithLambdaArgument.kt new file mode 100644 index 00000000000..bb3395c037e --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithLambdaArgument.kt @@ -0,0 +1,5 @@ +fun function(a: Int, b: (String) -> Boolean) {} + +fun call() { + function(1) { s -> true } +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithLambdaArgument.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithLambdaArgument.txt new file mode 100644 index 00000000000..98a6e6107ee --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithLambdaArgument.txt @@ -0,0 +1,34 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = /function(a: kotlin.Int, b: kotlin.Function1): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = a: kotlin.Int, + KtVariableLikeSignature: + name = b + receiverType = null + returnType = kotlin.Function1 + symbol = b: kotlin.Function1 + ] + argumentMapping = { + 1 -> (KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = a: kotlin.Int), + { s -> true } -> (KtVariableLikeSignature: + name = b + receiverType = null + returnType = kotlin.Function1 + symbol = b: kotlin.Function1) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNotEnoughArgs.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNamedArgument.kt similarity index 53% rename from analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNotEnoughArgs.kt rename to analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNamedArgument.kt index 22b83541a78..fb674f1a759 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNotEnoughArgs.kt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNamedArgument.kt @@ -1,5 +1,5 @@ fun function(a: Int, b: String) {} fun call() { - function(1) + function(b = "foo", a = 1) } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNamedArgument.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNamedArgument.txt new file mode 100644 index 00000000000..0f8a4470c86 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNamedArgument.txt @@ -0,0 +1,34 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = /function(a: kotlin.Int, b: kotlin.String): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = a: kotlin.Int, + KtVariableLikeSignature: + name = b + receiverType = null + returnType = kotlin.String + symbol = b: kotlin.String + ] + argumentMapping = { + "foo" -> (KtVariableLikeSignature: + name = b + receiverType = null + returnType = kotlin.String + symbol = b: kotlin.String), + 1 -> (KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = a: kotlin.Int) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNonTrailingLambdaArgument.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNonTrailingLambdaArgument.kt new file mode 100644 index 00000000000..bb989a57ba0 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNonTrailingLambdaArgument.kt @@ -0,0 +1,5 @@ +fun function(a: Int, b: (String) -> Boolean) {} + +fun call() { + function(1, { s -> true }) +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNonTrailingLambdaArgument.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNonTrailingLambdaArgument.txt new file mode 100644 index 00000000000..98a6e6107ee --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNonTrailingLambdaArgument.txt @@ -0,0 +1,34 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = /function(a: kotlin.Int, b: kotlin.Function1): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = a: kotlin.Int, + KtVariableLikeSignature: + name = b + receiverType = null + returnType = kotlin.Function1 + symbol = b: kotlin.Function1 + ] + argumentMapping = { + 1 -> (KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = a: kotlin.Int), + { s -> true } -> (KtVariableLikeSignature: + name = b + receiverType = null + returnType = kotlin.Function1 + symbol = b: kotlin.Function1) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithSpreadArgument.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithSpreadArgument.kt new file mode 100644 index 00000000000..4f880cb7472 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithSpreadArgument.kt @@ -0,0 +1,6 @@ +fun function(vararg a: Int) {} + +fun call() { + val args = intArrayOf(1, 2, 3) + function(*args) +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithSpreadArgument.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithSpreadArgument.txt new file mode 100644 index 00000000000..1283e49e6e2 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithSpreadArgument.txt @@ -0,0 +1,24 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = /function(vararg a: kotlin.Int): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = vararg a: kotlin.Int + ] + argumentMapping = { + args -> (KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = vararg a: kotlin.Int) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithTypeArgument.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithTypeArgument.kt new file mode 100644 index 00000000000..a706d0e8c94 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithTypeArgument.kt @@ -0,0 +1,5 @@ +fun function(a: A, b: B) {} + +fun call() { + function(1, "") +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithTypeArgument.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithTypeArgument.txt new file mode 100644 index 00000000000..1715ccc8b49 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithTypeArgument.txt @@ -0,0 +1,34 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = /function(a: A, b: B): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = a: A, + KtVariableLikeSignature: + name = b + receiverType = null + returnType = kotlin.String + symbol = b: B + ] + argumentMapping = { + 1 -> (KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = a: A), + "" -> (KtVariableLikeSignature: + name = b + receiverType = null + returnType = kotlin.String + symbol = b: B) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithVarargArgument.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithVarargArgument.kt new file mode 100644 index 00000000000..d4c8e5967d4 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithVarargArgument.kt @@ -0,0 +1,5 @@ +fun function(vararg a: Int) {} + +fun call() { + function(1, 2, 3) +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithVarargArgument.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithVarargArgument.txt new file mode 100644 index 00000000000..0430e8008b9 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithVarargArgument.txt @@ -0,0 +1,34 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = /function(vararg a: kotlin.Int): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = vararg a: kotlin.Int + ] + argumentMapping = { + 1 -> (KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = vararg a: kotlin.Int), + 2 -> (KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = vararg a: kotlin.Int), + 3 -> (KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = vararg a: kotlin.Int) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionTypeVariableCall_dispatchReceiver.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionTypeVariableCall_dispatchReceiver.kt new file mode 100644 index 00000000000..de55bc4209f --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionTypeVariableCall_dispatchReceiver.kt @@ -0,0 +1,6 @@ +class A { + val f: String.() -> Unit = {} + fun test() { + "".f() + } +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionTypeVariableCall_dispatchReceiver.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionTypeVariableCall_dispatchReceiver.txt new file mode 100644 index 00000000000..ac44ea88137 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionTypeVariableCall_dispatchReceiver.txt @@ -0,0 +1,22 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = true + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = f + isSafeNavigation = false + extensionReceiver = KtExplicitReceiverValue: + expression = "" + isSafeNavigation = false + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = kotlin/Function1.invoke(: kotlin.Function1, p1: P1): R + valueParameters = [ + KtVariableLikeSignature: + name = p1 + receiverType = null + returnType = kotlin.String + symbol = p1: P1 + ] + argumentMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionTypeVariableCall_extensionReceiver.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionTypeVariableCall_extensionReceiver.kt new file mode 100644 index 00000000000..906ed15a5f8 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionTypeVariableCall_extensionReceiver.kt @@ -0,0 +1,7 @@ +class A { + fun test() { + "".f() + } +} + +val A.f: String.() -> Unit = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionTypeVariableCall_extensionReceiver.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionTypeVariableCall_extensionReceiver.txt new file mode 100644 index 00000000000..ac44ea88137 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionTypeVariableCall_extensionReceiver.txt @@ -0,0 +1,22 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = true + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = f + isSafeNavigation = false + extensionReceiver = KtExplicitReceiverValue: + expression = "" + isSafeNavigation = false + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = kotlin/Function1.invoke(: kotlin.Function1, p1: P1): R + valueParameters = [ + KtVariableLikeSignature: + name = p1 + receiverType = null + returnType = kotlin.String + symbol = p1: P1 + ] + argumentMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionWithReceiverCall.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionWithReceiverCall.kt new file mode 100644 index 00000000000..9bc88a9ab15 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionWithReceiverCall.kt @@ -0,0 +1,5 @@ +fun String.function(a: Int) {} + +fun call() { + "str".function(1) +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionWithReceiverCall.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionWithReceiverCall.txt new file mode 100644 index 00000000000..59acf142756 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionWithReceiverCall.txt @@ -0,0 +1,26 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = KtExplicitReceiverValue: + expression = "str" + isSafeNavigation = false + signature = KtFunctionLikeSignature: + receiverType = kotlin.String + returnType = kotlin.Unit + symbol = /function(: kotlin.String, a: kotlin.Int): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = a: kotlin.Int + ] + argumentMapping = { + 1 -> (KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = a: kotlin.Int) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionWithReceiverSafeCall.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionWithReceiverSafeCall.kt new file mode 100644 index 00000000000..99dbe346911 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionWithReceiverSafeCall.kt @@ -0,0 +1,5 @@ +fun String.function(a: Int) {} + +fun call() { + "str"?.function(1) +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionWithReceiverSafeCall.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionWithReceiverSafeCall.txt new file mode 100644 index 00000000000..edc940e1382 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionWithReceiverSafeCall.txt @@ -0,0 +1,26 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = KtExplicitReceiverValue: + expression = "str" + isSafeNavigation = true + signature = KtFunctionLikeSignature: + receiverType = kotlin.String + returnType = kotlin.Unit + symbol = /function(: kotlin.String, a: kotlin.Int): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = a: kotlin.Int + ] + argumentMapping = { + 1 -> (KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = a: kotlin.Int) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/hiddenConstructor.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/hiddenConstructor.kt new file mode 100644 index 00000000000..93e544346ad --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/hiddenConstructor.kt @@ -0,0 +1,5 @@ +fun test() { + Obj(555) +} + +object Obj diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/hiddenConstructor.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/hiddenConstructor.txt new file mode 100644 index 00000000000..cad6369ae00 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/hiddenConstructor.txt @@ -0,0 +1,15 @@ +KtErrorCallInfo: + candidateCalls = [ + KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = Obj + symbol = (): Obj + valueParameters = [] + argumentMapping = {} + ] + diagnostic = ERROR diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitConstructorDelegationCall.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitConstructorDelegationCall.kt new file mode 100644 index 00000000000..ab0f8bbe25a --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitConstructorDelegationCall.kt @@ -0,0 +1,7 @@ +class A { + constructor(i: Int) +} + +fun call() { + val a = A(42) +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitConstructorDelegationCall.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitConstructorDelegationCall.txt new file mode 100644 index 00000000000..a1ad877c0a8 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitConstructorDelegationCall.txt @@ -0,0 +1,24 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = A + symbol = (i: kotlin.Int): A + valueParameters = [ + KtVariableLikeSignature: + name = i + receiverType = null + returnType = kotlin.Int + symbol = i: kotlin.Int + ] + argumentMapping = { + 42 -> (KtVariableLikeSignature: + name = i + receiverType = null + returnType = kotlin.Int + symbol = i: kotlin.Int) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitConstuctorCall.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitConstuctorCall.kt new file mode 100644 index 00000000000..2aa810c204c --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitConstuctorCall.kt @@ -0,0 +1,5 @@ +class A + +fun call() { + val a = A() +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitConstuctorCall.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitConstuctorCall.txt new file mode 100644 index 00000000000..cbacf96d44b --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitConstuctorCall.txt @@ -0,0 +1,12 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = A + symbol = (): A + valueParameters = [] + argumentMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitJavaConstuctorCall.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitJavaConstuctorCall.kt new file mode 100644 index 00000000000..14c9a0acefa --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitJavaConstuctorCall.kt @@ -0,0 +1,7 @@ +// FILE: call.kt +fun call() { + val a = A() +} + +// FILE: A.java +class A {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitJavaConstuctorCall.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitJavaConstuctorCall.txt new file mode 100644 index 00000000000..cbacf96d44b --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/implicitJavaConstuctorCall.txt @@ -0,0 +1,12 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = A + symbol = (): A + valueParameters = [] + argumentMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/indexedGetWithTooManyArgs.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/indexedGetWithTooManyArgs.kt new file mode 100644 index 00000000000..9cc087bc8ea --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/indexedGetWithTooManyArgs.kt @@ -0,0 +1,7 @@ +class C { + operator fun get(a: Int, b: String): Boolean = true +} + +fun call(c: C) { + val res = c[1, "foo", false] +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNotEnoughArgs.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/indexedGetWithTooManyArgs.txt similarity index 57% rename from analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNotEnoughArgs.txt rename to analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/indexedGetWithTooManyArgs.txt index 821c1a3ea36..bf2a8909170 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/functionCallWithNotEnoughArgs.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/indexedGetWithTooManyArgs.txt @@ -3,12 +3,14 @@ KtErrorCallInfo: KtSimpleFunctionCall: isImplicitInvoke = false partiallyAppliedSymbol = KtPartiallyAppliedSymbol: - dispatchReceiver = null + dispatchReceiver = KtExplicitReceiverValue: + expression = c + isSafeNavigation = false extensionReceiver = null signature = KtFunctionLikeSignature: receiverType = null - returnType = kotlin.Unit - symbol = /function(a: kotlin.Int, b: kotlin.String): kotlin.Unit + returnType = kotlin.Boolean + symbol = /C.get(: C, a: kotlin.Int, b: kotlin.String): kotlin.Boolean valueParameters = [ KtVariableLikeSignature: name = a @@ -26,7 +28,12 @@ KtErrorCallInfo: name = a receiverType = null returnType = kotlin.Int - symbol = a: kotlin.Int) + symbol = a: kotlin.Int), + "foo" -> (KtVariableLikeSignature: + name = b + receiverType = null + returnType = kotlin.String + symbol = b: kotlin.String) } ] - diagnostic = ERROR + diagnostic = ERROR diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/indexedSetWithTooManyArgs.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/indexedSetWithTooManyArgs.kt new file mode 100644 index 00000000000..af5cf46225a --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/indexedSetWithTooManyArgs.kt @@ -0,0 +1,7 @@ +class C { + operator fun set(a: Int, b: String, value: Boolean) {} +} + +fun call(c: C) { + c[1, "foo", 3.14] = false +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/indexedSetWithTooManyArgs.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/indexedSetWithTooManyArgs.txt new file mode 100644 index 00000000000..6e3e940a16b --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/indexedSetWithTooManyArgs.txt @@ -0,0 +1,49 @@ +KtErrorCallInfo: + candidateCalls = [ + KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = c + isSafeNavigation = false + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = /C.set(: C, a: kotlin.Int, b: kotlin.String, value: kotlin.Boolean): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = a: kotlin.Int, + KtVariableLikeSignature: + name = b + receiverType = null + returnType = kotlin.String + symbol = b: kotlin.String, + KtVariableLikeSignature: + name = value + receiverType = null + returnType = kotlin.Boolean + symbol = value: kotlin.Boolean + ] + argumentMapping = { + 1 -> (KtVariableLikeSignature: + name = a + receiverType = null + returnType = kotlin.Int + symbol = a: kotlin.Int), + "foo" -> (KtVariableLikeSignature: + name = b + receiverType = null + returnType = kotlin.String + symbol = b: kotlin.String), + false -> (KtVariableLikeSignature: + name = value + receiverType = null + returnType = kotlin.Boolean + symbol = value: kotlin.Boolean) + } + ] + diagnostic = ERROR diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/intArrayOfInAnnotation.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/intArrayOfInAnnotation.kt new file mode 100644 index 00000000000..179c241ed23 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/intArrayOfInAnnotation.kt @@ -0,0 +1,4 @@ +annotation class RequiresPermission(val anyOf: IntArray) + +@RequiresPermission(anyOf = intArrayOf(1, 2, 3)) +fun foo(): Int = 5 diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/intArrayOfInAnnotation.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/intArrayOfInAnnotation.txt new file mode 100644 index 00000000000..89a884449b4 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/intArrayOfInAnnotation.txt @@ -0,0 +1,34 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.IntArray + symbol = kotlin/intArrayOf(vararg elements: kotlin.Int): kotlin.IntArray + valueParameters = [ + KtVariableLikeSignature: + name = elements + receiverType = null + returnType = kotlin.Int + symbol = vararg elements: kotlin.Int + ] + argumentMapping = { + 1 -> (KtVariableLikeSignature: + name = elements + receiverType = null + returnType = kotlin.Int + symbol = vararg elements: kotlin.Int), + 2 -> (KtVariableLikeSignature: + name = elements + receiverType = null + returnType = kotlin.Int + symbol = vararg elements: kotlin.Int), + 3 -> (KtVariableLikeSignature: + name = elements + receiverType = null + returnType = kotlin.Int + symbol = vararg elements: kotlin.Int) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/javaFunctionCall.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/javaFunctionCall.kt new file mode 100644 index 00000000000..19c126859ee --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/javaFunctionCall.kt @@ -0,0 +1,10 @@ +// FILE: call.kt +fun call() { + val javaClass = JavaClass() + javaClass.javaMethod() +} + +// FILE: JavaClass.java +class JavaClass { + void javaMethod() {} +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/javaFunctionCall.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/javaFunctionCall.txt new file mode 100644 index 00000000000..3030f717e74 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/javaFunctionCall.txt @@ -0,0 +1,14 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = javaClass + isSafeNavigation = false + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = /JavaClass.javaMethod(: JavaClass): kotlin.Unit + valueParameters = [] + argumentMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/memberFunctionCallWithTypeArgument.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/memberFunctionCallWithTypeArgument.kt new file mode 100644 index 00000000000..3f90386d7e6 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/memberFunctionCallWithTypeArgument.kt @@ -0,0 +1,7 @@ +interface A { + fun foo(r: R) +} + +fun call(a: A) { + a.foo(1) +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/memberFunctionCallWithTypeArgument.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/memberFunctionCallWithTypeArgument.txt new file mode 100644 index 00000000000..5824b831d5f --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/memberFunctionCallWithTypeArgument.txt @@ -0,0 +1,26 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = a + isSafeNavigation = false + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = /A.foo(: A, r: R): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = r + receiverType = null + returnType = kotlin.Int + symbol = r: R + ] + argumentMapping = { + 1 -> (KtVariableLikeSignature: + name = r + receiverType = null + returnType = kotlin.Int + symbol = r: R) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/privateMember.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/privateMember.kt new file mode 100644 index 00000000000..9c58848957b --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/privateMember.kt @@ -0,0 +1,7 @@ +class A { + private fun foo() {} +} + +fun test(a: A) { + a.foo() +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/privateMember.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/privateMember.txt new file mode 100644 index 00000000000..192e4502561 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/privateMember.txt @@ -0,0 +1,17 @@ +KtErrorCallInfo: + candidateCalls = [ + KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = a + isSafeNavigation = false + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = /A.foo(: A): kotlin.Unit + valueParameters = [] + argumentMapping = {} + ] + diagnostic = ERROR diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/resolveCallInSuperConstructorParam.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/resolveCallInSuperConstructorParam.kt new file mode 100644 index 00000000000..542bc2089c4 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/resolveCallInSuperConstructorParam.kt @@ -0,0 +1,5 @@ +infix fun A.to(other: B) = this + +open class A(x: T) + +class B : A(1 to 2) diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/resolveCallInSuperConstructorParam.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/resolveCallInSuperConstructorParam.txt new file mode 100644 index 00000000000..8bbf398ebd7 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/resolveCallInSuperConstructorParam.txt @@ -0,0 +1,26 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = KtExplicitReceiverValue: + expression = 1 + isSafeNavigation = false + signature = KtFunctionLikeSignature: + receiverType = kotlin.Int + returnType = kotlin.Int + symbol = /to(: A, other: B): A + valueParameters = [ + KtVariableLikeSignature: + name = other + receiverType = null + returnType = kotlin.Int + symbol = other: B + ] + argumentMapping = { + 2 -> (KtVariableLikeSignature: + name = other + receiverType = null + returnType = kotlin.Int + symbol = other: B) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/simpleCallWithNonMatchingArgs.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/simpleCallWithNonMatchingArgs.kt new file mode 100644 index 00000000000..6f28b43b767 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/simpleCallWithNonMatchingArgs.kt @@ -0,0 +1,5 @@ +fun x() { + foo(1) +} + +fun foo(){} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/simpleCallWithNonMatchingArgs.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/simpleCallWithNonMatchingArgs.txt new file mode 100644 index 00000000000..34daff7105b --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/simpleCallWithNonMatchingArgs.txt @@ -0,0 +1,15 @@ +KtErrorCallInfo: + candidateCalls = [ + KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = /foo(): kotlin.Unit + valueParameters = [] + argumentMapping = {} + ] + diagnostic = ERROR diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/smartCastExplicitExtensionReceiver.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/smartCastExplicitExtensionReceiver.kt new file mode 100644 index 00000000000..8cefc0e5b3b --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/smartCastExplicitExtensionReceiver.kt @@ -0,0 +1,7 @@ +fun test(a: Any) { + if (a is String) { + a.foo() + } +} + +fun String.foo() {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/smartCastExplicitExtensionReceiver.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/smartCastExplicitExtensionReceiver.txt new file mode 100644 index 00000000000..1f9212e4820 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/smartCastExplicitExtensionReceiver.txt @@ -0,0 +1,16 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = KtSmartCastedReceiverValue: + original = KtExplicitReceiverValue: + expression = a + isSafeNavigation = false + smartCastType = kotlin.String + signature = KtFunctionLikeSignature: + receiverType = kotlin.String + returnType = kotlin.Unit + symbol = /foo(: kotlin.String): kotlin.Unit + valueParameters = [] + argumentMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterName.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterName.kt new file mode 100644 index 00000000000..e65ac3da70a --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterName.kt @@ -0,0 +1,3 @@ +fun call(x: (a: Int, b: String) -> Unit) { + x(1, "") +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterName.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterName.txt new file mode 100644 index 00000000000..a8a63678d5f --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterName.txt @@ -0,0 +1,36 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = true + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = x + isSafeNavigation = false + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = kotlin/Function2.invoke(: kotlin.Function2, p1: P1, p2: P2): R + valueParameters = [ + KtVariableLikeSignature: + name = a + receiverType = null + returnType = @R|kotlin.ParameterName|(name = String(a)) kotlin.Int + symbol = p1: P1, + KtVariableLikeSignature: + name = b + receiverType = null + returnType = @R|kotlin.ParameterName|(name = String(b)) kotlin.String + symbol = p2: P2 + ] + argumentMapping = { + 1 -> (KtVariableLikeSignature: + name = a + receiverType = null + returnType = @R|kotlin.ParameterName|(name = String(a)) kotlin.Int + symbol = p1: P1), + "" -> (KtVariableLikeSignature: + name = b + receiverType = null + returnType = @R|kotlin.ParameterName|(name = String(b)) kotlin.String + symbol = p2: P2) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameAnnotation.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameAnnotation.kt new file mode 100644 index 00000000000..fb3d6ede0bf --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameAnnotation.kt @@ -0,0 +1,3 @@ +fun call(x: Function2<@ParameterName("a") Int, @ParameterName("b") String, Unit>) { + x(1, "") +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameAnnotation.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameAnnotation.txt new file mode 100644 index 00000000000..a8a63678d5f --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameAnnotation.txt @@ -0,0 +1,36 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = true + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = x + isSafeNavigation = false + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = kotlin/Function2.invoke(: kotlin.Function2, p1: P1, p2: P2): R + valueParameters = [ + KtVariableLikeSignature: + name = a + receiverType = null + returnType = @R|kotlin.ParameterName|(name = String(a)) kotlin.Int + symbol = p1: P1, + KtVariableLikeSignature: + name = b + receiverType = null + returnType = @R|kotlin.ParameterName|(name = String(b)) kotlin.String + symbol = p2: P2 + ] + argumentMapping = { + 1 -> (KtVariableLikeSignature: + name = a + receiverType = null + returnType = @R|kotlin.ParameterName|(name = String(a)) kotlin.Int + symbol = p1: P1), + "" -> (KtVariableLikeSignature: + name = b + receiverType = null + returnType = @R|kotlin.ParameterName|(name = String(b)) kotlin.String + symbol = p2: P2) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameAnnotationConflict.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameAnnotationConflict.kt new file mode 100644 index 00000000000..7f4b31dfe13 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameAnnotationConflict.kt @@ -0,0 +1,4 @@ +// @ParameterName annotation takes precedence over name in function type parameter +fun call(x: (notMe: @ParameterName("a") Int, meNeither: @ParameterName("b") String) -> Unit) { + x(1, "") +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameAnnotationConflict.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameAnnotationConflict.txt new file mode 100644 index 00000000000..a8a63678d5f --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameAnnotationConflict.txt @@ -0,0 +1,36 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = true + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = x + isSafeNavigation = false + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = kotlin/Function2.invoke(: kotlin.Function2, p1: P1, p2: P2): R + valueParameters = [ + KtVariableLikeSignature: + name = a + receiverType = null + returnType = @R|kotlin.ParameterName|(name = String(a)) kotlin.Int + symbol = p1: P1, + KtVariableLikeSignature: + name = b + receiverType = null + returnType = @R|kotlin.ParameterName|(name = String(b)) kotlin.String + symbol = p2: P2 + ] + argumentMapping = { + 1 -> (KtVariableLikeSignature: + name = a + receiverType = null + returnType = @R|kotlin.ParameterName|(name = String(a)) kotlin.Int + symbol = p1: P1), + "" -> (KtVariableLikeSignature: + name = b + receiverType = null + returnType = @R|kotlin.ParameterName|(name = String(b)) kotlin.String + symbol = p2: P2) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameGeneric.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameGeneric.kt new file mode 100644 index 00000000000..4e8c6eec180 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameGeneric.kt @@ -0,0 +1,6 @@ +fun T.foo(): (a: T) -> Unit = TODO() + +fun call() { + val x = 123.foo() + x(1) +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameGeneric.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameGeneric.txt new file mode 100644 index 00000000000..6870fe1928c --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameGeneric.txt @@ -0,0 +1,26 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = true + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = x + isSafeNavigation = false + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = kotlin/Function1.invoke(: kotlin.Function1, p1: P1): R + valueParameters = [ + KtVariableLikeSignature: + name = a + receiverType = null + returnType = @R|kotlin.ParameterName|(name = String(a)) kotlin.Int + symbol = p1: P1 + ] + argumentMapping = { + 1 -> (KtVariableLikeSignature: + name = a + receiverType = null + returnType = @R|kotlin.ParameterName|(name = String(a)) kotlin.Int + symbol = p1: P1) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameInNonFunctionType.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameInNonFunctionType.kt new file mode 100644 index 00000000000..336762253f8 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameInNonFunctionType.kt @@ -0,0 +1,4 @@ +// @ParameterName annotation is ignored when not used in function type +fun call(a: @ParameterName("notMe") Int, b: @ParameterName("meNeither") String) { + call(1, "") +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameInNonFunctionType.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameInNonFunctionType.txt new file mode 100644 index 00000000000..1568f1d86d0 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameInNonFunctionType.txt @@ -0,0 +1,34 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = /call(a: @R|kotlin.ParameterName|(name = String(notMe)) kotlin.Int, b: @R|kotlin.ParameterName|(name = String(meNeither)) kotlin.String): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = a + receiverType = null + returnType = @R|kotlin.ParameterName|(name = String(notMe)) kotlin.Int + symbol = a: @R|kotlin.ParameterName|(name = String(notMe)) kotlin.Int, + KtVariableLikeSignature: + name = b + receiverType = null + returnType = @R|kotlin.ParameterName|(name = String(meNeither)) kotlin.String + symbol = b: @R|kotlin.ParameterName|(name = String(meNeither)) kotlin.String + ] + argumentMapping = { + 1 -> (KtVariableLikeSignature: + name = a + receiverType = null + returnType = @R|kotlin.ParameterName|(name = String(notMe)) kotlin.Int + symbol = a: @R|kotlin.ParameterName|(name = String(notMe)) kotlin.Int), + "" -> (KtVariableLikeSignature: + name = b + receiverType = null + returnType = @R|kotlin.ParameterName|(name = String(meNeither)) kotlin.String + symbol = b: @R|kotlin.ParameterName|(name = String(meNeither)) kotlin.String) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameMixed.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameMixed.kt new file mode 100644 index 00000000000..ac776c165ef --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameMixed.kt @@ -0,0 +1,3 @@ +fun call(x: (a: Int, String) -> Unit) { + x(1, "") +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameMixed.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameMixed.txt new file mode 100644 index 00000000000..28fbf9c7648 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableAsFunctionWithParameterNameMixed.txt @@ -0,0 +1,36 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = true + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = x + isSafeNavigation = false + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = kotlin/Function2.invoke(: kotlin.Function2, p1: P1, p2: P2): R + valueParameters = [ + KtVariableLikeSignature: + name = a + receiverType = null + returnType = @R|kotlin.ParameterName|(name = String(a)) kotlin.Int + symbol = p1: P1, + KtVariableLikeSignature: + name = p2 + receiverType = null + returnType = kotlin.String + symbol = p2: P2 + ] + argumentMapping = { + 1 -> (KtVariableLikeSignature: + name = a + receiverType = null + returnType = @R|kotlin.ParameterName|(name = String(a)) kotlin.Int + symbol = p1: P1), + "" -> (KtVariableLikeSignature: + name = p2 + receiverType = null + returnType = kotlin.String + symbol = p2: P2) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithExtensionInvoke.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithExtensionInvoke.kt new file mode 100644 index 00000000000..0ecf6d7d8f7 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithExtensionInvoke.kt @@ -0,0 +1,7 @@ +interface Foo + +operator fun Foo.invoke(t: T) {} + +fun test(f: Foo) { + f("") +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithExtensionInvoke.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithExtensionInvoke.txt new file mode 100644 index 00000000000..c1388aa229f --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithExtensionInvoke.txt @@ -0,0 +1,26 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = true + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = KtExplicitReceiverValue: + expression = f + isSafeNavigation = false + signature = KtFunctionLikeSignature: + receiverType = Foo + returnType = kotlin.Unit + symbol = /invoke(: Foo, t: T): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = t + receiverType = null + returnType = kotlin.String + symbol = t: T + ] + argumentMapping = { + "" -> (KtVariableLikeSignature: + name = t + receiverType = null + returnType = kotlin.String + symbol = t: T) + } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithInvokeFunctionCall_dispatchReceiver.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithInvokeFunctionCall_dispatchReceiver.kt new file mode 100644 index 00000000000..4d399d07423 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithInvokeFunctionCall_dispatchReceiver.kt @@ -0,0 +1,7 @@ +operator fun Int.invoke() {} +class A { + val f: Int = 1 + fun test() { + f() + } +} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithInvokeFunctionCall_dispatchReceiver.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithInvokeFunctionCall_dispatchReceiver.txt new file mode 100644 index 00000000000..0e42ca83ba6 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithInvokeFunctionCall_dispatchReceiver.txt @@ -0,0 +1,14 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = true + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = KtExplicitReceiverValue: + expression = f + isSafeNavigation = false + signature = KtFunctionLikeSignature: + receiverType = kotlin.Int + returnType = kotlin.Unit + symbol = /invoke(: kotlin.Int): kotlin.Unit + valueParameters = [] + argumentMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithInvokeFunctionCall_extensionReceiver.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithInvokeFunctionCall_extensionReceiver.kt new file mode 100644 index 00000000000..ffc317bf919 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithInvokeFunctionCall_extensionReceiver.kt @@ -0,0 +1,8 @@ +operator fun Int.invoke() {} +class A { + fun test() { + f() + } +} + +val A.f: Int = 1 diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithInvokeFunctionCall_extensionReceiver.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithInvokeFunctionCall_extensionReceiver.txt new file mode 100644 index 00000000000..0e42ca83ba6 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithInvokeFunctionCall_extensionReceiver.txt @@ -0,0 +1,14 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = true + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = KtExplicitReceiverValue: + expression = f + isSafeNavigation = false + signature = KtFunctionLikeSignature: + receiverType = kotlin.Int + returnType = kotlin.Unit + symbol = /invoke(: kotlin.Int): kotlin.Unit + valueParameters = [] + argumentMapping = {} diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithMemberInvoke.kt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithMemberInvoke.kt new file mode 100644 index 00000000000..13488f15a09 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithMemberInvoke.kt @@ -0,0 +1,7 @@ +interface Foo { + operator fun invoke(t: T) +} + +fun test(f: Foo) { + f("") +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithMemberInvoke.txt b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithMemberInvoke.txt new file mode 100644 index 00000000000..074ee48e27b --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCandidates/singleCandidate/variableWithMemberInvoke.txt @@ -0,0 +1,26 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = true + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = KtExplicitReceiverValue: + expression = f + isSafeNavigation = false + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.Unit + symbol = /Foo.invoke(: Foo, t: T): kotlin.Unit + valueParameters = [ + KtVariableLikeSignature: + name = t + receiverType = null + returnType = kotlin.String + symbol = t: T + ] + argumentMapping = { + "" -> (KtVariableLikeSignature: + name = t + receiverType = null + returnType = kotlin.String + symbol = t: T) + }