[FE 1.0 ANALYSIS API] Return filtering out candidates to `KtFe10CallResolver`
It uses `NewOverloadingConflictResolver` now
diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/CliFe10AnalysisFacade.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/CliFe10AnalysisFacade.kt
index 38367c3..fc2512c 100644
--- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/CliFe10AnalysisFacade.kt
+++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/CliFe10AnalysisFacade.kt
@@ -10,6 +10,8 @@
import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
import org.jetbrains.kotlin.analyzer.AnalysisResult
+import org.jetbrains.kotlin.builtins.KotlinBuiltIns
+import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.container.ComponentProvider
import org.jetbrains.kotlin.container.get
import org.jetbrains.kotlin.context.ProjectContext
@@ -19,11 +21,25 @@
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.BindingTrace
import org.jetbrains.kotlin.resolve.calls.CallResolver
+import org.jetbrains.kotlin.resolve.calls.components.KotlinResolutionStatelessCallbacks
+import org.jetbrains.kotlin.resolve.calls.components.NewOverloadingConflictResolver
+import org.jetbrains.kotlin.resolve.calls.components.candidate.ResolutionCandidate
+import org.jetbrains.kotlin.resolve.calls.inference.components.ClassicConstraintSystemUtilContext
+import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintIncorporator
+import org.jetbrains.kotlin.resolve.calls.inference.components.ConstraintInjector
+import org.jetbrains.kotlin.resolve.calls.inference.components.TrivialConstraintTypeInferenceOracle
+import org.jetbrains.kotlin.resolve.calls.results.OverloadingConflictResolver
+import org.jetbrains.kotlin.resolve.calls.results.PlatformOverloadsSpecificityComparator
+import org.jetbrains.kotlin.resolve.calls.results.TypeSpecificityComparator
+import org.jetbrains.kotlin.resolve.calls.tower.KotlinResolutionStatelessCallbacksImpl
import org.jetbrains.kotlin.resolve.calls.tower.KotlinToResolvedCallTransformer
import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver
import org.jetbrains.kotlin.resolve.extensions.AnalysisHandlerExtension
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
+import org.jetbrains.kotlin.types.TypeApproximator
import org.jetbrains.kotlin.types.checker.KotlinTypeRefiner
+import org.jetbrains.kotlin.types.checker.SimpleClassicTypeSystemContext
+import org.jetbrains.kotlin.util.CancellationChecker
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
class CliFe10AnalysisFacade(project: Project) : Fe10AnalysisFacade {
@@ -45,6 +61,10 @@
return handler.kotlinToResolvedCallTransformer ?: error("Resolution is not performed")
}
+ override fun getOverloadingConflictResolver(element: KtElement): OverloadingConflictResolver<ResolutionCandidate> {
+ return handler.overloadingConflictResolver ?: error("Resolution is not performed")
+ }
+
override fun getKotlinTypeRefiner(element: KtElement): KotlinTypeRefiner {
return handler.kotlinTypeRefiner ?: error("Resolution is not performed")
}
@@ -78,6 +98,9 @@
var kotlinToResolvedCallTransformer: KotlinToResolvedCallTransformer? = null
private set
+ var overloadingConflictResolver: OverloadingConflictResolver<ResolutionCandidate>? = null
+ private set
+
var kotlinTypeRefiner: KotlinTypeRefiner? = null
private set
@@ -95,6 +118,18 @@
kotlinToResolvedCallTransformer = componentProvider.get()
kotlinTypeRefiner = componentProvider.get()
+ val builtIns = resolveSession!!.moduleDescriptor.builtIns
+ val specificityComparator = componentProvider.get<TypeSpecificityComparator>()
+ val platformOverloadsSpecificityComparator = componentProvider.get<PlatformOverloadsSpecificityComparator>()
+ val cancellationChecker = componentProvider.get<CancellationChecker>()
+ val constraintInjector = componentProvider.get<ConstraintInjector>()
+ val resolutionCallbacks = componentProvider.get<KotlinResolutionStatelessCallbacksImpl>()
+
+ overloadingConflictResolver = NewOverloadingConflictResolver(
+ builtIns, module, specificityComparator, platformOverloadsSpecificityComparator,
+ cancellationChecker, resolutionCallbacks, constraintInjector, kotlinTypeRefiner!!
+ )
+
return super.doAnalysis(project, module, projectContext, files, bindingTrace, componentProvider)
}
-}
\ No newline at end of file
+}
diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/Fe10AnalysisFacade.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/Fe10AnalysisFacade.kt
index 8c32b08..b795d02 100644
--- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/Fe10AnalysisFacade.kt
+++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/Fe10AnalysisFacade.kt
@@ -15,6 +15,8 @@
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.calls.CallResolver
+import org.jetbrains.kotlin.resolve.calls.components.candidate.ResolutionCandidate
+import org.jetbrains.kotlin.resolve.calls.results.OverloadingConflictResolver
import org.jetbrains.kotlin.resolve.calls.tower.KotlinToResolvedCallTransformer
import org.jetbrains.kotlin.resolve.deprecation.DeprecationResolver
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
@@ -31,6 +33,7 @@
fun getDeprecationResolver(element: KtElement): DeprecationResolver
fun getCallResolver(element: KtElement): CallResolver
fun getKotlinToResolvedCallTransformer(element: KtElement): KotlinToResolvedCallTransformer
+ fun getOverloadingConflictResolver(element: KtElement): OverloadingConflictResolver<ResolutionCandidate>
fun getKotlinTypeRefiner(element: KtElement): KotlinTypeRefiner
fun analyze(element: KtElement, mode: AnalysisMode = AnalysisMode.FULL): BindingContext
@@ -53,6 +56,7 @@
val deprecationResolver: DeprecationResolver = getDeprecationResolver(contextElement)
val callResolver: CallResolver = getCallResolver(contextElement)
val kotlinToResolvedCallTransformer: KotlinToResolvedCallTransformer = getKotlinToResolvedCallTransformer(contextElement)
+ val overloadingConflictResolver: OverloadingConflictResolver<ResolutionCandidate> = getOverloadingConflictResolver(contextElement)
val kotlinTypeRefiner: KotlinTypeRefiner = getKotlinTypeRefiner(contextElement)
val builtIns: KotlinBuiltIns
diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10CallResolver.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10CallResolver.kt
index 1eaad2c..2800d96 100644
--- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10CallResolver.kt
+++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10CallResolver.kt
@@ -58,13 +58,7 @@
import org.jetbrains.kotlin.resolve.scopes.receivers.ExtensionReceiver
import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
-import org.jetbrains.kotlin.types.KotlinType
-import org.jetbrains.kotlin.types.TypeUtils
-import org.jetbrains.kotlin.types.UnwrappedType
-import org.jetbrains.kotlin.types.asSimpleType
-import org.jetbrains.kotlin.types.checker.SimpleClassicTypeSystemContext.contains
-import org.jetbrains.kotlin.types.checker.SimpleClassicTypeSystemContext.isTypeVariable
-import org.jetbrains.kotlin.types.checker.SimpleClassicTypeSystemContext.typeConstructor
+import org.jetbrains.kotlin.types.*
import org.jetbrains.kotlin.types.expressions.OperatorConventions
import org.jetbrains.kotlin.types.typeUtil.contains
import org.jetbrains.kotlin.util.OperatorNameConventions
@@ -215,7 +209,11 @@
).replaceCollectAllCandidates(true)
val result = analysisContext.callResolver.resolveFunctionCall(callResolutionContext)
- val candidates = result.allCandidates ?: error("allCandidates is null even when collectAllCandidates = true")
+ val candidates = result.allCandidates?.let { candidatesAndResolvedCalls ->
+ val filteredCandidates =
+ analysisContext.overloadingConflictResolver.filterOutEquivalentCalls(candidatesAndResolvedCalls.keys)
+ candidatesAndResolvedCalls.filterKeys { it in filteredCandidates }.values
+ } ?: error("allCandidates is null even when collectAllCandidates = true")
candidates.flatMap { candidate ->
// The current BindingContext does not have the diagnostics for each individual candidate, only for the resolved call.
diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/NewOverloadResolutionResults.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/NewOverloadResolutionResults.kt
index 7ca8038..9740395 100644
--- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/NewOverloadResolutionResults.kt
+++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/NewOverloadResolutionResults.kt
@@ -17,8 +17,10 @@
package org.jetbrains.kotlin.resolve.calls.results
import org.jetbrains.kotlin.descriptors.CallableDescriptor
+import org.jetbrains.kotlin.resolve.calls.components.candidate.ResolutionCandidate
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
import org.jetbrains.kotlin.resolve.calls.results.OverloadResolutionResults.Code
+import org.jetbrains.kotlin.resolve.calls.tower.NewAbstractResolvedCall
abstract class AbstractOverloadResolutionResults<D : CallableDescriptor> : OverloadResolutionResults<D> {
override fun isSuccess() = resultCode.isSuccess
@@ -29,7 +31,7 @@
}
class SingleOverloadResolutionResult<D : CallableDescriptor>(val result: ResolvedCall<D>) : AbstractOverloadResolutionResults<D>() {
- override fun getAllCandidates(): Collection<ResolvedCall<D>>? = null
+ override fun getAllCandidates(): Map<ResolutionCandidate, NewAbstractResolvedCall<*>>? = null
override fun getResultingCalls(): Collection<ResolvedCall<D>> = listOf(result)
override fun getResultingCall() = result
@@ -44,7 +46,7 @@
}
open class NameNotFoundResolutionResult<D : CallableDescriptor> : AbstractOverloadResolutionResults<D>() {
- override fun getAllCandidates(): Collection<ResolvedCall<D>>? = null
+ override fun getAllCandidates(): Map<ResolutionCandidate, NewAbstractResolvedCall<*>>? = null
override fun getResultingCalls(): Collection<ResolvedCall<D>> = emptyList()
override fun getResultingCall() = error("No candidates")
override fun getResultingDescriptor() = error("No candidates")
@@ -54,7 +56,7 @@
class ManyCandidates<D : CallableDescriptor>(
val candidates: Collection<ResolvedCall<D>>
) : AbstractOverloadResolutionResults<D>() {
- override fun getAllCandidates(): Collection<ResolvedCall<D>>? = null
+ override fun getAllCandidates(): Map<ResolutionCandidate, NewAbstractResolvedCall<*>>? = null
override fun getResultingCalls(): Collection<ResolvedCall<D>> = candidates
override fun getResultingCall() = error("Many candidates")
override fun getResultingDescriptor() = error("Many candidates")
@@ -67,6 +69,7 @@
}
}
-class AllCandidates<D : CallableDescriptor>(private val allCandidates: Collection<ResolvedCall<D>>) : NameNotFoundResolutionResult<D>() {
- override fun getAllCandidates() = allCandidates
+class AllCandidates<D : CallableDescriptor>(private val allCandidates: Map<ResolutionCandidate, NewAbstractResolvedCall<*>>) :
+ NameNotFoundResolutionResult<D>() {
+ override fun getAllCandidates(): Map<ResolutionCandidate, NewAbstractResolvedCall<*>> = allCandidates
}
diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/OverloadResolutionResults.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/OverloadResolutionResults.java
index ebcc5cb..315a660 100644
--- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/OverloadResolutionResults.java
+++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/OverloadResolutionResults.java
@@ -19,9 +19,12 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.descriptors.CallableDescriptor;
+import org.jetbrains.kotlin.resolve.calls.components.candidate.ResolutionCandidate;
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
+import org.jetbrains.kotlin.resolve.calls.tower.NewAbstractResolvedCall;
import java.util.Collection;
+import java.util.Map;
public interface OverloadResolutionResults<D extends CallableDescriptor> {
enum Code {
@@ -46,7 +49,7 @@
/* All candidates are collected only if ResolutionContext.collectAllCandidates is set to true */
@Nullable
- Collection<ResolvedCall<D>> getAllCandidates();
+ Map<ResolutionCandidate, NewAbstractResolvedCall<?>> getAllCandidates();
@NotNull
Collection<? extends ResolvedCall<D>> getResultingCalls();
diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/OverloadResolutionResultsImpl.java b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/OverloadResolutionResultsImpl.java
index bc6fb2d..a56e926 100644
--- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/OverloadResolutionResultsImpl.java
+++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/results/OverloadResolutionResultsImpl.java
@@ -20,16 +20,19 @@
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.descriptors.CallableDescriptor;
import org.jetbrains.kotlin.resolve.DelegatingBindingTrace;
+import org.jetbrains.kotlin.resolve.calls.components.candidate.ResolutionCandidate;
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall;
+import org.jetbrains.kotlin.resolve.calls.tower.NewAbstractResolvedCall;
import java.util.Collection;
import java.util.Collections;
+import java.util.Map;
public class OverloadResolutionResultsImpl<D extends CallableDescriptor> implements OverloadResolutionResults<D> {
public static <D extends CallableDescriptor> OverloadResolutionResultsImpl<D> nameNotFound() {
OverloadResolutionResultsImpl<D> results = new OverloadResolutionResultsImpl<>(
Code.NAME_NOT_FOUND, Collections.emptyList());
- results.setAllCandidates(Collections.emptyList());
+ results.setAllCandidates(Collections.emptyMap());
return results;
}
@@ -48,7 +51,7 @@
private final Collection<ResolvedCall<D>> results;
private final Code resultCode;
private DelegatingBindingTrace trace;
- private Collection<ResolvedCall<D>> allCandidates;
+ private Map<ResolutionCandidate, NewAbstractResolvedCall<?>> allCandidates;
private OverloadResolutionResultsImpl(@NotNull Code resultCode, @NotNull Collection<ResolvedCall<D>> results) {
this.results = results;
@@ -114,13 +117,13 @@
return this;
}
- public void setAllCandidates(@Nullable Collection<ResolvedCall<D>> allCandidates) {
+ public void setAllCandidates(@Nullable Map<ResolutionCandidate, NewAbstractResolvedCall<?>> allCandidates) {
this.allCandidates = allCandidates;
}
@Nullable
@Override
- public Collection<ResolvedCall<D>> getAllCandidates() {
+ public Map<ResolutionCandidate, NewAbstractResolvedCall<?>> getAllCandidates() {
return allCandidates;
}
}
diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt
index 5f85acf..120b7d3 100644
--- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt
+++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/calls/tower/PSICallResolver.kt
@@ -225,12 +225,12 @@
tracingStrategy: TracingStrategy
): OverloadResolutionResults<D> {
if (result is AllCandidatesResolutionResult) {
- val resolvedCalls = result.allCandidates.map { (candidate, diagnostics) ->
+ val resolvedCalls = result.allCandidates.associate { (candidate, diagnostics) ->
val system = candidate.getSystem()
val resultingSubstitutor =
system.asReadOnlyStorage().buildResultingSubstitutor(system as TypeSystemInferenceExtensionContext)
- kotlinToResolvedCallTransformer.transformToResolvedCall<D>(
+ candidate to kotlinToResolvedCallTransformer.transformToResolvedCall<D>(
candidate.resolvedCall, null, resultingSubstitutor, diagnostics
)
}