Provide candidate interceptor for NI infrastructure

This commit is contained in:
Mikhail Zarechenskiy
2020-02-17 17:05:21 +03:00
parent 4693d595b7
commit d921dd0eed
3 changed files with 36 additions and 1 deletions
@@ -12,7 +12,9 @@ import org.jetbrains.kotlin.incremental.components.LookupLocation
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.calls.CallResolver
import org.jetbrains.kotlin.resolve.calls.CandidateResolver
import org.jetbrains.kotlin.resolve.calls.KotlinCallResolver
import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext
import org.jetbrains.kotlin.resolve.calls.model.CallResolutionResult
import org.jetbrains.kotlin.resolve.calls.tasks.TracingStrategy
import org.jetbrains.kotlin.resolve.calls.tower.ImplicitScopeTower
import org.jetbrains.kotlin.resolve.calls.tower.NewResolutionOldInference
@@ -30,10 +32,28 @@ class CandidateInterceptor(project: Project) {
name: Name,
kind: NewResolutionOldInference.ResolutionKind,
tracing: TracingStrategy
) = extensions.fold(candidates) { it, extension ->
): Collection<NewResolutionOldInference.MyCandidate> = extensions.fold(candidates) { it, extension ->
extension.interceptCandidates(it, context, candidateResolver, callResolver, name, kind, tracing)
}
fun interceptResolvedCandidates(
callResolutionResult: CallResolutionResult,
context: BasicCallResolutionContext,
callResolver: KotlinCallResolver,
name: Name,
kind: NewResolutionOldInference.ResolutionKind,
tracing: TracingStrategy
): CallResolutionResult {
var resolutionResult = callResolutionResult
for (extension in extensions) {
resolutionResult = extension.interceptCandidates(
resolutionResult, context, callResolver, name, kind, tracing
)
}
return resolutionResult
}
fun interceptCandidates(
candidates: Collection<FunctionDescriptor>,
scopeTower: ImplicitScopeTower,
@@ -13,7 +13,9 @@ import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtLambdaExpression
import org.jetbrains.kotlin.resolve.calls.CallResolver
import org.jetbrains.kotlin.resolve.calls.CandidateResolver
import org.jetbrains.kotlin.resolve.calls.KotlinCallResolver
import org.jetbrains.kotlin.resolve.calls.context.BasicCallResolutionContext
import org.jetbrains.kotlin.resolve.calls.model.CallResolutionResult
import org.jetbrains.kotlin.resolve.calls.tasks.TracingStrategy
import org.jetbrains.kotlin.resolve.calls.tower.ImplicitScopeTower
import org.jetbrains.kotlin.resolve.calls.tower.NewResolutionOldInference
@@ -58,6 +60,15 @@ interface CallResolutionInterceptorExtension {
tracing: TracingStrategy
): Collection<NewResolutionOldInference.MyCandidate> = candidates
fun interceptCandidates(
callResolutionResult: CallResolutionResult,
context: BasicCallResolutionContext,
callResolver: KotlinCallResolver,
name: Name,
kind: NewResolutionOldInference.ResolutionKind,
tracing: TracingStrategy
): CallResolutionResult = callResolutionResult
fun interceptCandidates(
candidates: Collection<FunctionDescriptor>,
scopeTower: ImplicitScopeTower,
@@ -109,6 +109,10 @@ class PSICallResolver(
return OverloadResolutionResultsImpl.nameNotFound()
}
result = candidateInterceptor.interceptResolvedCandidates(
result, context, kotlinCallResolver, name, resolutionKind, tracingStrategy
)
val overloadResolutionResults = convertToOverloadResolutionResults<D>(context, result, tracingStrategy)
return overloadResolutionResults.also {
clearCacheForApproximationResults()