[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.PsiElementFinder
|
||||||
import com.intellij.psi.search.GlobalSearchScope
|
import com.intellij.psi.search.GlobalSearchScope
|
||||||
import org.jetbrains.kotlin.analyzer.ModuleInfo
|
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.java.deserialization.KotlinDeserializedJvmSymbolsProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.FirProvider
|
import org.jetbrains.kotlin.fir.resolve.FirProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
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.FirCompositeSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.impl.FirDependenciesSymbolProviderImpl
|
import org.jetbrains.kotlin.fir.resolve.impl.FirDependenciesSymbolProviderImpl
|
||||||
import org.jetbrains.kotlin.fir.resolve.impl.FirLibrarySymbolProviderImpl
|
import org.jetbrains.kotlin.fir.resolve.impl.FirLibrarySymbolProviderImpl
|
||||||
@@ -55,6 +60,11 @@ class FirJavaModuleBasedSession(
|
|||||||
FirCorrespondingSupertypesCache(this)
|
FirCorrespondingSupertypesCache(this)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
registerComponent(
|
||||||
|
ConeCallConflictResolverFactory::class,
|
||||||
|
JvmCallConflictResolverFactory
|
||||||
|
)
|
||||||
|
|
||||||
Extensions.getArea(sessionProvider.project)
|
Extensions.getArea(sessionProvider.project)
|
||||||
.getExtensionPoint(PsiElementFinder.EP_NAME)
|
.getExtensionPoint(PsiElementFinder.EP_NAME)
|
||||||
.registerExtension(FirJavaElementFinder(this, sessionProvider.project))
|
.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.references.impl.FirSimpleNamedReference
|
||||||
import org.jetbrains.kotlin.fir.resolve.*
|
import org.jetbrains.kotlin.fir.resolve.*
|
||||||
import org.jetbrains.kotlin.fir.resolve.calls.*
|
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.FirAmbiguityError
|
||||||
import org.jetbrains.kotlin.fir.resolve.diagnostics.FirInapplicableCandidateError
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.FirInapplicableCandidateError
|
||||||
import org.jetbrains.kotlin.fir.resolve.diagnostics.FirUnresolvedNameError
|
import org.jetbrains.kotlin.fir.resolve.diagnostics.FirUnresolvedNameError
|
||||||
@@ -62,10 +61,9 @@ class FirCallResolver(
|
|||||||
localScopes = localScopes.asReversed()
|
localScopes = localScopes.asReversed()
|
||||||
)
|
)
|
||||||
|
|
||||||
private val conflictResolver = ConeCompositeConflictResolver(
|
private val conflictResolver =
|
||||||
ConeOverloadConflictResolver(TypeSpecificityComparator.NONE, inferenceComponents),
|
inferenceComponents.session.callConflictResolverFactory
|
||||||
ConeEquivalentCallConflictResolver(TypeSpecificityComparator.NONE, inferenceComponents)
|
.create(TypeSpecificityComparator.NONE, inferenceComponents)
|
||||||
)
|
|
||||||
|
|
||||||
fun resolveCallAndSelectCandidate(functionCall: FirFunctionCall, file: FirFile): FirFunctionCall {
|
fun resolveCallAndSelectCandidate(functionCall: FirFunctionCall, file: FirFile): FirFunctionCall {
|
||||||
qualifiedResolver.reset()
|
qualifiedResolver.reset()
|
||||||
|
|||||||
+1
-2
@@ -6,7 +6,6 @@
|
|||||||
package org.jetbrains.kotlin.fir.resolve.calls
|
package org.jetbrains.kotlin.fir.resolve.calls
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
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.symbols.StandardClassIds
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.*
|
||||||
import org.jetbrains.kotlin.resolve.calls.results.*
|
import org.jetbrains.kotlin.resolve.calls.results.*
|
||||||
@@ -16,7 +15,7 @@ import org.jetbrains.kotlin.types.model.KotlinTypeMarker
|
|||||||
abstract class AbstractConeCallConflictResolver(
|
abstract class AbstractConeCallConflictResolver(
|
||||||
private val specificityComparator: TypeSpecificityComparator,
|
private val specificityComparator: TypeSpecificityComparator,
|
||||||
protected val inferenceComponents: InferenceComponents
|
protected val inferenceComponents: InferenceComponents
|
||||||
) : ConeCallConflictResolver {
|
) : ConeCallConflictResolver() {
|
||||||
protected fun Collection<Candidate>.setIfOneOrEmpty(): Set<Candidate>? = when (size) {
|
protected fun Collection<Candidate>.setIfOneOrEmpty(): Set<Candidate>? = when (size) {
|
||||||
0 -> emptySet()
|
0 -> emptySet()
|
||||||
1 -> setOf(single())
|
1 -> setOf(single())
|
||||||
|
|||||||
+12
-2
@@ -5,14 +5,24 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.resolve.calls
|
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(
|
fun chooseMaximallySpecificCandidates(
|
||||||
candidates: Collection<Candidate>,
|
candidates: Collection<Candidate>,
|
||||||
discriminateGenerics: Boolean
|
discriminateGenerics: Boolean
|
||||||
): Set<Candidate> = chooseMaximallySpecificCandidates(candidates.toSet(), discriminateGenerics)
|
): Set<Candidate> = chooseMaximallySpecificCandidates(candidates.toSet(), discriminateGenerics)
|
||||||
|
|
||||||
fun chooseMaximallySpecificCandidates(
|
abstract fun chooseMaximallySpecificCandidates(
|
||||||
candidates: Set<Candidate>,
|
candidates: Set<Candidate>,
|
||||||
discriminateGenerics: Boolean
|
discriminateGenerics: Boolean
|
||||||
): Set<Candidate>
|
): 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(
|
class ConeCompositeConflictResolver(
|
||||||
private vararg val conflictResolvers: AbstractConeCallConflictResolver
|
private vararg val conflictResolvers: AbstractConeCallConflictResolver
|
||||||
) : ConeCallConflictResolver {
|
) : ConeCallConflictResolver() {
|
||||||
override fun chooseMaximallySpecificCandidates(candidates: Set<Candidate>, discriminateGenerics: Boolean): Set<Candidate> {
|
override fun chooseMaximallySpecificCandidates(candidates: Set<Candidate>, discriminateGenerics: Boolean): Set<Candidate> {
|
||||||
if (candidates.size <= 1) return candidates
|
if (candidates.size <= 1) return candidates
|
||||||
var currentCandidates = 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.java.JavaSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.FirProvider
|
import org.jetbrains.kotlin.fir.resolve.FirProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.FirSymbolProvider
|
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.firProvider
|
||||||
import org.jetbrains.kotlin.fir.resolve.impl.FirCompositeSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.impl.FirCompositeSymbolProvider
|
||||||
import org.jetbrains.kotlin.fir.types.FirCorrespondingSupertypesCache
|
import org.jetbrains.kotlin.fir.types.FirCorrespondingSupertypesCache
|
||||||
@@ -46,5 +48,10 @@ class FirIdeJavaModuleBasedSession(
|
|||||||
FirCorrespondingSupertypesCache::class,
|
FirCorrespondingSupertypesCache::class,
|
||||||
FirCorrespondingSupertypesCache(this)
|
FirCorrespondingSupertypesCache(this)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
registerComponent(
|
||||||
|
ConeCallConflictResolverFactory::class,
|
||||||
|
JvmCallConflictResolverFactory
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user