Provide candidate interceptor for NI infrastructure
This commit is contained in:
+21
-1
@@ -12,7 +12,9 @@ import org.jetbrains.kotlin.incremental.components.LookupLocation
|
|||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
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.context.BasicCallResolutionContext
|
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.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
|
||||||
@@ -30,10 +32,28 @@ class CandidateInterceptor(project: Project) {
|
|||||||
name: Name,
|
name: Name,
|
||||||
kind: NewResolutionOldInference.ResolutionKind,
|
kind: NewResolutionOldInference.ResolutionKind,
|
||||||
tracing: TracingStrategy
|
tracing: TracingStrategy
|
||||||
) = extensions.fold(candidates) { it, extension ->
|
): Collection<NewResolutionOldInference.MyCandidate> = extensions.fold(candidates) { it, extension ->
|
||||||
extension.interceptCandidates(it, context, candidateResolver, callResolver, name, kind, tracing)
|
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(
|
fun interceptCandidates(
|
||||||
candidates: Collection<FunctionDescriptor>,
|
candidates: Collection<FunctionDescriptor>,
|
||||||
scopeTower: ImplicitScopeTower,
|
scopeTower: ImplicitScopeTower,
|
||||||
|
|||||||
+11
@@ -13,7 +13,9 @@ import org.jetbrains.kotlin.psi.KtElement
|
|||||||
import org.jetbrains.kotlin.psi.KtLambdaExpression
|
import org.jetbrains.kotlin.psi.KtLambdaExpression
|
||||||
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.context.BasicCallResolutionContext
|
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.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
|
||||||
@@ -58,6 +60,15 @@ interface CallResolutionInterceptorExtension {
|
|||||||
tracing: TracingStrategy
|
tracing: TracingStrategy
|
||||||
): Collection<NewResolutionOldInference.MyCandidate> = candidates
|
): Collection<NewResolutionOldInference.MyCandidate> = candidates
|
||||||
|
|
||||||
|
fun interceptCandidates(
|
||||||
|
callResolutionResult: CallResolutionResult,
|
||||||
|
context: BasicCallResolutionContext,
|
||||||
|
callResolver: KotlinCallResolver,
|
||||||
|
name: Name,
|
||||||
|
kind: NewResolutionOldInference.ResolutionKind,
|
||||||
|
tracing: TracingStrategy
|
||||||
|
): CallResolutionResult = callResolutionResult
|
||||||
|
|
||||||
fun interceptCandidates(
|
fun interceptCandidates(
|
||||||
candidates: Collection<FunctionDescriptor>,
|
candidates: Collection<FunctionDescriptor>,
|
||||||
scopeTower: ImplicitScopeTower,
|
scopeTower: ImplicitScopeTower,
|
||||||
|
|||||||
@@ -109,6 +109,10 @@ class PSICallResolver(
|
|||||||
return OverloadResolutionResultsImpl.nameNotFound()
|
return OverloadResolutionResultsImpl.nameNotFound()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
result = candidateInterceptor.interceptResolvedCandidates(
|
||||||
|
result, context, kotlinCallResolver, name, resolutionKind, tracingStrategy
|
||||||
|
)
|
||||||
|
|
||||||
val overloadResolutionResults = convertToOverloadResolutionResults<D>(context, result, tracingStrategy)
|
val overloadResolutionResults = convertToOverloadResolutionResults<D>(context, result, tracingStrategy)
|
||||||
return overloadResolutionResults.also {
|
return overloadResolutionResults.also {
|
||||||
clearCacheForApproximationResults()
|
clearCacheForApproximationResults()
|
||||||
|
|||||||
Reference in New Issue
Block a user