Analysis API: adapt to KtCall data model change
Also add API to check if a `KtFunctionSymbol` is the invoke function on a Kotlin builtin functional type.
This commit is contained in:
committed by
Ilya Kirillov
parent
53b3893738
commit
c9f9ce99c1
+4
@@ -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.descriptorBased.base.*
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.pointers.KtFe10DescFunctionLikeSymbolPointer
|
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.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.KtFunctionSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
|
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||||
@@ -56,6 +57,9 @@ internal class KtFe10DescFunctionSymbol private constructor(
|
|||||||
override val isStatic: Boolean
|
override val isStatic: Boolean
|
||||||
get() = withValidityAssertion { descriptor is JavaCallableMemberDescriptor && DescriptorUtils.isStaticDeclaration(descriptor) }
|
get() = withValidityAssertion { descriptor is JavaCallableMemberDescriptor && DescriptorUtils.isStaticDeclaration(descriptor) }
|
||||||
|
|
||||||
|
override val isBuiltinFunctionInvoke: Boolean
|
||||||
|
get() = callableIdIfNonLocal in kotlinFunctionInvokeCallableIds
|
||||||
|
|
||||||
override val valueParameters: List<KtValueParameterSymbol>
|
override val valueParameters: List<KtValueParameterSymbol>
|
||||||
get() = withValidityAssertion { descriptor.valueParameters.map { KtFe10DescValueParameterSymbol(it, analysisContext) } }
|
get() = withValidityAssertion { descriptor.valueParameters.map { KtFe10DescValueParameterSymbol(it, analysisContext) } }
|
||||||
|
|
||||||
|
|||||||
+4
@@ -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.pointers.KtFe10NeverRestoringSymbolPointer
|
||||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.*
|
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.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.KtFunctionSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
|
import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||||
@@ -62,6 +63,9 @@ internal class KtFe10PsiFunctionSymbol(
|
|||||||
override val isStatic: Boolean
|
override val isStatic: Boolean
|
||||||
get() = withValidityAssertion { false }
|
get() = withValidityAssertion { false }
|
||||||
|
|
||||||
|
override val isBuiltinFunctionInvoke: Boolean
|
||||||
|
get() = callableIdIfNonLocal in kotlinFunctionInvokeCallableIds
|
||||||
|
|
||||||
override val valueParameters: List<KtValueParameterSymbol>
|
override val valueParameters: List<KtValueParameterSymbol>
|
||||||
get() = withValidityAssertion { psi.valueParameters.map { KtFe10PsiValueParameterSymbol(it, analysisContext) } }
|
get() = withValidityAssertion { psi.valueParameters.map { KtFe10PsiValueParameterSymbol(it, analysisContext) } }
|
||||||
|
|
||||||
|
|||||||
@@ -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.fullyExpandedClassId
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.annotations.mapAnnotationParameters
|
import org.jetbrains.kotlin.analysis.api.fir.annotations.mapAnnotationParameters
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.evaluate.FirAnnotationValueConverter
|
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.diagnostics.ConeDiagnostic
|
||||||
|
import org.jetbrains.kotlin.fir.expressions.FirAnnotation
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall
|
import org.jetbrains.kotlin.fir.expressions.FirImplicitInvokeCall
|
||||||
import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression
|
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.FirErrorNamedReference
|
||||||
import org.jetbrains.kotlin.fir.references.FirNamedReference
|
import org.jetbrains.kotlin.fir.references.FirNamedReference
|
||||||
import org.jetbrains.kotlin.fir.references.FirReference
|
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.resolve.diagnostics.*
|
||||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
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.psi.KtCallElement
|
||||||
import org.jetbrains.kotlin.util.OperatorNameConventions
|
import org.jetbrains.kotlin.util.OperatorNameConventions
|
||||||
|
|
||||||
|
|||||||
+8
-5
@@ -6,7 +6,8 @@
|
|||||||
package org.jetbrains.kotlin.idea.references
|
package org.jetbrains.kotlin.idea.references
|
||||||
|
|
||||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
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.analysis.api.symbols.KtSymbol
|
||||||
import org.jetbrains.kotlin.psi.KtCallExpression
|
import org.jetbrains.kotlin.psi.KtCallExpression
|
||||||
import org.jetbrains.kotlin.psi.KtExpression
|
import org.jetbrains.kotlin.psi.KtExpression
|
||||||
@@ -17,10 +18,12 @@ class KtFirInvokeFunctionReference(expression: KtCallExpression) : KtInvokeFunct
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun KtAnalysisSession.resolveToSymbols(): Collection<KtSymbol> {
|
override fun KtAnalysisSession.resolveToSymbols(): Collection<KtSymbol> {
|
||||||
val call = expression.resolveCall() ?: return emptyList()
|
return expression.resolveCall().calls.mapNotNull { call ->
|
||||||
if (call is KtVariableWithInvokeFunctionCall) {
|
(call as? KtSimpleFunctionCall)
|
||||||
return call.targetFunction.candidates
|
?.takeIf { it.isImplicitInvoke }
|
||||||
|
?.boundSymbol
|
||||||
|
?.symbol
|
||||||
|
?.takeUnless { it is KtFunctionSymbol && it.isBuiltinFunctionInvoke }
|
||||||
}
|
}
|
||||||
return emptyList()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+4
@@ -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.symbols.pointers.createSignature
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
import org.jetbrains.kotlin.analysis.api.fir.utils.cached
|
||||||
import org.jetbrains.kotlin.analysis.api.fir.utils.firRef
|
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.KtFunctionSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||||
import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind
|
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 isInfix: Boolean get() = firRef.withFir { it.isInfix }
|
||||||
override val isStatic: Boolean get() = firRef.withFir { it.isStatic }
|
override val isStatic: Boolean get() = firRef.withFir { it.isStatic }
|
||||||
|
|
||||||
|
override val isBuiltinFunctionInvoke: Boolean
|
||||||
|
get() = callableIdIfNonLocal in kotlinFunctionInvokeCallableIds
|
||||||
|
|
||||||
override val receiverType: KtType? by cached {
|
override val receiverType: KtType? by cached {
|
||||||
firRef.receiverType(builder)
|
firRef.receiverType(builder)
|
||||||
}
|
}
|
||||||
|
|||||||
+17
@@ -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)
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -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 <reified S : KtFunctionLikeSymbol> 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)
|
|
||||||
}
|
|
||||||
+5
@@ -53,6 +53,11 @@ public abstract class KtFunctionSymbol : KtFunctionLikeSymbol(),
|
|||||||
public abstract val isInfix: Boolean
|
public abstract val isInfix: Boolean
|
||||||
public abstract val isStatic: 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<KtFunctionSymbol>
|
abstract override fun createPointer(): KtSymbolPointer<KtFunctionSymbol>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
@@ -2,6 +2,7 @@ KtFunctionSymbol:
|
|||||||
annotationsList: []
|
annotationsList: []
|
||||||
callableIdIfNonLocal: null
|
callableIdIfNonLocal: null
|
||||||
hasStableParameterNames: true
|
hasStableParameterNames: true
|
||||||
|
isBuiltinFunctionInvoke: false
|
||||||
isExtension: false
|
isExtension: false
|
||||||
isExternal: false
|
isExternal: false
|
||||||
isInfix: false
|
isInfix: false
|
||||||
|
|||||||
@@ -132,6 +132,7 @@ KtFunctionSymbol:
|
|||||||
]
|
]
|
||||||
callableIdIfNonLocal: /f
|
callableIdIfNonLocal: /f
|
||||||
hasStableParameterNames: true
|
hasStableParameterNames: true
|
||||||
|
isBuiltinFunctionInvoke: false
|
||||||
isExtension: false
|
isExtension: false
|
||||||
isExternal: false
|
isExternal: false
|
||||||
isInfix: false
|
isInfix: false
|
||||||
@@ -217,6 +218,7 @@ KtFunctionSymbol:
|
|||||||
]
|
]
|
||||||
callableIdIfNonLocal: /Foo.f2
|
callableIdIfNonLocal: /Foo.f2
|
||||||
hasStableParameterNames: true
|
hasStableParameterNames: true
|
||||||
|
isBuiltinFunctionInvoke: false
|
||||||
isExtension: false
|
isExtension: false
|
||||||
isExternal: false
|
isExternal: false
|
||||||
isInfix: false
|
isInfix: false
|
||||||
|
|||||||
+1
@@ -187,6 +187,7 @@ KtFunctionSymbol:
|
|||||||
annotationsList: []
|
annotationsList: []
|
||||||
callableIdIfNonLocal: /X.foo
|
callableIdIfNonLocal: /X.foo
|
||||||
hasStableParameterNames: true
|
hasStableParameterNames: true
|
||||||
|
isBuiltinFunctionInvoke: false
|
||||||
isExtension: false
|
isExtension: false
|
||||||
isExternal: false
|
isExternal: false
|
||||||
isInfix: false
|
isInfix: false
|
||||||
|
|||||||
+1
@@ -135,6 +135,7 @@ KtFunctionSymbol:
|
|||||||
annotationsList: []
|
annotationsList: []
|
||||||
callableIdIfNonLocal: /X.f
|
callableIdIfNonLocal: /X.f
|
||||||
hasStableParameterNames: true
|
hasStableParameterNames: true
|
||||||
|
isBuiltinFunctionInvoke: false
|
||||||
isExtension: false
|
isExtension: false
|
||||||
isExternal: false
|
isExternal: false
|
||||||
isInfix: false
|
isInfix: false
|
||||||
|
|||||||
+1
@@ -2,6 +2,7 @@ KtFunctionSymbol:
|
|||||||
annotationsList: []
|
annotationsList: []
|
||||||
callableIdIfNonLocal: test/TopLevel.Child.withOuter
|
callableIdIfNonLocal: test/TopLevel.Child.withOuter
|
||||||
hasStableParameterNames: true
|
hasStableParameterNames: true
|
||||||
|
isBuiltinFunctionInvoke: false
|
||||||
isExtension: false
|
isExtension: false
|
||||||
isExternal: false
|
isExternal: false
|
||||||
isInfix: false
|
isInfix: false
|
||||||
|
|||||||
Reference in New Issue
Block a user