KT-40200: Fix main function detector in lazy resolve overload resolver
This commit is contained in:
committed by
TeamCityServer
parent
92adccde47
commit
9bf2dfaa02
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.descriptors.ModuleDescriptor
|
|||||||
import org.jetbrains.kotlin.frontend.di.configureIncrementalCompilation
|
import org.jetbrains.kotlin.frontend.di.configureIncrementalCompilation
|
||||||
import org.jetbrains.kotlin.frontend.di.configureModule
|
import org.jetbrains.kotlin.frontend.di.configureModule
|
||||||
import org.jetbrains.kotlin.frontend.di.configureStandardResolveComponents
|
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.ExpectActualTracker
|
||||||
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
||||||
import org.jetbrains.kotlin.load.java.AbstractJavaClassFinder
|
import org.jetbrains.kotlin.load.java.AbstractJavaClassFinder
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.container.useInstance
|
|||||||
import org.jetbrains.kotlin.context.ModuleContext
|
import org.jetbrains.kotlin.context.ModuleContext
|
||||||
import org.jetbrains.kotlin.contracts.ContractDeserializerImpl
|
import org.jetbrains.kotlin.contracts.ContractDeserializerImpl
|
||||||
import org.jetbrains.kotlin.extensions.StorageComponentContainerContributor
|
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.ExpectActualTracker
|
||||||
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
import org.jetbrains.kotlin.incremental.components.LookupTracker
|
||||||
import org.jetbrains.kotlin.platform.TargetPlatform
|
import org.jetbrains.kotlin.platform.TargetPlatform
|
||||||
@@ -154,10 +155,12 @@ fun createContainerForLazyBodyResolve(
|
|||||||
bodyResolveCache: BodyResolveCache,
|
bodyResolveCache: BodyResolveCache,
|
||||||
analyzerServices: PlatformDependentAnalyzerServices,
|
analyzerServices: PlatformDependentAnalyzerServices,
|
||||||
languageVersionSettings: LanguageVersionSettings,
|
languageVersionSettings: LanguageVersionSettings,
|
||||||
moduleStructureOracle: ModuleStructureOracle
|
moduleStructureOracle: ModuleStructureOracle,
|
||||||
|
mainFunctionDetectorFactory: MainFunctionDetector.Factory
|
||||||
): StorageComponentContainer = createContainer("LazyBodyResolve", analyzerServices) {
|
): StorageComponentContainer = createContainer("LazyBodyResolve", analyzerServices) {
|
||||||
configureModule(moduleContext, platform, analyzerServices, bindingTrace, languageVersionSettings)
|
configureModule(moduleContext, platform, analyzerServices, bindingTrace, languageVersionSettings)
|
||||||
|
|
||||||
|
useInstance(mainFunctionDetectorFactory)
|
||||||
useInstance(kotlinCodeAnalyzer)
|
useInstance(kotlinCodeAnalyzer)
|
||||||
useInstance(kotlinCodeAnalyzer.fileScopeProvider)
|
useInstance(kotlinCodeAnalyzer.fileScopeProvider)
|
||||||
useInstance(bodyResolveCache)
|
useInstance(bodyResolveCache)
|
||||||
@@ -201,6 +204,7 @@ fun createContainerForLazyLocalClassifierAnalyzer(
|
|||||||
useImpl<DeclarationScopeProviderForLocalClassifierAnalyzer>()
|
useImpl<DeclarationScopeProviderForLocalClassifierAnalyzer>()
|
||||||
useImpl<LocalLazyDeclarationResolver>()
|
useImpl<LocalLazyDeclarationResolver>()
|
||||||
|
|
||||||
|
|
||||||
useInstance(statementFilter)
|
useInstance(statementFilter)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,6 +223,7 @@ fun createContainerForLazyResolve(
|
|||||||
|
|
||||||
useInstance(declarationProviderFactory)
|
useInstance(declarationProviderFactory)
|
||||||
|
|
||||||
|
|
||||||
targetEnvironment.configure(this)
|
targetEnvironment.configure(this)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import org.jetbrains.kotlin.name.FqName
|
|||||||
import org.jetbrains.kotlin.psi.KtDeclaration
|
import org.jetbrains.kotlin.psi.KtDeclaration
|
||||||
import org.jetbrains.kotlin.psi.KtNamedFunction
|
import org.jetbrains.kotlin.psi.KtNamedFunction
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
|
import org.jetbrains.kotlin.resolve.BindingTrace
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
||||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||||
import org.jetbrains.kotlin.resolve.annotations.hasJvmStaticAnnotation
|
import org.jetbrains.kotlin.resolve.annotations.hasJvmStaticAnnotation
|
||||||
@@ -202,4 +203,18 @@ class MainFunctionDetector {
|
|||||||
private fun hasAnnotationWithExactNumberOfArguments(function: KtNamedFunction, number: Int) =
|
private fun hasAnnotationWithExactNumberOfArguments(function: KtNamedFunction, number: Int) =
|
||||||
function.annotationEntries.any { it.valueArguments.size == number }
|
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.StorageComponentContainer
|
||||||
import org.jetbrains.kotlin.container.useImpl
|
import org.jetbrains.kotlin.container.useImpl
|
||||||
import org.jetbrains.kotlin.container.useInstance
|
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.CompilerLocalDescriptorResolver
|
||||||
import org.jetbrains.kotlin.resolve.lazy.BasicAbsentDescriptorHandler
|
import org.jetbrains.kotlin.resolve.lazy.BasicAbsentDescriptorHandler
|
||||||
|
|
||||||
@@ -28,5 +29,6 @@ object CompilerEnvironment : TargetEnvironment("Compiler") {
|
|||||||
container.useImpl<CompilerLocalDescriptorResolver>()
|
container.useImpl<CompilerLocalDescriptorResolver>()
|
||||||
container.useImpl<BasicAbsentDescriptorHandler>()
|
container.useImpl<BasicAbsentDescriptorHandler>()
|
||||||
container.useInstance(ModuleStructureOracle.SingleModule)
|
container.useInstance(ModuleStructureOracle.SingleModule)
|
||||||
|
container.useImpl<MainFunctionDetector.Factory.Ordinary>()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -34,10 +34,11 @@ class OverloadResolver(
|
|||||||
private val trace: BindingTrace,
|
private val trace: BindingTrace,
|
||||||
private val overloadFilter: OverloadFilter,
|
private val overloadFilter: OverloadFilter,
|
||||||
private val overloadChecker: OverloadChecker,
|
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) {
|
fun checkOverloads(c: BodiesResolveContext) {
|
||||||
val inClasses = findConstructorsInNestedClassesAndTypeAliases(c)
|
val inClasses = findConstructorsInNestedClassesAndTypeAliases(c)
|
||||||
|
|||||||
+3
-1
@@ -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.project.getModuleInfo
|
||||||
import org.jetbrains.kotlin.idea.caches.trackers.clearInBlockModifications
|
import org.jetbrains.kotlin.idea.caches.trackers.clearInBlockModifications
|
||||||
import org.jetbrains.kotlin.idea.caches.trackers.inBlockModifications
|
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.IdeaModuleStructureOracle
|
||||||
import org.jetbrains.kotlin.idea.project.findAnalyzerServices
|
import org.jetbrains.kotlin.idea.project.findAnalyzerServices
|
||||||
import org.jetbrains.kotlin.idea.project.languageVersionSettings
|
import org.jetbrains.kotlin.idea.project.languageVersionSettings
|
||||||
@@ -449,7 +450,8 @@ private object KotlinResolveDataProvider {
|
|||||||
bodyResolveCache,
|
bodyResolveCache,
|
||||||
targetPlatform.findAnalyzerServices(project),
|
targetPlatform.findAnalyzerServices(project),
|
||||||
analyzableElement.languageVersionSettings,
|
analyzableElement.languageVersionSettings,
|
||||||
IdeaModuleStructureOracle()
|
IdeaModuleStructureOracle(),
|
||||||
|
IdeMainFunctionDetectorFactory()
|
||||||
).get<LazyTopDownAnalyzer>()
|
).get<LazyTopDownAnalyzer>()
|
||||||
|
|
||||||
lazyTopDownAnalyzer.analyzeDeclarations(TopDownAnalysisMode.TopLevelDeclarations, listOf(analyzableElement))
|
lazyTopDownAnalyzer.analyzeDeclarations(TopDownAnalysisMode.TopLevelDeclarations, listOf(analyzableElement))
|
||||||
|
|||||||
+26
@@ -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.StorageComponentContainer
|
||||||
import org.jetbrains.kotlin.container.useImpl
|
import org.jetbrains.kotlin.container.useImpl
|
||||||
import org.jetbrains.kotlin.idea.caches.lightClasses.LazyLightClassDataHolder
|
import org.jetbrains.kotlin.idea.caches.lightClasses.LazyLightClassDataHolder
|
||||||
|
import org.jetbrains.kotlin.idea.compiler.IdeMainFunctionDetectorFactory
|
||||||
import org.jetbrains.kotlin.resolve.TargetEnvironment
|
import org.jetbrains.kotlin.resolve.TargetEnvironment
|
||||||
|
|
||||||
object IdeaEnvironment : TargetEnvironment("Idea") {
|
object IdeaEnvironment : TargetEnvironment("Idea") {
|
||||||
@@ -28,5 +29,6 @@ object IdeaEnvironment : TargetEnvironment("Idea") {
|
|||||||
container.useImpl<IdeaAbsentDescriptorHandler>()
|
container.useImpl<IdeaAbsentDescriptorHandler>()
|
||||||
container.useImpl<LazyLightClassDataHolder.DiagnosticsHolder>()
|
container.useImpl<LazyLightClassDataHolder.DiagnosticsHolder>()
|
||||||
container.useImpl<IdeaModuleStructureOracle>()
|
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.KotlinCodeBlockModificationListener
|
||||||
import org.jetbrains.kotlin.idea.caches.trackers.KotlinCodeBlockModificationListenerCompat
|
import org.jetbrains.kotlin.idea.caches.trackers.KotlinCodeBlockModificationListenerCompat
|
||||||
import org.jetbrains.kotlin.idea.caches.trackers.inBlockModificationCount
|
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.idea.util.application.isUnitTestMode
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.platform.TargetPlatform
|
import org.jetbrains.kotlin.platform.TargetPlatform
|
||||||
|
|||||||
Reference in New Issue
Block a user