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:
committed by
Alexander Udalov
parent
c744515832
commit
2e2caae05c
+4
-3
@@ -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 {
|
||||
|
||||
+2
-2
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user