[FIR] Extract jvm-only call conflict resolver

This commit is contained in:
Simon Ogorodnik
2019-12-18 15:11:58 +03:00
committed by Mikhail Glukhikh
parent 05308a3652
commit a3d531e8b4
8 changed files with 59 additions and 12 deletions
@@ -10,10 +10,15 @@ import com.intellij.openapi.project.Project
import com.intellij.psi.PsiElementFinder
import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.analyzer.ModuleInfo
import org.jetbrains.kotlin.fir.*
import org.jetbrains.kotlin.fir.FirModuleBasedSession
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSessionBase
import org.jetbrains.kotlin.fir.FirSessionProvider
import org.jetbrains.kotlin.fir.java.deserialization.KotlinDeserializedJvmSymbolsProvider
import org.jetbrains.kotlin.fir.resolve.FirProvider
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.calls.ConeCallConflictResolverFactory
import org.jetbrains.kotlin.fir.resolve.calls.jvm.JvmCallConflictResolverFactory
import org.jetbrains.kotlin.fir.resolve.impl.FirCompositeSymbolProvider
import org.jetbrains.kotlin.fir.resolve.impl.FirDependenciesSymbolProviderImpl
import org.jetbrains.kotlin.fir.resolve.impl.FirLibrarySymbolProviderImpl
@@ -55,6 +60,11 @@ class FirJavaModuleBasedSession(
FirCorrespondingSupertypesCache(this)
)
registerComponent(
ConeCallConflictResolverFactory::class,
JvmCallConflictResolverFactory
)
Extensions.getArea(sessionProvider.project)
.getExtensionPoint(PsiElementFinder.EP_NAME)
.registerExtension(FirJavaElementFinder(this, sessionProvider.project))
@@ -0,0 +1,23 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.fir.resolve.calls.jvm
import org.jetbrains.kotlin.fir.resolve.calls.ConeCallConflictResolverFactory
import org.jetbrains.kotlin.fir.resolve.calls.ConeCompositeConflictResolver
import org.jetbrains.kotlin.fir.resolve.calls.ConeOverloadConflictResolver
import org.jetbrains.kotlin.fir.resolve.calls.InferenceComponents
import org.jetbrains.kotlin.resolve.calls.results.TypeSpecificityComparator
object JvmCallConflictResolverFactory : ConeCallConflictResolverFactory() {
override fun create(
typeSpecificityComparator: TypeSpecificityComparator,
components: InferenceComponents
) = ConeCompositeConflictResolver(
ConeOverloadConflictResolver(TypeSpecificityComparator.NONE, components),
ConeEquivalentCallConflictResolver(TypeSpecificityComparator.NONE, components)
)
}
@@ -20,7 +20,6 @@ import org.jetbrains.kotlin.fir.references.impl.FirResolvedNamedReferenceImpl
import org.jetbrains.kotlin.fir.references.impl.FirSimpleNamedReference
import org.jetbrains.kotlin.fir.resolve.*
import org.jetbrains.kotlin.fir.resolve.calls.*
import org.jetbrains.kotlin.fir.resolve.calls.jvm.ConeEquivalentCallConflictResolver
import org.jetbrains.kotlin.fir.resolve.diagnostics.FirAmbiguityError
import org.jetbrains.kotlin.fir.resolve.diagnostics.FirInapplicableCandidateError
import org.jetbrains.kotlin.fir.resolve.diagnostics.FirUnresolvedNameError
@@ -62,10 +61,9 @@ class FirCallResolver(
localScopes = localScopes.asReversed()
)
private val conflictResolver = ConeCompositeConflictResolver(
ConeOverloadConflictResolver(TypeSpecificityComparator.NONE, inferenceComponents),
ConeEquivalentCallConflictResolver(TypeSpecificityComparator.NONE, inferenceComponents)
)
private val conflictResolver =
inferenceComponents.session.callConflictResolverFactory
.create(TypeSpecificityComparator.NONE, inferenceComponents)
fun resolveCallAndSelectCandidate(functionCall: FirFunctionCall, file: FirFile): FirFunctionCall {
qualifiedResolver.reset()
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.fir.resolve.calls
import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.declarations.classId
import org.jetbrains.kotlin.fir.symbols.StandardClassIds
import org.jetbrains.kotlin.fir.types.*
import org.jetbrains.kotlin.resolve.calls.results.*
@@ -16,7 +15,7 @@ import org.jetbrains.kotlin.types.model.KotlinTypeMarker
abstract class AbstractConeCallConflictResolver(
private val specificityComparator: TypeSpecificityComparator,
protected val inferenceComponents: InferenceComponents
) : ConeCallConflictResolver {
) : ConeCallConflictResolver() {
protected fun Collection<Candidate>.setIfOneOrEmpty(): Set<Candidate>? = when (size) {
0 -> emptySet()
1 -> setOf(single())
@@ -5,14 +5,24 @@
package org.jetbrains.kotlin.fir.resolve.calls
interface ConeCallConflictResolver {
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.FirSessionComponent
import org.jetbrains.kotlin.fir.componentArrayAccessor
import org.jetbrains.kotlin.resolve.calls.results.TypeSpecificityComparator
abstract class ConeCallConflictResolver {
fun chooseMaximallySpecificCandidates(
candidates: Collection<Candidate>,
discriminateGenerics: Boolean
): Set<Candidate> = chooseMaximallySpecificCandidates(candidates.toSet(), discriminateGenerics)
fun chooseMaximallySpecificCandidates(
abstract fun chooseMaximallySpecificCandidates(
candidates: Set<Candidate>,
discriminateGenerics: Boolean
): Set<Candidate>
}
}
abstract class ConeCallConflictResolverFactory : FirSessionComponent {
abstract fun create(typeSpecificityComparator: TypeSpecificityComparator, components: InferenceComponents): ConeCallConflictResolver
}
val FirSession.callConflictResolverFactory by componentArrayAccessor<ConeCallConflictResolverFactory>()
@@ -7,7 +7,7 @@ package org.jetbrains.kotlin.fir.resolve.calls
class ConeCompositeConflictResolver(
private vararg val conflictResolvers: AbstractConeCallConflictResolver
) : ConeCallConflictResolver {
) : ConeCallConflictResolver() {
override fun chooseMaximallySpecificCandidates(candidates: Set<Candidate>, discriminateGenerics: Boolean): Set<Candidate> {
if (candidates.size <= 1) return candidates
var currentCandidates = candidates
@@ -13,6 +13,8 @@ import org.jetbrains.kotlin.fir.java.FirProjectSessionProvider
import org.jetbrains.kotlin.fir.java.JavaSymbolProvider
import org.jetbrains.kotlin.fir.resolve.FirProvider
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
import org.jetbrains.kotlin.fir.resolve.calls.ConeCallConflictResolverFactory
import org.jetbrains.kotlin.fir.resolve.calls.jvm.JvmCallConflictResolverFactory
import org.jetbrains.kotlin.fir.resolve.firProvider
import org.jetbrains.kotlin.fir.resolve.impl.FirCompositeSymbolProvider
import org.jetbrains.kotlin.fir.types.FirCorrespondingSupertypesCache
@@ -46,5 +48,10 @@ class FirIdeJavaModuleBasedSession(
FirCorrespondingSupertypesCache::class,
FirCorrespondingSupertypesCache(this)
)
registerComponent(
ConeCallConflictResolverFactory::class,
JvmCallConflictResolverFactory
)
}
}