[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
                 )
             }