diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescFunctionSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescFunctionSymbol.kt index aaa7686c720..42f179fb4c0 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescFunctionSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/KtFe10DescFunctionSymbol.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.* import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10DescFunctionLikeSymbolPointer import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer +import org.jetbrains.kotlin.analysis.api.impl.base.util.kotlinFunctionInvokeCallableIds import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol @@ -56,6 +57,9 @@ internal class KtFe10DescFunctionSymbol private constructor( override val isStatic: Boolean get() = withValidityAssertion { descriptor is JavaCallableMemberDescriptor && DescriptorUtils.isStaticDeclaration(descriptor) } + override val isBuiltinFunctionInvoke: Boolean + get() = callableIdIfNonLocal in kotlinFunctionInvokeCallableIds + override val valueParameters: List get() = withValidityAssertion { descriptor.valueParameters.map { KtFe10DescValueParameterSymbol(it, analysisContext) } } diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiFunctionSymbol.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiFunctionSymbol.kt index 6e451f8440b..2fb35379044 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiFunctionSymbol.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/psiBased/KtFe10PsiFunctionSymbol.kt @@ -13,6 +13,7 @@ import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.bas import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10NeverRestoringSymbolPointer import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.* import org.jetbrains.kotlin.analysis.api.descriptors.utils.cached +import org.jetbrains.kotlin.analysis.api.impl.base.util.kotlinFunctionInvokeCallableIds import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol @@ -62,6 +63,9 @@ internal class KtFe10PsiFunctionSymbol( override val isStatic: Boolean get() = withValidityAssertion { false } + override val isBuiltinFunctionInvoke: Boolean + get() = callableIdIfNonLocal in kotlinFunctionInvokeCallableIds + override val valueParameters: List get() = withValidityAssertion { psi.valueParameters.map { KtFe10PsiValueParameterSymbol(it, analysisContext) } } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/FirUtils.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/FirUtils.kt index 3769b4626ea..2062ca8a8ac 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/FirUtils.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/FirUtils.kt @@ -9,10 +9,14 @@ import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication import org.jetbrains.kotlin.analysis.api.fir.annotations.fullyExpandedClassId import org.jetbrains.kotlin.analysis.api.fir.annotations.mapAnnotationParameters import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirAnnotationValueConverter +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic +import org.jetbrains.kotlin.fir.expressions.FirAnnotation import org.jetbrains.kotlin.fir.expressions.FirFunctionCall import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression +import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.references.FirErrorNamedReference import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.FirReference @@ -20,11 +24,6 @@ import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.resolve.diagnostics.* import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol -import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.expressions.FirAnnotation -import org.jetbrains.kotlin.fir.psi -import org.jetbrains.kotlin.psi.KtAnnotationEntry import org.jetbrains.kotlin.psi.KtCallElement import org.jetbrains.kotlin.util.OperatorNameConventions diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirInvokeFunctionReference.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirInvokeFunctionReference.kt index eb47de7a8d6..570b5fda48f 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirInvokeFunctionReference.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KtFirInvokeFunctionReference.kt @@ -6,7 +6,8 @@ package org.jetbrains.kotlin.idea.references import org.jetbrains.kotlin.analysis.api.KtAnalysisSession -import org.jetbrains.kotlin.analysis.api.calls.KtVariableWithInvokeFunctionCall +import org.jetbrains.kotlin.analysis.api.calls.KtSimpleFunctionCall +import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.psi.KtCallExpression import org.jetbrains.kotlin.psi.KtExpression @@ -17,10 +18,12 @@ class KtFirInvokeFunctionReference(expression: KtCallExpression) : KtInvokeFunct } override fun KtAnalysisSession.resolveToSymbols(): Collection { - val call = expression.resolveCall() ?: return emptyList() - if (call is KtVariableWithInvokeFunctionCall) { - return call.targetFunction.candidates + return expression.resolveCall().calls.mapNotNull { call -> + (call as? KtSimpleFunctionCall) + ?.takeIf { it.isImplicitInvoke } + ?.boundSymbol + ?.symbol + ?.takeUnless { it is KtFunctionSymbol && it.isBuiltinFunctionInvoke } } - return emptyList() } } \ No newline at end of file diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFunctionSymbol.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFunctionSymbol.kt index dd838f3bb77..b7610c1e666 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFunctionSymbol.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/symbols/KtFirFunctionSymbol.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.KtFirTopLevelFunct import org.jetbrains.kotlin.analysis.api.fir.symbols.pointers.createSignature import org.jetbrains.kotlin.analysis.api.fir.utils.cached import org.jetbrains.kotlin.analysis.api.fir.utils.firRef +import org.jetbrains.kotlin.analysis.api.impl.base.util.kotlinFunctionInvokeCallableIds import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind @@ -70,6 +71,9 @@ internal class KtFirFunctionSymbol( override val isInfix: Boolean get() = firRef.withFir { it.isInfix } override val isStatic: Boolean get() = firRef.withFir { it.isStatic } + override val isBuiltinFunctionInvoke: Boolean + get() = callableIdIfNonLocal in kotlinFunctionInvokeCallableIds + override val receiverType: KtType? by cached { firRef.receiverType(builder) } diff --git a/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/util/functionUtils.kt b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/util/functionUtils.kt new file mode 100644 index 00000000000..4183a1c04b6 --- /dev/null +++ b/analysis/analysis-api-impl-base/src/org/jetbrains/kotlin/analysis/api/impl/base/util/functionUtils.kt @@ -0,0 +1,17 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.impl.base.util + +import org.jetbrains.kotlin.builtins.StandardNames +import org.jetbrains.kotlin.name.CallableId +import org.jetbrains.kotlin.util.OperatorNameConventions + +val kotlinFunctionInvokeCallableIds = (0..23).flatMapTo(hashSetOf()) { arity -> + listOf( + CallableId(StandardNames.getFunctionClassId(arity), OperatorNameConventions.INVOKE), + CallableId(StandardNames.getSuspendFunctionClassId(arity), OperatorNameConventions.INVOKE) + ) +} diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/calls/ktCallUtils.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/calls/ktCallUtils.kt deleted file mode 100644 index 0b1824a4568..00000000000 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/calls/ktCallUtils.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. - * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. - */ - -package org.jetbrains.kotlin.analysis.api.calls - -import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol - -public fun KtCallTarget.getSuccessCallSymbolOrNull(): KtFunctionLikeSymbol? = when (this) { - is KtSuccessCallTarget -> symbol - is KtErrorCallTarget -> null -} - -public fun KtCallTarget.getSingleCandidateSymbolOrNull(): KtFunctionLikeSymbol? = when (this) { - is KtSuccessCallTarget -> symbol - is KtErrorCallTarget -> candidates.singleOrNull() -} - -public inline fun KtCall.isSuccessCallOf(predicate: (S) -> Boolean): Boolean { - if (this !is KtSimpleFunctionCall) return false - val symbol = targetFunction.getSuccessCallSymbolOrNull() ?: return false - if (symbol !is S) return false - return predicate(symbol) -} \ No newline at end of file diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtFunctionLikeSymbol.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtFunctionLikeSymbol.kt index 64d88da6144..e4f591442f0 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtFunctionLikeSymbol.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/symbols/KtFunctionLikeSymbol.kt @@ -53,6 +53,11 @@ public abstract class KtFunctionSymbol : KtFunctionLikeSymbol(), public abstract val isInfix: Boolean public abstract val isStatic: Boolean + /** + * Whether this symbol is the `invoke` method defined on the Kotlin builtin functional type. + */ + public abstract val isBuiltinFunctionInvoke: Boolean + abstract override fun createPointer(): KtSymbolPointer } diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/anonymousObject.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/anonymousObject.descriptors.txt index 0cdda088ae6..87ce6bc45d3 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/anonymousObject.descriptors.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/anonymousObject.descriptors.txt @@ -2,6 +2,7 @@ KtFunctionSymbol: annotationsList: [] callableIdIfNonLocal: null hasStableParameterNames: true + isBuiltinFunctionInvoke: false isExtension: false isExternal: false isInfix: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/deprecated.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/deprecated.descriptors.txt index c60078ac3cb..c7d32082772 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/deprecated.descriptors.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/deprecated.descriptors.txt @@ -132,6 +132,7 @@ KtFunctionSymbol: ] callableIdIfNonLocal: /f hasStableParameterNames: true + isBuiltinFunctionInvoke: false isExtension: false isExternal: false isInfix: false @@ -217,6 +218,7 @@ KtFunctionSymbol: ] callableIdIfNonLocal: /Foo.f2 hasStableParameterNames: true + isBuiltinFunctionInvoke: false isExtension: false isExternal: false isInfix: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/outerAndInnerClasses.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/outerAndInnerClasses.descriptors.txt index 3bc4de25db8..6a90be3c33c 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/outerAndInnerClasses.descriptors.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/outerAndInnerClasses.descriptors.txt @@ -187,6 +187,7 @@ KtFunctionSymbol: annotationsList: [] callableIdIfNonLocal: /X.foo hasStableParameterNames: true + isBuiltinFunctionInvoke: false isExtension: false isExternal: false isInfix: false diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt index eefea859e5f..6a38abda37d 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/typeAnnotations.descriptors.txt @@ -135,6 +135,7 @@ KtFunctionSymbol: annotationsList: [] callableIdIfNonLocal: /X.f hasStableParameterNames: true + isBuiltinFunctionInvoke: false isExtension: false isExternal: false isInfix: false diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/genericFromOuterClassInInnerClass.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByReference/genericFromOuterClassInInnerClass.descriptors.txt index 472d06ae238..a8853a6ea96 100644 --- a/analysis/analysis-api/testData/symbols/symbolByReference/genericFromOuterClassInInnerClass.descriptors.txt +++ b/analysis/analysis-api/testData/symbols/symbolByReference/genericFromOuterClassInInnerClass.descriptors.txt @@ -2,6 +2,7 @@ KtFunctionSymbol: annotationsList: [] callableIdIfNonLocal: test/TopLevel.Child.withOuter hasStableParameterNames: true + isBuiltinFunctionInvoke: false isExtension: false isExternal: false isInfix: false