From a3d531e8b49c33fde055eb4188fe0fcf55f4ccbb Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Wed, 18 Dec 2019 15:11:58 +0300 Subject: [PATCH] [FIR] Extract jvm-only call conflict resolver --- .../fir/java/FirJavaModuleBasedSession.kt | 12 +++++++++- .../jvm/ConeEquivalentCallConflictResolver.kt | 0 .../jvm/JvmCallConflictResolverFactory.kt | 23 +++++++++++++++++++ .../jetbrains/kotlin/fir/FirCallResolver.kt | 8 +++---- .../calls/AbstractConeCallConflictResolver.kt | 3 +-- .../resolve/calls/ConeCallConflictResolver.kt | 16 ++++++++++--- .../calls/ConeCompositeConflictResolver.kt | 2 +- .../idea/fir/FirIdeJavaModuleBasedSession.kt | 7 ++++++ 8 files changed, 59 insertions(+), 12 deletions(-) rename compiler/fir/{resolve => jvm}/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt (100%) create mode 100644 compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/JvmCallConflictResolverFactory.kt diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt index 78477ed3cf4..fe8a9497b4a 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/FirJavaModuleBasedSession.kt @@ -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)) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt similarity index 100% rename from compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt rename to compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/ConeEquivalentCallConflictResolver.kt diff --git a/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/JvmCallConflictResolverFactory.kt b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/JvmCallConflictResolverFactory.kt new file mode 100644 index 00000000000..fc2200b3c91 --- /dev/null +++ b/compiler/fir/jvm/src/org/jetbrains/kotlin/fir/resolve/calls/jvm/JvmCallConflictResolverFactory.kt @@ -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) + ) + +} \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt index 1249cb54f4f..2437e6fb5f9 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/FirCallResolver.kt @@ -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() diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/AbstractConeCallConflictResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/AbstractConeCallConflictResolver.kt index 7dff23a0681..3ba3e9f3d02 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/AbstractConeCallConflictResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/AbstractConeCallConflictResolver.kt @@ -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.setIfOneOrEmpty(): Set? = when (size) { 0 -> emptySet() 1 -> setOf(single()) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeCallConflictResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeCallConflictResolver.kt index 1ddaa8efcbe..7d89658c8cf 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeCallConflictResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeCallConflictResolver.kt @@ -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, discriminateGenerics: Boolean ): Set = chooseMaximallySpecificCandidates(candidates.toSet(), discriminateGenerics) - fun chooseMaximallySpecificCandidates( + abstract fun chooseMaximallySpecificCandidates( candidates: Set, discriminateGenerics: Boolean ): Set -} \ No newline at end of file +} + +abstract class ConeCallConflictResolverFactory : FirSessionComponent { + abstract fun create(typeSpecificityComparator: TypeSpecificityComparator, components: InferenceComponents): ConeCallConflictResolver +} +val FirSession.callConflictResolverFactory by componentArrayAccessor() \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeCompositeConflictResolver.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeCompositeConflictResolver.kt index bb8b1b5c252..5dfa875bebe 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeCompositeConflictResolver.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/ConeCompositeConflictResolver.kt @@ -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, discriminateGenerics: Boolean): Set { if (candidates.size <= 1) return candidates var currentCandidates = candidates diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeJavaModuleBasedSession.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeJavaModuleBasedSession.kt index 90b6db4c95b..aee25e64018 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeJavaModuleBasedSession.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/fir/FirIdeJavaModuleBasedSession.kt @@ -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 + ) } } \ No newline at end of file