[FIR] Extract jvm-only call conflict resolver
This commit is contained in:
committed by
Mikhail Glukhikh
parent
05308a3652
commit
a3d531e8b4
@@ -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))
|
||||
|
||||
+23
@@ -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()
|
||||
|
||||
+1
-2
@@ -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())
|
||||
|
||||
+13
-3
@@ -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>()
|
||||
+1
-1
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user