Refactoring: enumerate used components in PerFileAnalysisCache.kt
This commit is contained in:
+31
-11
@@ -41,7 +41,13 @@ import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
|||||||
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
|
import org.jetbrains.kotlin.resolve.lazy.ResolveSession
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
internal class PerFileAnalysisCache(val file: KtFile, val componentProvider: ComponentProvider) {
|
internal class PerFileAnalysisCache(val file: KtFile, componentProvider: ComponentProvider) {
|
||||||
|
private val globalContext = componentProvider.get<GlobalContext>()
|
||||||
|
private val moduleDescriptor = componentProvider.get<ModuleDescriptor>()
|
||||||
|
private val resolveSession = componentProvider.get<ResolveSession>()
|
||||||
|
private val codeFragmentAnalyzer = componentProvider.get<CodeFragmentAnalyzer>()
|
||||||
|
private val bodyResolveCache = componentProvider.get<BodyResolveCache>()
|
||||||
|
|
||||||
private val cache = HashMap<PsiElement, AnalysisResult>()
|
private val cache = HashMap<PsiElement, AnalysisResult>()
|
||||||
|
|
||||||
private fun lookUp(analyzableElement: KtElement): AnalysisResult? {
|
private fun lookUp(analyzableElement: KtElement): AnalysisResult? {
|
||||||
@@ -92,7 +98,15 @@ internal class PerFileAnalysisCache(val file: KtFile, val componentProvider: Com
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return KotlinResolveDataProvider.analyze(project, componentProvider, analyzableElement)
|
return KotlinResolveDataProvider.analyze(
|
||||||
|
project,
|
||||||
|
globalContext,
|
||||||
|
moduleDescriptor,
|
||||||
|
resolveSession,
|
||||||
|
codeFragmentAnalyzer,
|
||||||
|
bodyResolveCache,
|
||||||
|
analyzableElement
|
||||||
|
)
|
||||||
} catch (e: ProcessCanceledException) {
|
} catch (e: ProcessCanceledException) {
|
||||||
throw e
|
throw e
|
||||||
} catch (e: IndexNotReadyException) {
|
} catch (e: IndexNotReadyException) {
|
||||||
@@ -148,14 +162,20 @@ private object KotlinResolveDataProvider {
|
|||||||
?: element.containingKtFile
|
?: element.containingKtFile
|
||||||
}
|
}
|
||||||
|
|
||||||
fun analyze(project: Project, componentProvider: ComponentProvider, analyzableElement: KtElement): AnalysisResult {
|
fun analyze(
|
||||||
|
project: Project,
|
||||||
|
globalContext: GlobalContext,
|
||||||
|
moduleDescriptor: ModuleDescriptor,
|
||||||
|
resolveSession: ResolveSession,
|
||||||
|
codeFragmentAnalyzer: CodeFragmentAnalyzer,
|
||||||
|
bodyResolveCache: BodyResolveCache,
|
||||||
|
analyzableElement: KtElement
|
||||||
|
): AnalysisResult {
|
||||||
try {
|
try {
|
||||||
val module = componentProvider.get<ModuleDescriptor>()
|
|
||||||
if (analyzableElement is KtCodeFragment) {
|
if (analyzableElement is KtCodeFragment) {
|
||||||
return AnalysisResult.success(analyzeExpressionCodeFragment(componentProvider, analyzableElement), module)
|
return AnalysisResult.success(analyzeExpressionCodeFragment(codeFragmentAnalyzer, analyzableElement), moduleDescriptor)
|
||||||
}
|
}
|
||||||
|
|
||||||
val resolveSession = componentProvider.get<ResolveSession>()
|
|
||||||
val trace = DelegatingBindingTrace(
|
val trace = DelegatingBindingTrace(
|
||||||
resolveSession.bindingContext,
|
resolveSession.bindingContext,
|
||||||
"Trace for resolution of " + analyzableElement,
|
"Trace for resolution of " + analyzableElement,
|
||||||
@@ -166,18 +186,18 @@ private object KotlinResolveDataProvider {
|
|||||||
|
|
||||||
val lazyTopDownAnalyzer = createContainerForLazyBodyResolve(
|
val lazyTopDownAnalyzer = createContainerForLazyBodyResolve(
|
||||||
//TODO: should get ModuleContext
|
//TODO: should get ModuleContext
|
||||||
componentProvider.get<GlobalContext>().withProject(project).withModule(module),
|
globalContext.withProject(project).withModule(moduleDescriptor),
|
||||||
resolveSession,
|
resolveSession,
|
||||||
trace,
|
trace,
|
||||||
targetPlatform,
|
targetPlatform,
|
||||||
componentProvider.get<BodyResolveCache>(),
|
bodyResolveCache,
|
||||||
analyzableElement.jvmTarget,
|
analyzableElement.jvmTarget,
|
||||||
analyzableElement.languageVersionSettings
|
analyzableElement.languageVersionSettings
|
||||||
).get<LazyTopDownAnalyzer>()
|
).get<LazyTopDownAnalyzer>()
|
||||||
|
|
||||||
lazyTopDownAnalyzer.analyzeDeclarations(TopDownAnalysisMode.TopLevelDeclarations, listOf(analyzableElement))
|
lazyTopDownAnalyzer.analyzeDeclarations(TopDownAnalysisMode.TopLevelDeclarations, listOf(analyzableElement))
|
||||||
|
|
||||||
return AnalysisResult.success(trace.bindingContext, module)
|
return AnalysisResult.success(trace.bindingContext, moduleDescriptor)
|
||||||
} catch (e: ProcessCanceledException) {
|
} catch (e: ProcessCanceledException) {
|
||||||
throw e
|
throw e
|
||||||
} catch (e: IndexNotReadyException) {
|
} catch (e: IndexNotReadyException) {
|
||||||
@@ -190,9 +210,9 @@ private object KotlinResolveDataProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun analyzeExpressionCodeFragment(componentProvider: ComponentProvider, codeFragment: KtCodeFragment): BindingContext {
|
private fun analyzeExpressionCodeFragment(codeFragmentAnalyzer: CodeFragmentAnalyzer, codeFragment: KtCodeFragment): BindingContext {
|
||||||
val trace = BindingTraceContext()
|
val trace = BindingTraceContext()
|
||||||
componentProvider.get<CodeFragmentAnalyzer>().analyzeCodeFragment(
|
codeFragmentAnalyzer.analyzeCodeFragment(
|
||||||
codeFragment,
|
codeFragment,
|
||||||
trace,
|
trace,
|
||||||
BodyResolveMode.PARTIAL_FOR_COMPLETION //TODO: discuss it
|
BodyResolveMode.PARTIAL_FOR_COMPLETION //TODO: discuss it
|
||||||
|
|||||||
Reference in New Issue
Block a user