KT-40200: Fix main function detector in lazy resolve overload resolver

This commit is contained in:
Simon Ogorodnik
2020-12-16 15:39:13 +03:00
committed by TeamCityServer
parent 92adccde47
commit 9bf2dfaa02
9 changed files with 59 additions and 4 deletions
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.container.useInstance
import org.jetbrains.kotlin.context.ModuleContext
import org.jetbrains.kotlin.contracts.ContractDeserializerImpl
import org.jetbrains.kotlin.extensions.StorageComponentContainerContributor
import org.jetbrains.kotlin.idea.MainFunctionDetector
import org.jetbrains.kotlin.incremental.components.ExpectActualTracker
import org.jetbrains.kotlin.incremental.components.LookupTracker
import org.jetbrains.kotlin.platform.TargetPlatform
@@ -154,10 +155,12 @@ fun createContainerForLazyBodyResolve(
bodyResolveCache: BodyResolveCache,
analyzerServices: PlatformDependentAnalyzerServices,
languageVersionSettings: LanguageVersionSettings,
moduleStructureOracle: ModuleStructureOracle
moduleStructureOracle: ModuleStructureOracle,
mainFunctionDetectorFactory: MainFunctionDetector.Factory
): StorageComponentContainer = createContainer("LazyBodyResolve", analyzerServices) {
configureModule(moduleContext, platform, analyzerServices, bindingTrace, languageVersionSettings)
useInstance(mainFunctionDetectorFactory)
useInstance(kotlinCodeAnalyzer)
useInstance(kotlinCodeAnalyzer.fileScopeProvider)
useInstance(bodyResolveCache)
@@ -201,6 +204,7 @@ fun createContainerForLazyLocalClassifierAnalyzer(
useImpl<DeclarationScopeProviderForLocalClassifierAnalyzer>()
useImpl<LocalLazyDeclarationResolver>()
useInstance(statementFilter)
}
@@ -219,6 +223,7 @@ fun createContainerForLazyResolve(
useInstance(declarationProviderFactory)
targetEnvironment.configure(this)
}
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.BindingTrace
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.annotations.hasJvmStaticAnnotation
@@ -202,4 +203,18 @@ class MainFunctionDetector {
private fun hasAnnotationWithExactNumberOfArguments(function: KtNamedFunction, number: Int) =
function.annotationEntries.any { it.valueArguments.size == number }
}
interface Factory {
fun createMainFunctionDetector(trace: BindingTrace, languageVersionSettings: LanguageVersionSettings): MainFunctionDetector
class Ordinary : Factory {
override fun createMainFunctionDetector(
trace: BindingTrace,
languageVersionSettings: LanguageVersionSettings
): MainFunctionDetector {
return MainFunctionDetector(trace.bindingContext, languageVersionSettings)
}
}
}
}
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.resolve
import org.jetbrains.kotlin.container.StorageComponentContainer
import org.jetbrains.kotlin.container.useImpl
import org.jetbrains.kotlin.container.useInstance
import org.jetbrains.kotlin.idea.MainFunctionDetector
import org.jetbrains.kotlin.resolve.lazy.CompilerLocalDescriptorResolver
import org.jetbrains.kotlin.resolve.lazy.BasicAbsentDescriptorHandler
@@ -28,5 +29,6 @@ object CompilerEnvironment : TargetEnvironment("Compiler") {
container.useImpl<CompilerLocalDescriptorResolver>()
container.useImpl<BasicAbsentDescriptorHandler>()
container.useInstance(ModuleStructureOracle.SingleModule)
container.useImpl<MainFunctionDetector.Factory.Ordinary>()
}
}
@@ -34,10 +34,11 @@ class OverloadResolver(
private val trace: BindingTrace,
private val overloadFilter: OverloadFilter,
private val overloadChecker: OverloadChecker,
languageVersionSettings: LanguageVersionSettings
languageVersionSettings: LanguageVersionSettings,
mainFunctionDetectorFactory: MainFunctionDetector.Factory
) {
private val mainFunctionDetector = MainFunctionDetector(trace.bindingContext, languageVersionSettings)
private val mainFunctionDetector = mainFunctionDetectorFactory.createMainFunctionDetector(trace, languageVersionSettings)
fun checkOverloads(c: BodiesResolveContext) {
val inClasses = findConstructorsInNestedClassesAndTypeAliases(c)