Extend CandidateInterceptor to intercept ResolvedCallAtom candidate
This commit is contained in:
committed by
teamcityserver
parent
99688e5c80
commit
78ee6b2a09
+15
@@ -6,16 +6,21 @@
|
|||||||
package org.jetbrains.kotlin.extensions.internal
|
package org.jetbrains.kotlin.extensions.internal
|
||||||
|
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
|
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
||||||
import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
|
import org.jetbrains.kotlin.extensions.ProjectExtensionDescriptor
|
||||||
import org.jetbrains.kotlin.incremental.components.LookupLocation
|
import org.jetbrains.kotlin.incremental.components.LookupLocation
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
import org.jetbrains.kotlin.resolve.BindingTrace
|
||||||
import org.jetbrains.kotlin.resolve.calls.CallResolver
|
import org.jetbrains.kotlin.resolve.calls.CallResolver
|
||||||
import org.jetbrains.kotlin.resolve.calls.CandidateResolver
|
import org.jetbrains.kotlin.resolve.calls.CandidateResolver
|
||||||
import org.jetbrains.kotlin.resolve.calls.KotlinCallResolver
|
import org.jetbrains.kotlin.resolve.calls.KotlinCallResolver
|
||||||
import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext
|
import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstitutor
|
||||||
import org.jetbrains.kotlin.resolve.calls.model.CallResolutionResult
|
import org.jetbrains.kotlin.resolve.calls.model.CallResolutionResult
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.model.KotlinCallDiagnostic
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCallAtom
|
||||||
import org.jetbrains.kotlin.resolve.calls.tasks.TracingStrategy
|
import org.jetbrains.kotlin.resolve.calls.tasks.TracingStrategy
|
||||||
import org.jetbrains.kotlin.resolve.calls.tower.ImplicitScopeTower
|
import org.jetbrains.kotlin.resolve.calls.tower.ImplicitScopeTower
|
||||||
import org.jetbrains.kotlin.resolve.calls.tower.NewResolutionOldInference
|
import org.jetbrains.kotlin.resolve.calls.tower.NewResolutionOldInference
|
||||||
@@ -27,6 +32,16 @@ import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValueWithSmartCastI
|
|||||||
class CandidateInterceptor(project: Project) {
|
class CandidateInterceptor(project: Project) {
|
||||||
private val extensions = getInstances(project)
|
private val extensions = getInstances(project)
|
||||||
|
|
||||||
|
fun interceptResolvedCallAtomCandidate(
|
||||||
|
candidateDescriptor: CallableDescriptor,
|
||||||
|
completedCallAtom: ResolvedCallAtom,
|
||||||
|
trace: BindingTrace?,
|
||||||
|
resultSubstitutor: NewTypeSubstitutor?,
|
||||||
|
diagnostics: Collection<KotlinCallDiagnostic>
|
||||||
|
): CallableDescriptor = extensions.fold(candidateDescriptor) { it, extension ->
|
||||||
|
extension.interceptResolvedCallAtomCandidate(it, completedCallAtom, trace, resultSubstitutor, diagnostics)
|
||||||
|
}
|
||||||
|
|
||||||
fun interceptResolvedCandidates(
|
fun interceptResolvedCandidates(
|
||||||
candidates: Collection<NewResolutionOldInference.MyCandidate>,
|
candidates: Collection<NewResolutionOldInference.MyCandidate>,
|
||||||
context: BasicCallResolutionContext,
|
context: BasicCallResolutionContext,
|
||||||
|
|||||||
+15
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.extensions.internal
|
package org.jetbrains.kotlin.extensions.internal
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
import org.jetbrains.kotlin.descriptors.VariableDescriptor
|
||||||
import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor
|
import org.jetbrains.kotlin.descriptors.impl.AnonymousFunctionDescriptor
|
||||||
@@ -12,9 +13,13 @@ import org.jetbrains.kotlin.incremental.components.LookupLocation
|
|||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi.KtElement
|
import org.jetbrains.kotlin.psi.KtElement
|
||||||
import org.jetbrains.kotlin.psi.KtLambdaExpression
|
import org.jetbrains.kotlin.psi.KtLambdaExpression
|
||||||
|
import org.jetbrains.kotlin.resolve.BindingTrace
|
||||||
import org.jetbrains.kotlin.resolve.calls.CallResolver
|
import org.jetbrains.kotlin.resolve.calls.CallResolver
|
||||||
import org.jetbrains.kotlin.resolve.calls.CandidateResolver
|
import org.jetbrains.kotlin.resolve.calls.CandidateResolver
|
||||||
import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext
|
import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.inference.components.NewTypeSubstitutor
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.model.KotlinCallDiagnostic
|
||||||
|
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCallAtom
|
||||||
import org.jetbrains.kotlin.resolve.calls.tasks.TracingStrategy
|
import org.jetbrains.kotlin.resolve.calls.tasks.TracingStrategy
|
||||||
import org.jetbrains.kotlin.resolve.calls.tower.ImplicitScopeTower
|
import org.jetbrains.kotlin.resolve.calls.tower.ImplicitScopeTower
|
||||||
import org.jetbrains.kotlin.resolve.calls.tower.NewResolutionOldInference
|
import org.jetbrains.kotlin.resolve.calls.tower.NewResolutionOldInference
|
||||||
@@ -52,6 +57,16 @@ interface TypeResolutionInterceptorExtension {
|
|||||||
|
|
||||||
@InternalNonStableExtensionPoints
|
@InternalNonStableExtensionPoints
|
||||||
interface CallResolutionInterceptorExtension {
|
interface CallResolutionInterceptorExtension {
|
||||||
|
@Suppress("DEPRECATION")
|
||||||
|
@JvmDefault
|
||||||
|
fun interceptResolvedCallAtomCandidate(
|
||||||
|
candidateDescriptor: CallableDescriptor,
|
||||||
|
completedCallAtom: ResolvedCallAtom,
|
||||||
|
trace: BindingTrace?,
|
||||||
|
resultSubstitutor: NewTypeSubstitutor?,
|
||||||
|
diagnostics: Collection<KotlinCallDiagnostic>
|
||||||
|
): CallableDescriptor = candidateDescriptor
|
||||||
|
|
||||||
@Suppress("DEPRECATION")
|
@Suppress("DEPRECATION")
|
||||||
@JvmDefault
|
@JvmDefault
|
||||||
fun interceptCandidates(
|
fun interceptCandidates(
|
||||||
|
|||||||
+12
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns
|
|||||||
import org.jetbrains.kotlin.descriptors.*
|
import org.jetbrains.kotlin.descriptors.*
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
import org.jetbrains.kotlin.descriptors.annotations.Annotations
|
||||||
import org.jetbrains.kotlin.diagnostics.Errors
|
import org.jetbrains.kotlin.diagnostics.Errors
|
||||||
|
import org.jetbrains.kotlin.extensions.internal.CandidateInterceptor
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.resolve.*
|
import org.jetbrains.kotlin.resolve.*
|
||||||
import org.jetbrains.kotlin.resolve.calls.ArgumentTypeResolver
|
import org.jetbrains.kotlin.resolve.calls.ArgumentTypeResolver
|
||||||
@@ -60,6 +61,7 @@ class KotlinToResolvedCallTransformer(
|
|||||||
private val smartCastManager: SmartCastManager,
|
private val smartCastManager: SmartCastManager,
|
||||||
private val typeApproximator: TypeApproximator,
|
private val typeApproximator: TypeApproximator,
|
||||||
private val missingSupertypesResolver: MissingSupertypesResolver,
|
private val missingSupertypesResolver: MissingSupertypesResolver,
|
||||||
|
private val candidateInterceptor: CandidateInterceptor,
|
||||||
) {
|
) {
|
||||||
companion object {
|
companion object {
|
||||||
private val REPORT_MISSING_NEW_INFERENCE_DIAGNOSTIC
|
private val REPORT_MISSING_NEW_INFERENCE_DIAGNOSTIC
|
||||||
@@ -182,6 +184,16 @@ class KotlinToResolvedCallTransformer(
|
|||||||
): NewAbstractResolvedCall<D> {
|
): NewAbstractResolvedCall<D> {
|
||||||
val psiKotlinCall = completedCallAtom.atom.psiKotlinCall
|
val psiKotlinCall = completedCallAtom.atom.psiKotlinCall
|
||||||
|
|
||||||
|
completedCallAtom.setCandidateDescriptor(
|
||||||
|
candidateInterceptor.interceptResolvedCallAtomCandidate(
|
||||||
|
completedCallAtom.candidateDescriptor,
|
||||||
|
completedCallAtom,
|
||||||
|
trace,
|
||||||
|
resultSubstitutor,
|
||||||
|
diagnostics
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
return if (psiKotlinCall is PSIKotlinCallForInvoke) {
|
return if (psiKotlinCall is PSIKotlinCallForInvoke) {
|
||||||
val diagnosticsForVariableCall = if (completedCallAtom.candidateDescriptor is FunctionDescriptor) emptyList() else diagnostics
|
val diagnosticsForVariableCall = if (completedCallAtom.candidateDescriptor is FunctionDescriptor) emptyList() else diagnostics
|
||||||
val diagnosticsForFunctionCall = if (completedCallAtom.candidateDescriptor is FunctionDescriptor) diagnostics else emptyList()
|
val diagnosticsForFunctionCall = if (completedCallAtom.candidateDescriptor is FunctionDescriptor) diagnostics else emptyList()
|
||||||
|
|||||||
@@ -84,6 +84,7 @@ abstract class ResolvedCallAtom : ResolvedAtom() {
|
|||||||
abstract val argumentsWithSuspendConversion: Map<KotlinCallArgument, UnwrappedType>
|
abstract val argumentsWithSuspendConversion: Map<KotlinCallArgument, UnwrappedType>
|
||||||
abstract val argumentsWithUnitConversion: Map<KotlinCallArgument, UnwrappedType>
|
abstract val argumentsWithUnitConversion: Map<KotlinCallArgument, UnwrappedType>
|
||||||
abstract val argumentsWithConstantConversion: Map<KotlinCallArgument, IntegerValueTypeConstant>
|
abstract val argumentsWithConstantConversion: Map<KotlinCallArgument, IntegerValueTypeConstant>
|
||||||
|
abstract fun setCandidateDescriptor(newCandidateDescriptor: CallableDescriptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
class SamConversionDescription(
|
class SamConversionDescription(
|
||||||
|
|||||||
+10
-1
@@ -78,7 +78,7 @@ class ResolvedCallableReferenceCallAtom(
|
|||||||
|
|
||||||
open class MutableResolvedCallAtom(
|
open class MutableResolvedCallAtom(
|
||||||
override val atom: KotlinCall,
|
override val atom: KotlinCall,
|
||||||
override val candidateDescriptor: CallableDescriptor, // original candidate descriptor
|
originalCandidateDescriptor: CallableDescriptor, // original candidate descriptor
|
||||||
override val explicitReceiverKind: ExplicitReceiverKind,
|
override val explicitReceiverKind: ExplicitReceiverKind,
|
||||||
override val dispatchReceiverArgument: SimpleKotlinCallArgument?,
|
override val dispatchReceiverArgument: SimpleKotlinCallArgument?,
|
||||||
override val extensionReceiverArgument: SimpleKotlinCallArgument?,
|
override val extensionReceiverArgument: SimpleKotlinCallArgument?,
|
||||||
@@ -94,6 +94,10 @@ open class MutableResolvedCallAtom(
|
|||||||
private var suspendAdapterMap: HashMap<KotlinCallArgument, UnwrappedType>? = null
|
private var suspendAdapterMap: HashMap<KotlinCallArgument, UnwrappedType>? = null
|
||||||
private var unitAdapterMap: HashMap<KotlinCallArgument, UnwrappedType>? = null
|
private var unitAdapterMap: HashMap<KotlinCallArgument, UnwrappedType>? = null
|
||||||
private var signedUnsignedConstantConversions: HashMap<KotlinCallArgument, IntegerValueTypeConstant>? = null
|
private var signedUnsignedConstantConversions: HashMap<KotlinCallArgument, IntegerValueTypeConstant>? = null
|
||||||
|
private var _candidateDescriptor = originalCandidateDescriptor
|
||||||
|
|
||||||
|
override val candidateDescriptor: CallableDescriptor
|
||||||
|
get() = _candidateDescriptor
|
||||||
|
|
||||||
val hasSamConversion: Boolean
|
val hasSamConversion: Boolean
|
||||||
get() = samAdapterMap != null
|
get() = samAdapterMap != null
|
||||||
@@ -146,6 +150,11 @@ open class MutableResolvedCallAtom(
|
|||||||
super.setAnalyzedResults(subResolvedAtoms)
|
super.setAnalyzedResults(subResolvedAtoms)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun setCandidateDescriptor(newCandidateDescriptor: CallableDescriptor) {
|
||||||
|
if (newCandidateDescriptor == candidateDescriptor) return
|
||||||
|
_candidateDescriptor = newCandidateDescriptor
|
||||||
|
}
|
||||||
|
|
||||||
override fun toString(): String = "$atom, candidate = $candidateDescriptor"
|
override fun toString(): String = "$atom, candidate = $candidateDescriptor"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user