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 4622b1d88db..b716b265170 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 @@ -5,6 +5,24 @@ package org.jetbrains.kotlin.analysis.api.fir.components +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.calls.* +import org.jetbrains.kotlin.analysis.api.components.KtCallResolver +import org.jetbrains.kotlin.analysis.api.diagnostics.KtNonBoundToPsiErrorDiagnostic +import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession +import org.jetbrains.kotlin.analysis.api.fir.buildSymbol +import org.jetbrains.kotlin.analysis.api.fir.getCandidateSymbols +import org.jetbrains.kotlin.analysis.api.fir.isImplicitFunctionCall +import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirArrayOfSymbolProvider.arrayOf +import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirArrayOfSymbolProvider.arrayOfSymbol +import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirArrayOfSymbolProvider.arrayTypeToArrayOfCall +import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirFunctionSymbol +import org.jetbrains.kotlin.analysis.api.symbols.* +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithMembers +import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken +import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor +import org.jetbrains.kotlin.analysis.api.withValidityAssertion +import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.fir.FirSourceElement import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic @@ -17,26 +35,12 @@ import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.references.FirSuperReference import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference import org.jetbrains.kotlin.fir.resolve.calls.FirErrorReferenceWithCandidate +import org.jetbrains.kotlin.fir.resolve.substitution.substitutorByMap +import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol +import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol import org.jetbrains.kotlin.fir.types.* -import org.jetbrains.kotlin.analysis.api.fir.getCandidateSymbols -import org.jetbrains.kotlin.analysis.api.fir.isImplicitFunctionCall -import org.jetbrains.kotlin.analysis.low.level.api.fir.api.getOrBuildFir -import org.jetbrains.kotlin.analysis.api.KtAnalysisSession -import org.jetbrains.kotlin.analysis.api.calls.* -import org.jetbrains.kotlin.analysis.api.components.KtCallResolver -import org.jetbrains.kotlin.analysis.api.diagnostics.KtNonBoundToPsiErrorDiagnostic -import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession -import org.jetbrains.kotlin.analysis.api.fir.buildSymbol -import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirArrayOfSymbolProvider.arrayOf -import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirArrayOfSymbolProvider.arrayOfSymbol -import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirArrayOfSymbolProvider.arrayTypeToArrayOfCall -import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirFunctionSymbol -import org.jetbrains.kotlin.analysis.api.symbols.* -import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithMembers -import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken -import org.jetbrains.kotlin.analysis.api.withValidityAssertion import org.jetbrains.kotlin.idea.references.FirReferenceResolveHelper import org.jetbrains.kotlin.idea.references.readWriteAccess import org.jetbrains.kotlin.name.CallableId @@ -77,7 +81,7 @@ internal class KtFirCallResolver( val setterParameterSymbol = accessor.valueParameters.single().buildSymbol(firSymbolBuilder) as KtValueParameterSymbol ktArgumentMapping[setterValue] = setterParameterSymbol } - return KtFunctionCall(ktArgumentMapping, target, token) + return KtFunctionCall(ktArgumentMapping, target, KtSubstitutor.Empty(token), token) } else -> return null } @@ -134,14 +138,32 @@ internal class KtFirCallResolver( arrayOfCall.createArgumentMapping(defaultArrayOfSymbol), KtErrorCallTarget( listOf(defaultArrayOfSymbol), - KtNonBoundToPsiErrorDiagnostic(factoryName = null, "type of arrayOf call is not resolved", token) - ) + KtNonBoundToPsiErrorDiagnostic(factoryName = null, "type of arrayOf call is not resolved", token), + token + ), + arrayOfCall.createSubstitutorFromTypeArguments(defaultArrayOfSymbol), + token ) } val call = arrayTypeToArrayOfCall[type.lookupTag.classId] ?: arrayOf arrayOfSymbol(call) } ?: return null - return KtFunctionCall(arrayOfCall.createArgumentMapping(arrayOfSymbol), KtSuccessCallTarget(arrayOfSymbol)) + return KtFunctionCall( + arrayOfCall.createArgumentMapping(arrayOfSymbol), + KtSuccessCallTarget(arrayOfSymbol, token), + arrayOfCall.createSubstitutorFromTypeArguments(arrayOfSymbol), + token + ) + } + + private fun FirArrayOfCall.createSubstitutorFromTypeArguments(arrayOfSymbol: KtFirFunctionSymbol): KtSubstitutor { + return arrayOfSymbol.firRef.withFir { + // No type parameter means this is an arrayOf call of primitives, in which case there is no type arguments + val typeParameter = it.typeParameters.singleOrNull() ?: return@withFir null + val elementType = typeRef.coneTypeSafe()?.arrayElementType() ?: return@withFir null + val coneSubstitutor = substitutorByMap(mapOf(typeParameter.symbol to elementType), rootModuleSession) + firSymbolBuilder.typeBuilder.buildSubstitutor(coneSubstitutor) + } ?: KtSubstitutor.Empty(token) } private fun resolveCall(firCall: FirFunctionCall): KtCall? { @@ -178,15 +200,41 @@ internal class KtFirCallResolver( } val callableId = functionSymbol?.callableId ?: return null return if (callableId in kotlinFunctionInvokeCallableIds) { - KtFunctionalTypeVariableCall(variableLikeSymbol, createArgumentMapping(), target, token) + // A fake override is always created for a function type with all types substituted properly inside the dispatch receiver. Hence + // there is no need for additional substitutor. + KtFunctionalTypeVariableCall(variableLikeSymbol, createArgumentMapping(), target, KtSubstitutor.Empty(token), token) } else { - KtVariableWithInvokeFunctionCall(variableLikeSymbol, createArgumentMapping(), target, token) + val substitutor = createSubstitutorFromTypeArguments(functionSymbol) + KtVariableWithInvokeFunctionCall( + variableLikeSymbol, + createArgumentMapping(), + target, + substitutor, token + ) } } private fun FirFunctionCall.asSimpleFunctionCall(): KtFunctionCall? { + val calleeReference = this.calleeReference val target = calleeReference.createCallTarget() ?: return null - return KtFunctionCall(createArgumentMapping(), target, token) + val symbol = when (calleeReference) { + is FirResolvedNamedReference -> calleeReference.resolvedSymbol as? FirCallableSymbol<*> + is FirErrorNamedReference -> calleeReference.candidateSymbol as? FirCallableSymbol<*> + else -> null + } ?: return null + return KtFunctionCall(createArgumentMapping(), target, createSubstitutorFromTypeArguments(symbol), token) + } + + private fun FirFunctionCall.createSubstitutorFromTypeArguments(functionSymbol: FirCallableSymbol<*>): KtSubstitutor { + val typeArgumentMap = mutableMapOf() + for (i in typeArguments.indices) { + val type = typeArguments[i].safeAs()?.typeRef?.coneType + if (type != null) { + typeArgumentMap[functionSymbol.typeParameterSymbols[i]] = type + } + } + val coneSubstitutor = substitutorByMap(typeArgumentMap, rootModuleSession) + return firSymbolBuilder.typeBuilder.buildSubstitutor(coneSubstitutor) } private fun FirAnnotationCall.asAnnotationCall(): KtAnnotationCall? { diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractResolveCallTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractResolveCallTest.kt index 662127e619a..3e8233c9a0a 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractResolveCallTest.kt +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/AbstractResolveCallTest.kt @@ -6,17 +6,21 @@ package org.jetbrains.kotlin.analysis.api.fir.components import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.analysis.api.fir.executeOnPooledThreadInReadAction -import org.jetbrains.kotlin.analysis.api.fir.test.framework.AbstractHLApiSingleModuleTest -import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.expressionMarkerProvider import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.analyse import org.jetbrains.kotlin.analysis.api.calls.KtCall import org.jetbrains.kotlin.analysis.api.calls.KtDelegatedConstructorCallKind import org.jetbrains.kotlin.analysis.api.calls.KtErrorCallTarget import org.jetbrains.kotlin.analysis.api.calls.KtSuccessCallTarget +import org.jetbrains.kotlin.analysis.api.fir.executeOnPooledThreadInReadAction +import org.jetbrains.kotlin.analysis.api.fir.test.framework.AbstractHLApiSingleModuleTest +import org.jetbrains.kotlin.analysis.api.fir.types.KtFirSubstitutor import org.jetbrains.kotlin.analysis.api.symbols.* +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtPossibleMemberSymbol +import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.low.level.api.fir.test.base.expressionMarkerProvider +import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutorByMap import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.test.model.TestModule import org.jetbrains.kotlin.test.services.TestServices @@ -52,7 +56,7 @@ abstract class AbstractResolveCallTest : AbstractHLApiSingleModuleTest() { } private fun KtCall.stringRepresentation(): String { - fun KtType.render() = asStringForDebugging().replace('/', '.') + fun KtType.render() = substitutor.substituteOrSelf(this).asStringForDebugging().replace('/', '.') fun Any.stringValue(): String = when (this) { is KtFunctionLikeSymbol -> buildString { append( @@ -66,7 +70,11 @@ private fun KtCall.stringRepresentation(): String { ) append("(") (this@stringValue as? KtFunctionSymbol)?.receiverType?.let { receiver -> - append(": ${receiver.type.render()}") + append(": ${receiver.type.render()}") + if (valueParameters.isNotEmpty()) append(", ") + } + (this@stringValue as? KtPossibleMemberSymbol)?.dispatchType?.let { dispatchReceiverType -> + append(": ${dispatchReceiverType.render()}") if (valueParameters.isNotEmpty()) append(", ") } valueParameters.joinTo(this) { it.stringValue() } @@ -80,6 +88,13 @@ private fun KtCall.stringRepresentation(): String { is Map<*, *> -> entries.joinToString(prefix = "{ ", postfix = " }") { (k, v) -> "${k?.stringValue()} -> (${v?.stringValue()})" } is KtExpression -> this.text is KtDelegatedConstructorCallKind -> toString() + is KtSubstitutor.Empty -> "" + is KtFirSubstitutor -> { + when (val substitutor = substitutor) { + is ConeSubstitutorByMap -> "" + else -> "" + } + } else -> error("unexpected parameter type ${this::class}") } diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/ResolveCallTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/ResolveCallTestGenerated.java index d069bac810e..0081ce23a25 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/ResolveCallTestGenerated.java +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/ResolveCallTestGenerated.java @@ -60,6 +60,12 @@ public class ResolveCallTestGenerated extends AbstractResolveCallTest { runTest("analysis/analysis-api/testData/analysisSession/resolveCall/functionCallInTheSameFile.kt"); } + @Test + @TestMetadata("functionCallWithExtensionReceiverAndTypeArgument.kt") + public void testFunctionCallWithExtensionReceiverAndTypeArgument() throws Exception { + runTest("analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithExtensionReceiverAndTypeArgument.kt"); + } + @Test @TestMetadata("functionCallWithLambdaArgument.kt") public void testFunctionCallWithLambdaArgument() throws Exception { @@ -84,6 +90,12 @@ public class ResolveCallTestGenerated extends AbstractResolveCallTest { runTest("analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithSpreadArgument.kt"); } + @Test + @TestMetadata("functionCallWithTypeArgument.kt") + public void testFunctionCallWithTypeArgument() throws Exception { + runTest("analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithTypeArgument.kt"); + } + @Test @TestMetadata("functionCallWithVarargArgument.kt") public void testFunctionCallWithVarargArgument() throws Exception { @@ -210,6 +222,12 @@ public class ResolveCallTestGenerated extends AbstractResolveCallTest { runTest("analysis/analysis-api/testData/analysisSession/resolveCall/kotlinPropertySetter.kt"); } + @Test + @TestMetadata("memberFunctionCallWithTypeArgument.kt") + public void testMemberFunctionCallWithTypeArgument() throws Exception { + runTest("analysis/analysis-api/testData/analysisSession/resolveCall/memberFunctionCallWithTypeArgument.kt"); + } + @Test @TestMetadata("resolveCallInSuperConstructorParam.kt") public void testResolveCallInSuperConstructorParam() throws Exception { @@ -239,4 +257,10 @@ public class ResolveCallTestGenerated extends AbstractResolveCallTest { public void testVariableAsFunctionLikeCall() throws Exception { runTest("analysis/analysis-api/testData/analysisSession/resolveCall/variableAsFunctionLikeCall.kt"); } + + @Test + @TestMetadata("variableWithInvoke.kt") + public void testVariableWithInvoke() throws Exception { + runTest("analysis/analysis-api/testData/analysisSession/resolveCall/variableWithInvoke.kt"); + } } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/calls/KtCall.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/calls/KtCall.kt index 988ce1a53c1..31dc781a28c 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/calls/KtCall.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/calls/KtCall.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtVariableLikeSymbol import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken +import org.jetbrains.kotlin.analysis.api.types.KtSubstitutor import org.jetbrains.kotlin.analysis.api.withValidityAssertion import org.jetbrains.kotlin.psi.KtExpression @@ -21,6 +22,7 @@ public sealed class KtCall : ValidityTokenOwner { public abstract val isErrorCall: Boolean public abstract val argumentMapping: LinkedHashMap public abstract val targetFunction: KtCallTarget + public abstract val substitutor: KtSubstitutor } /** @@ -34,6 +36,7 @@ public class KtFunctionalTypeVariableCall( private val _target: KtVariableLikeSymbol, private val _argumentMapping: LinkedHashMap, private val _targetFunction: KtCallTarget, + private val _substitutor: KtSubstitutor, override val token: ValidityToken ) : KtCall() { public val target: KtVariableLikeSymbol get() = withValidityAssertion { _target } @@ -42,6 +45,8 @@ public class KtFunctionalTypeVariableCall( get() = withValidityAssertion { _argumentMapping } override val targetFunction: KtCallTarget get() = withValidityAssertion { _targetFunction } + override val substitutor: KtSubstitutor + get() = withValidityAssertion { _substitutor } } /** @@ -65,12 +70,15 @@ public class KtVariableWithInvokeFunctionCall( public val target: KtVariableLikeSymbol, private val _argumentMapping: LinkedHashMap, private val _targetFunction: KtCallTarget, + private val _substitutor: KtSubstitutor, override val token: ValidityToken ) : KtDeclaredFunctionCall() { override val argumentMapping: LinkedHashMap get() = withValidityAssertion { _argumentMapping } override val targetFunction: KtCallTarget get() = withValidityAssertion { _targetFunction } + override val substitutor: KtSubstitutor + get() = withValidityAssertion { _substitutor } } /** @@ -81,12 +89,15 @@ public class KtVariableWithInvokeFunctionCall( public class KtFunctionCall( private val _argumentMapping: LinkedHashMap, private val _targetFunction: KtCallTarget, + private val _substitutor: KtSubstitutor, override val token: ValidityToken ) : KtDeclaredFunctionCall() { override val argumentMapping: LinkedHashMap get() = withValidityAssertion { _argumentMapping } override val targetFunction: KtCallTarget get() = withValidityAssertion { _targetFunction } + override val substitutor: KtSubstitutor + get() = withValidityAssertion { _substitutor } } /** @@ -104,6 +115,9 @@ public class KtAnnotationCall( get() = withValidityAssertion { _argumentMapping } override val targetFunction: KtCallTarget get() = withValidityAssertion { _targetFunction } + + // Type parameter is allowed for an annotation class but not allowed as members. So substitutor is probably never useful. + override val substitutor: KtSubstitutor = KtSubstitutor.Empty(token) } // TODO: Add other properties, e.g., useSiteTarget @@ -125,6 +139,9 @@ public class KtDelegatedConstructorCall( get() = withValidityAssertion { _argumentMapping } override val targetFunction: KtCallTarget get() = withValidityAssertion { _targetFunction } + + // A delegate constructor call never has any type argument. + override val substitutor: KtSubstitutor = KtSubstitutor.Empty(token) } public enum class KtDelegatedConstructorCallKind { SUPER_CALL, THIS_CALL } diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/arrayOfInAnnotation.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/arrayOfInAnnotation.txt index a5a5468993e..0af738d585b 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/arrayOfInAnnotation.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/arrayOfInAnnotation.txt @@ -1,3 +1,4 @@ KtFunctionCall: -argumentMapping = { 1 -> (vararg elements: T), 2 -> (vararg elements: T), 3 -> (vararg elements: T) } -targetFunction = kotlin/arrayOf(vararg elements: T): kotlin.Array +argumentMapping = { 1 -> (vararg elements: kotlin.Int), 2 -> (vararg elements: kotlin.Int), 3 -> (vararg elements: kotlin.Int) } +targetFunction = kotlin/arrayOf(vararg elements: kotlin.Int): kotlin.Array +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallInTheSameFile.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallInTheSameFile.txt index d965a6c07b8..b4702cf592e 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallInTheSameFile.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallInTheSameFile.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { 1 -> (a: kotlin.Int) } -targetFunction = /function(a: kotlin.Int): kotlin.Unit \ No newline at end of file +targetFunction = /function(a: kotlin.Int): kotlin.Unit +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithExtensionReceiverAndTypeArgument.kt b/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithExtensionReceiverAndTypeArgument.kt new file mode 100644 index 00000000000..3dca2ee3309 --- /dev/null +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithExtensionReceiverAndTypeArgument.kt @@ -0,0 +1,5 @@ +fun A.function(a: B) {} + +fun call() { + "str".function(1) +} diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithExtensionReceiverAndTypeArgument.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithExtensionReceiverAndTypeArgument.txt new file mode 100644 index 00000000000..89e8c59ddc8 --- /dev/null +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithExtensionReceiverAndTypeArgument.txt @@ -0,0 +1,4 @@ +KtFunctionCall: +argumentMapping = { 1 -> (a: kotlin.Int) } +targetFunction = /function(: kotlin.String, a: kotlin.Int): kotlin.Unit +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithLambdaArgument.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithLambdaArgument.txt index c436fa4c52c..f1b41bdd439 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithLambdaArgument.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithLambdaArgument.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { 1 -> (a: kotlin.Int), { s -> true } -> (b: kotlin.Function1) } -targetFunction = /function(a: kotlin.Int, b: kotlin.Function1): kotlin.Unit \ No newline at end of file +targetFunction = /function(a: kotlin.Int, b: kotlin.Function1): kotlin.Unit +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithNamedArgument.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithNamedArgument.txt index 250c5189ddd..eb73e53e165 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithNamedArgument.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithNamedArgument.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { "foo" -> (b: kotlin.String), 1 -> (a: kotlin.Int) } -targetFunction = /function(a: kotlin.Int, b: kotlin.String): kotlin.Unit \ No newline at end of file +targetFunction = /function(a: kotlin.Int, b: kotlin.String): kotlin.Unit +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithNonTrailingLambdaArgument.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithNonTrailingLambdaArgument.txt index c436fa4c52c..f1b41bdd439 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithNonTrailingLambdaArgument.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithNonTrailingLambdaArgument.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { 1 -> (a: kotlin.Int), { s -> true } -> (b: kotlin.Function1) } -targetFunction = /function(a: kotlin.Int, b: kotlin.Function1): kotlin.Unit \ No newline at end of file +targetFunction = /function(a: kotlin.Int, b: kotlin.Function1): kotlin.Unit +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithSpreadArgument.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithSpreadArgument.txt index 02e1fb92990..41df0b33f47 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithSpreadArgument.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithSpreadArgument.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { args -> (vararg a: kotlin.Int) } -targetFunction = /function(vararg a: kotlin.Int): kotlin.Unit \ No newline at end of file +targetFunction = /function(vararg a: kotlin.Int): kotlin.Unit +substitutor = diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithTypeArgument.kt b/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithTypeArgument.kt new file mode 100644 index 00000000000..a706d0e8c94 --- /dev/null +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithTypeArgument.kt @@ -0,0 +1,5 @@ +fun function(a: A, b: B) {} + +fun call() { + function(1, "") +} diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithTypeArgument.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithTypeArgument.txt new file mode 100644 index 00000000000..f6f165321f6 --- /dev/null +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithTypeArgument.txt @@ -0,0 +1,4 @@ +KtFunctionCall: +argumentMapping = { 1 -> (a: kotlin.Int), "" -> (b: kotlin.String) } +targetFunction = /function(a: kotlin.Int, b: kotlin.String): kotlin.Unit +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithVarargArgument.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithVarargArgument.txt index f0a10570161..838f9384a72 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithVarargArgument.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/functionCallWithVarargArgument.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { 1 -> (vararg a: kotlin.Int), 2 -> (vararg a: kotlin.Int), 3 -> (vararg a: kotlin.Int) } -targetFunction = /function(vararg a: kotlin.Int): kotlin.Unit \ No newline at end of file +targetFunction = /function(vararg a: kotlin.Int): kotlin.Unit +substitutor = diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/functionWithReceiverCall.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/functionWithReceiverCall.txt index 23990b03a2e..51429ad98ba 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/functionWithReceiverCall.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/functionWithReceiverCall.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { 1 -> (a: kotlin.Int) } -targetFunction = /function(: kotlin.String, a: kotlin.Int): kotlin.Unit \ No newline at end of file +targetFunction = /function(: kotlin.String, a: kotlin.Int): kotlin.Unit +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/functionWithReceiverSafeCall.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/functionWithReceiverSafeCall.txt index 23990b03a2e..51429ad98ba 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/functionWithReceiverSafeCall.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/functionWithReceiverSafeCall.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { 1 -> (a: kotlin.Int) } -targetFunction = /function(: kotlin.String, a: kotlin.Int): kotlin.Unit \ No newline at end of file +targetFunction = /function(: kotlin.String, a: kotlin.Int): kotlin.Unit +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/implicitConstructorDelegationCall.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/implicitConstructorDelegationCall.txt index 19368281c34..0ba7ff24df2 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/implicitConstructorDelegationCall.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/implicitConstructorDelegationCall.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { 42 -> (i: kotlin.Int) } targetFunction = (i: kotlin.Int): A +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/implicitConstuctorCall.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/implicitConstuctorCall.txt index c99893d973f..92168086499 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/implicitConstuctorCall.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/implicitConstuctorCall.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { } -targetFunction = (): A \ No newline at end of file +targetFunction = (): A +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/implicitJavaConstuctorCall.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/implicitJavaConstuctorCall.txt index c99893d973f..92168086499 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/implicitJavaConstuctorCall.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/implicitJavaConstuctorCall.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { } -targetFunction = (): A \ No newline at end of file +targetFunction = (): A +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/indexedGet.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/indexedGet.txt index d7d6d3232eb..2f9c3deb0c9 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/indexedGet.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/indexedGet.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { 1 -> (a: kotlin.Int), "foo" -> (b: kotlin.String) } -targetFunction = /C.get(a: kotlin.Int, b: kotlin.String): kotlin.Boolean \ No newline at end of file +targetFunction = /C.get(: C, a: kotlin.Int, b: kotlin.String): kotlin.Boolean +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/indexedGetWithNotEnoughArgs.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/indexedGetWithNotEnoughArgs.txt index a3b07ddceb0..f6e85e290a8 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/indexedGetWithNotEnoughArgs.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/indexedGetWithNotEnoughArgs.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { 1 -> (a: kotlin.Int) } -targetFunction = ERR \ No newline at end of file +targetFunction = ERR: C, a: kotlin.Int, b: kotlin.String): kotlin.Boolean]> +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/indexedGetWithTooManyArgs.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/indexedGetWithTooManyArgs.txt index fd779291da8..0dbc156dd71 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/indexedGetWithTooManyArgs.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/indexedGetWithTooManyArgs.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { 1 -> (a: kotlin.Int), "foo" -> (b: kotlin.String) } -targetFunction = ERR \ No newline at end of file +targetFunction = ERR: C, a: kotlin.Int, b: kotlin.String): kotlin.Boolean]> +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/indexedSet.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/indexedSet.txt index 8f1bbd9402a..6f3bf2f7e57 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/indexedSet.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/indexedSet.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { 1 -> (a: kotlin.Int), "foo" -> (b: kotlin.String), false -> (value: kotlin.Boolean) } -targetFunction = /C.set(a: kotlin.Int, b: kotlin.String, value: kotlin.Boolean): kotlin.Unit \ No newline at end of file +targetFunction = /C.set(: C, a: kotlin.Int, b: kotlin.String, value: kotlin.Boolean): kotlin.Unit +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/indexedSetWithNotEnoughArgs.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/indexedSetWithNotEnoughArgs.txt index 7051ca6ce02..0a5dce54de6 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/indexedSetWithNotEnoughArgs.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/indexedSetWithNotEnoughArgs.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { 1 -> (a: kotlin.Int), false -> (value: kotlin.Boolean) } -targetFunction = ERR \ No newline at end of file +targetFunction = ERR: C, a: kotlin.Int, b: kotlin.String, value: kotlin.Boolean): kotlin.Unit]> +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/indexedSetWithTooManyArgs.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/indexedSetWithTooManyArgs.txt index c994077bc4c..bd8a5d29817 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/indexedSetWithTooManyArgs.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/indexedSetWithTooManyArgs.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { 1 -> (a: kotlin.Int), "foo" -> (b: kotlin.String), false -> (value: kotlin.Boolean) } -targetFunction = ERR \ No newline at end of file +targetFunction = ERR: C, a: kotlin.Int, b: kotlin.String, value: kotlin.Boolean): kotlin.Unit]> +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/intArrayOfInAnnotation.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/intArrayOfInAnnotation.txt index b56873bd369..4e66d80ce6b 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/intArrayOfInAnnotation.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/intArrayOfInAnnotation.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { 1 -> (vararg elements: kotlin.Int), 2 -> (vararg elements: kotlin.Int), 3 -> (vararg elements: kotlin.Int) } targetFunction = kotlin/intArrayOf(vararg elements: kotlin.Int): kotlin.IntArray +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/javaFunctionCall.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/javaFunctionCall.txt index 0eab0ea92c2..f1d9c60766e 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/javaFunctionCall.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/javaFunctionCall.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { } -targetFunction = /JavaClass.javaMethod(): kotlin.Unit \ No newline at end of file +targetFunction = /JavaClass.javaMethod(: JavaClass): kotlin.Unit +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/javaPropertyGetter.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/javaPropertyGetter.txt index f5cb7433f69..45451cb00e4 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/javaPropertyGetter.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/javaPropertyGetter.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { } -targetFunction = /JavaClass.getFoo(): kotlin.Int +targetFunction = /JavaClass.getFoo(: JavaClass): kotlin.Int +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/javaPropertyNestedGetter.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/javaPropertyNestedGetter.txt index a3093e57907..69234be9833 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/javaPropertyNestedGetter.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/javaPropertyNestedGetter.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { } -targetFunction = /JavaClass.getSub(): ft +targetFunction = /JavaClass.getSub(: JavaClass): ft +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/javaPropertySetter.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/javaPropertySetter.txt index 7a8fe1c1ea2..e74a4608d13 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/javaPropertySetter.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/javaPropertySetter.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { 42 -> (v: kotlin.Int) } -targetFunction = /JavaClass.setFoo(v: kotlin.Int): kotlin.Unit +targetFunction = /JavaClass.setFoo(: JavaClass, v: kotlin.Int): kotlin.Unit +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/javaPropertySetterIncomplete.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/javaPropertySetterIncomplete.txt index c2ee7cdaa4b..12ff065f1ff 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/javaPropertySetterIncomplete.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/javaPropertySetterIncomplete.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { } -targetFunction = ERR +targetFunction = ERR: JavaClass, v: kotlin.Int): kotlin.Unit]> +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/kotlinPropertyGetter.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/kotlinPropertyGetter.txt index ab7b4abbde8..6115b7389b2 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/kotlinPropertyGetter.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/kotlinPropertyGetter.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { } targetFunction = (): kotlin.Int +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/kotlinPropertyNestedGetter.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/kotlinPropertyNestedGetter.txt index 72ed6120e8a..66ebd8c917b 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/kotlinPropertyNestedGetter.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/kotlinPropertyNestedGetter.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { } targetFunction = (): KtSubClass +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/kotlinPropertySetter.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/kotlinPropertySetter.txt index 5ae65f4e100..83841314ae0 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/kotlinPropertySetter.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/kotlinPropertySetter.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { 42 -> (value: kotlin.Int) } targetFunction = (value: kotlin.Int): kotlin.Unit +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/memberFunctionCallWithTypeArgument.kt b/analysis/analysis-api/testData/analysisSession/resolveCall/memberFunctionCallWithTypeArgument.kt new file mode 100644 index 00000000000..3f90386d7e6 --- /dev/null +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/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/analysisSession/resolveCall/memberFunctionCallWithTypeArgument.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/memberFunctionCallWithTypeArgument.txt new file mode 100644 index 00000000000..fe3f635a3fb --- /dev/null +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/memberFunctionCallWithTypeArgument.txt @@ -0,0 +1,4 @@ +KtFunctionCall: +argumentMapping = { 1 -> (r: kotlin.Int) } +targetFunction = /A.foo(: A, r: kotlin.Int): kotlin.Unit +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/resolveCallInSuperConstructorParam.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/resolveCallInSuperConstructorParam.txt index 9b83a01bc5b..d8a4bb92d5c 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/resolveCallInSuperConstructorParam.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/resolveCallInSuperConstructorParam.txt @@ -1,3 +1,4 @@ KtFunctionCall: -argumentMapping = { 2 -> (other: B) } -targetFunction = /to(: A, other: B): A \ No newline at end of file +argumentMapping = { 2 -> (other: kotlin.Int) } +targetFunction = /to(: kotlin.Int, other: kotlin.Int): kotlin.Int +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/simpleCallWithNonMatchingArgs.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/simpleCallWithNonMatchingArgs.txt index 2f425fa265d..9b3f8710381 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/simpleCallWithNonMatchingArgs.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/simpleCallWithNonMatchingArgs.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { } -targetFunction = ERR \ No newline at end of file +targetFunction = ERR +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/variableAsFunction.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/variableAsFunction.txt index 690f54bab1b..0da7df42a92 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/variableAsFunction.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/variableAsFunction.txt @@ -1,4 +1,5 @@ KtFunctionalTypeVariableCall: target = x: kotlin.Function1 argumentMapping = { 1 -> (p1: kotlin.Int) } -targetFunction = kotlin/Function1.invoke(p1: kotlin.Int): kotlin.String \ No newline at end of file +targetFunction = kotlin/Function1.invoke(: kotlin.Function1, p1: kotlin.Int): kotlin.String +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/variableAsFunctionLikeCall.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/variableAsFunctionLikeCall.txt index 9db2187753a..ca526504d8e 100644 --- a/analysis/analysis-api/testData/analysisSession/resolveCall/variableAsFunctionLikeCall.txt +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/variableAsFunctionLikeCall.txt @@ -1,3 +1,4 @@ KtFunctionCall: argumentMapping = { } -targetFunction = /invoke(: kotlin.Int): kotlin.String \ No newline at end of file +targetFunction = /invoke(: kotlin.Int): kotlin.String +substitutor = \ No newline at end of file diff --git a/analysis/analysis-api/testData/analysisSession/resolveCall/variableWithInvoke.kt b/analysis/analysis-api/testData/analysisSession/resolveCall/variableWithInvoke.kt new file mode 100644 index 00000000000..13488f15a09 --- /dev/null +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/variableWithInvoke.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/analysisSession/resolveCall/variableWithInvoke.txt b/analysis/analysis-api/testData/analysisSession/resolveCall/variableWithInvoke.txt new file mode 100644 index 00000000000..454fff0caa4 --- /dev/null +++ b/analysis/analysis-api/testData/analysisSession/resolveCall/variableWithInvoke.txt @@ -0,0 +1,5 @@ +KtVariableWithInvokeFunctionCall: +target = f: Foo +argumentMapping = { "" -> (t: kotlin.String) } +targetFunction = /Foo.invoke(: Foo, t: kotlin.String): kotlin.Unit +substitutor = \ No newline at end of file