From 9bf2dfaa0237c688311b01974ea0c9cdbee8353d Mon Sep 17 00:00:00 2001 From: Simon Ogorodnik Date: Wed, 16 Dec 2020 15:39:13 +0300 Subject: [PATCH] KT-40200: Fix main function detector in lazy resolve overload resolver --- .../kotlin/frontend/java/di/injection.kt | 1 + .../jetbrains/kotlin/frontend/di/injection.kt | 7 ++++- .../kotlin/idea/MainFunctionDetector.kt | 15 +++++++++++ .../kotlin/resolve/CompilerEnvironment.kt | 2 ++ .../kotlin/resolve/OverloadResolver.kt | 5 ++-- .../caches/resolve/PerFileAnalysisCache.kt | 4 ++- .../IdeMainFunctionDetectorFactory.kt | 26 +++++++++++++++++++ .../kotlin/idea/project/IdeaEnvironment.kt | 2 ++ .../idea/project/ResolveElementCache.kt | 1 + 9 files changed, 59 insertions(+), 4 deletions(-) create mode 100644 idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IdeMainFunctionDetectorFactory.kt diff --git a/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt b/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt index 4b814ca32f0..46a548bd6dd 100644 --- a/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt +++ b/compiler/frontend.java/src/org/jetbrains/kotlin/frontend/java/di/injection.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor import org.jetbrains.kotlin.frontend.di.configureIncrementalCompilation import org.jetbrains.kotlin.frontend.di.configureModule import org.jetbrains.kotlin.frontend.di.configureStandardResolveComponents +import org.jetbrains.kotlin.idea.MainFunctionDetector import org.jetbrains.kotlin.incremental.components.ExpectActualTracker import org.jetbrains.kotlin.incremental.components.LookupTracker import org.jetbrains.kotlin.load.java.AbstractJavaClassFinder diff --git a/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt b/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt index db014953858..68d5d6a23a2 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/frontend/di/injection.kt @@ -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() useImpl() + useInstance(statementFilter) } @@ -219,6 +223,7 @@ fun createContainerForLazyResolve( useInstance(declarationProviderFactory) + targetEnvironment.configure(this) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/idea/MainFunctionDetector.kt b/compiler/frontend/src/org/jetbrains/kotlin/idea/MainFunctionDetector.kt index b10a03c598c..e2e146944f6 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/idea/MainFunctionDetector.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/idea/MainFunctionDetector.kt @@ -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) + } + + } + } } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/CompilerEnvironment.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/CompilerEnvironment.kt index 6806294da0c..0db6acc1c20 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/CompilerEnvironment.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/CompilerEnvironment.kt @@ -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() container.useImpl() container.useInstance(ModuleStructureOracle.SingleModule) + container.useImpl() } } \ No newline at end of file diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.kt index c555af13e31..fa1f75b3b62 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/OverloadResolver.kt @@ -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) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/PerFileAnalysisCache.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/PerFileAnalysisCache.kt index eebc46bde57..91bf8671418 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/PerFileAnalysisCache.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/caches/resolve/PerFileAnalysisCache.kt @@ -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.analyzeDeclarations(TopDownAnalysisMode.TopLevelDeclarations, listOf(analyzableElement)) diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IdeMainFunctionDetectorFactory.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IdeMainFunctionDetectorFactory.kt new file mode 100644 index 00000000000..efb915c64cd --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/compiler/IdeMainFunctionDetectorFactory.kt @@ -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) + } + } +} \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/IdeaEnvironment.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/IdeaEnvironment.kt index 63d4d3f8fa8..282af7e272d 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/IdeaEnvironment.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/IdeaEnvironment.kt @@ -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() container.useImpl() container.useImpl() + container.useImpl() } } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt index b7517f7be03..76054150cd0 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/project/ResolveElementCache.kt @@ -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