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
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.frontend.di.createContainerForLazyBodyResolve
import org.jetbrains.kotlin.idea.caches.project.getModuleInfo
import org.jetbrains.kotlin.idea.caches.trackers.clearInBlockModifications
import org.jetbrains.kotlin.idea.caches.trackers.inBlockModifications
import org.jetbrains.kotlin.idea.compiler.IdeMainFunctionDetectorFactory
import org.jetbrains.kotlin.idea.project.IdeaModuleStructureOracle
import org.jetbrains.kotlin.idea.project.findAnalyzerServices
import org.jetbrains.kotlin.idea.project.languageVersionSettings
@@ -449,7 +450,8 @@ private object KotlinResolveDataProvider {
bodyResolveCache,
targetPlatform.findAnalyzerServices(project),
analyzableElement.languageVersionSettings,
IdeaModuleStructureOracle()
IdeaModuleStructureOracle(),
IdeMainFunctionDetectorFactory()
).get<LazyTopDownAnalyzer>()
lazyTopDownAnalyzer.analyzeDeclarations(TopDownAnalysisMode.TopLevelDeclarations, listOf(analyzableElement))
@@ -0,0 +1,26 @@
/*
* Copyright 2010-2020 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.idea.compiler
import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.idea.MainFunctionDetector
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.resolve.BindingTrace
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
import org.jetbrains.kotlin.utils.KotlinExceptionWithAttachments
internal class IdeMainFunctionDetectorFactory : MainFunctionDetector.Factory {
override fun createMainFunctionDetector(
trace: BindingTrace,
languageVersionSettings: LanguageVersionSettings
): MainFunctionDetector {
return MainFunctionDetector(languageVersionSettings) { function ->
function.resolveToDescriptorIfAny(bodyResolveMode = BodyResolveMode.FULL)
?: throw KotlinExceptionWithAttachments("No descriptor resolved for $function")
.withAttachment("function.text", function.text)
}
}
}
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.project
import org.jetbrains.kotlin.container.StorageComponentContainer
import org.jetbrains.kotlin.container.useImpl
import org.jetbrains.kotlin.idea.caches.lightClasses.LazyLightClassDataHolder
import org.jetbrains.kotlin.idea.compiler.IdeMainFunctionDetectorFactory
import org.jetbrains.kotlin.resolve.TargetEnvironment
object IdeaEnvironment : TargetEnvironment("Idea") {
@@ -28,5 +29,6 @@ object IdeaEnvironment : TargetEnvironment("Idea") {
container.useImpl<IdeaAbsentDescriptorHandler>()
container.useImpl<LazyLightClassDataHolder.DiagnosticsHolder>()
container.useImpl<IdeaModuleStructureOracle>()
container.useImpl<IdeMainFunctionDetectorFactory>()
}
}
@@ -29,6 +29,7 @@ import org.jetbrains.kotlin.idea.caches.resolve.util.analyzeControlFlow
import org.jetbrains.kotlin.idea.caches.trackers.KotlinCodeBlockModificationListener
import org.jetbrains.kotlin.idea.caches.trackers.KotlinCodeBlockModificationListenerCompat
import org.jetbrains.kotlin.idea.caches.trackers.inBlockModificationCount
import org.jetbrains.kotlin.idea.compiler.IdeMainFunctionDetectorFactory
import org.jetbrains.kotlin.idea.util.application.isUnitTestMode
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.platform.TargetPlatform