Extract control flow analysis to separate module

Extract a service interface out of ControlFlowInformationProviderImpl
and register its implementation in two "leaf" modules: 'cli',
'idea-core'.

This improves parallel build, since a lot of modules depend on
'frontend' but only these two modules reference the implementation and
thus depend on the full CFA implementation now.
This commit is contained in:
Alexander Udalov
2020-03-16 01:13:51 +01:00
committed by Alexander Udalov
parent c744515832
commit 2e2caae05c
70 changed files with 113 additions and 29 deletions
@@ -16,6 +16,7 @@ import com.intellij.openapi.util.ModificationTracker
import com.intellij.psi.PsiElement
import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.analyzer.AnalysisResult
import org.jetbrains.kotlin.cfg.ControlFlowInformationProviderImpl
import org.jetbrains.kotlin.container.ComponentProvider
import org.jetbrains.kotlin.container.get
import org.jetbrains.kotlin.context.GlobalContext
@@ -47,7 +48,6 @@ import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.util.slicedMap.ReadOnlySlice
import org.jetbrains.kotlin.util.slicedMap.WritableSlice
import org.jetbrains.kotlin.utils.checkWithAttachment
import java.util.*
import java.util.concurrent.locks.ReentrantLock
internal class PerFileAnalysisCache(val file: KtFile, componentProvider: ComponentProvider) {
@@ -484,8 +484,9 @@ private object KotlinResolveDataProvider {
analyzableElement.languageVersionSettings,
IdeaModuleStructureOracle(),
IdeMainFunctionDetectorFactory(),
IdeSealedClassInheritorsProvider
).get<LazyTopDownAnalyzer>()
IdeSealedClassInheritorsProvider,
ControlFlowInformationProviderImpl.Factory,
).get<LazyTopDownAnalyzer>()
lazyTopDownAnalyzer.analyzeDeclarations(TopDownAnalysisMode.TopLevelDeclarations, listOf(analyzableElement))
} finally {
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.idea.caches.resolve.util
import org.jetbrains.kotlin.cfg.ControlFlowInformationProvider
import org.jetbrains.kotlin.cfg.ControlFlowInformationProviderImpl
import org.jetbrains.kotlin.idea.project.languageVersionSettings
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.resolve.BindingTrace
@@ -16,7 +16,7 @@ fun analyzeControlFlow(resolveSession: ResolveSession, resolveElement: KtElement
val controlFlowTrace = DelegatingBindingTrace(
trace.bindingContext, "Element control flow resolve", resolveElement, allowSliceRewrite = true
)
ControlFlowInformationProvider(
ControlFlowInformationProviderImpl(
resolveElement, controlFlowTrace, resolveElement.languageVersionSettings, resolveSession.platformDiagnosticSuppressor
).checkDeclaration()
controlFlowTrace.addOwnDataTo(trace, null, false)
@@ -16,8 +16,10 @@
package org.jetbrains.kotlin.idea.project
import org.jetbrains.kotlin.cfg.ControlFlowInformationProviderImpl
import org.jetbrains.kotlin.container.StorageComponentContainer
import org.jetbrains.kotlin.container.useImpl
import org.jetbrains.kotlin.container.useInstance
import org.jetbrains.kotlin.idea.caches.lightClasses.LazyLightClassDataHolder
import org.jetbrains.kotlin.idea.compiler.IdeMainFunctionDetectorFactory
import org.jetbrains.kotlin.resolve.TargetEnvironment
@@ -30,5 +32,6 @@ object IdeaEnvironment : TargetEnvironment("Idea") {
container.useImpl<LazyLightClassDataHolder.DiagnosticsHolder>()
container.useImpl<IdeaModuleStructureOracle>()
container.useImpl<IdeMainFunctionDetectorFactory>()
container.useInstance(ControlFlowInformationProviderImpl.Factory)
}
}
@@ -15,7 +15,7 @@ import com.intellij.psi.util.CachedValuesManager
import com.intellij.util.containers.ContainerUtil
import com.intellij.util.containers.SLRUCache
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.cfg.ControlFlowInformationProvider
import org.jetbrains.kotlin.cfg.ControlFlowInformationProviderImpl
import org.jetbrains.kotlin.container.get
import org.jetbrains.kotlin.context.SimpleGlobalContext
import org.jetbrains.kotlin.context.withModule
@@ -44,7 +44,6 @@ import org.jetbrains.kotlin.resolve.lazy.*
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyClassDescriptor
import org.jetbrains.kotlin.resolve.scopes.LexicalScope
import org.jetbrains.kotlin.types.expressions.ExpressionTypingContext
import java.util.*
import java.util.concurrent.ConcurrentMap
class ResolveElementCache(
@@ -647,7 +646,7 @@ class ResolveElementCache(
forceResolveAnnotationsInside(property)
for (accessor in property.accessors) {
ControlFlowInformationProvider(
ControlFlowInformationProviderImpl(
accessor, trace, accessor.languageVersionSettings, resolveSession.platformDiagnosticSuppressor
).checkDeclaration()
}
@@ -787,7 +786,8 @@ class ResolveElementCache(
targetPlatform.findAnalyzerServices(file.project),
file.languageVersionSettings,
IdeaModuleStructureOracle(),
IdeSealedClassInheritorsProvider
IdeSealedClassInheritorsProvider,
ControlFlowInformationProviderImpl.Factory,
).get()
}
@@ -845,4 +845,3 @@ class ResolveElementCache(
var forceFullAnalysisModeInTests: Boolean = false
}
}