FIR IDE: do not use helper methods unavailable in intellij-core

This commit is contained in:
Ilya Kirillov
2021-06-14 16:27:58 +02:00
parent 32919489f4
commit 7fe2adc37e
5 changed files with 24 additions and 15 deletions
@@ -7,13 +7,14 @@ package org.jetbrains.kotlin.idea.frontend.api
import com.intellij.openapi.Disposable import com.intellij.openapi.Disposable
import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.components.service import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.progress.ProgressIndicator import com.intellij.openapi.progress.ProgressIndicator
import com.intellij.openapi.progress.Task import com.intellij.openapi.progress.Task
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.Computable
import org.jetbrains.kotlin.idea.frontend.api.tokens.AlwaysAccessibleValidityTokenFactory import org.jetbrains.kotlin.idea.frontend.api.tokens.AlwaysAccessibleValidityTokenFactory
import org.jetbrains.kotlin.idea.frontend.api.tokens.ReadActionConfinementValidityTokenFactory import org.jetbrains.kotlin.idea.frontend.api.tokens.ReadActionConfinementValidityTokenFactory
import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityTokenFactory import org.jetbrains.kotlin.idea.frontend.api.tokens.ValidityTokenFactory
import org.jetbrains.kotlin.idea.util.application.runReadAction
import org.jetbrains.kotlin.psi.KtElement import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
@@ -65,6 +66,11 @@ abstract class KtAnalysisSessionProvider : Disposable {
} }
override fun dispose() {} override fun dispose() {}
companion object {
fun getInstance(project: Project): KtAnalysisSessionProvider =
ServiceManager.getService(project, KtAnalysisSessionProvider::class.java)
}
} }
/** /**
@@ -81,8 +87,7 @@ abstract class KtAnalysisSessionProvider : Disposable {
*/ */
@OptIn(InvalidWayOfUsingAnalysisSession::class) @OptIn(InvalidWayOfUsingAnalysisSession::class)
inline fun <R> analyse(contextElement: KtElement, action: KtAnalysisSession.() -> R): R = inline fun <R> analyse(contextElement: KtElement, action: KtAnalysisSession.() -> R): R =
contextElement.project KtAnalysisSessionProvider.getInstance(contextElement.project)
.service<KtAnalysisSessionProvider>()
.analyse(contextElement, ReadActionConfinementValidityTokenFactory, action) .analyse(contextElement, ReadActionConfinementValidityTokenFactory, action)
@OptIn(InvalidWayOfUsingAnalysisSession::class) @OptIn(InvalidWayOfUsingAnalysisSession::class)
@@ -91,7 +96,8 @@ inline fun <R> analyseWithCustomToken(
tokenFactory: ValidityTokenFactory, tokenFactory: ValidityTokenFactory,
action: KtAnalysisSession.() -> R action: KtAnalysisSession.() -> R
): R = ): R =
contextElement.project.service<KtAnalysisSessionProvider>().analyse(contextElement, tokenFactory, action) KtAnalysisSessionProvider.getInstance(contextElement.project)
.analyse(contextElement, tokenFactory, action)
/** /**
* UAST-specific version of [analyse] that executes the given [action] in [KtAnalysisSession] context * UAST-specific version of [analyse] that executes the given [action] in [KtAnalysisSession] context
@@ -109,7 +115,8 @@ inline fun <R> analyseInDependedAnalysisSession(
elementToReanalyze: KtElement, elementToReanalyze: KtElement,
action: KtAnalysisSession.() -> R action: KtAnalysisSession.() -> R
): R = ): R =
originalFile.project.service<KtAnalysisSessionProvider>().analyseInDependedAnalysisSession(originalFile, elementToReanalyze, action) KtAnalysisSessionProvider.getInstance(originalFile.project)
.analyseInDependedAnalysisSession(originalFile, elementToReanalyze, action)
/** /**
* Execute given [action] in [KtAnalysisSession] context like [analyse] does but execute it in read action * Execute given [action] in [KtAnalysisSession] context like [analyse] does but execute it in read action
@@ -126,9 +133,9 @@ inline fun <R> analyseInDependedAnalysisSession(
inline fun <R> analyseWithReadAction( inline fun <R> analyseWithReadAction(
contextElement: KtElement, contextElement: KtElement,
crossinline action: KtAnalysisSession.() -> R crossinline action: KtAnalysisSession.() -> R
): R = runReadAction { ): R = ApplicationManager.getApplication().runReadAction(Computable {
analyse(contextElement, action) analyse(contextElement, action)
} })
/** /**
* Show a modal window with a progress bar and specified [windowTitle] * Show a modal window with a progress bar and specified [windowTitle]
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.idea.frontend.api
import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol import org.jetbrains.kotlin.idea.frontend.api.symbols.KtSymbol
import org.jetbrains.kotlin.idea.references.KtReference import org.jetbrains.kotlin.idea.references.KtReference
import org.jetbrains.kotlin.idea.references.KtSimpleReference
interface KtSymbolBasedReference : KtReference { interface KtSymbolBasedReference : KtReference {
fun KtAnalysisSession.resolveToSymbols(): Collection<KtSymbol> fun KtAnalysisSession.resolveToSymbols(): Collection<KtSymbol>
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.idea.fir.low.level.api package org.jetbrains.kotlin.idea.fir.low.level.api
import com.intellij.openapi.components.service import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ProjectRootModificationTracker import com.intellij.openapi.roots.ProjectRootModificationTracker
import org.jetbrains.annotations.TestOnly import org.jetbrains.annotations.TestOnly
@@ -35,7 +35,8 @@ internal class FirIdeResolveStateService(project: Project) {
stateCache.computeIfAbsent(moduleInfo) { createResolveStateFor(moduleInfo, sessionProviderStorage) } stateCache.computeIfAbsent(moduleInfo) { createResolveStateFor(moduleInfo, sessionProviderStorage) }
companion object { companion object {
fun getInstance(project: Project): FirIdeResolveStateService = project.service() fun getInstance(project: Project): FirIdeResolveStateService =
ServiceManager.getService(project, FirIdeResolveStateService::class.java)
internal fun createResolveStateFor( internal fun createResolveStateFor(
moduleInfo: IdeaModuleInfo, moduleInfo: IdeaModuleInfo,
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.idea.fir.low.level.api.providers package org.jetbrains.kotlin.idea.fir.low.level.api.providers
import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.FirSession
@@ -21,7 +22,7 @@ import org.jetbrains.kotlin.fir.scopes.FirKotlinScopeProvider
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.*
import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo
import org.jetbrains.kotlin.idea.fir.low.level.api.IndexHelper import org.jetbrains.kotlin.idea.fir.low.level.api.IndexHelper
import org.jetbrains.kotlin.idea.fir.low.level.api.PackageExistenceCheckerForSingleModule import org.jetbrains.kotlin.idea.fir.low.level.api.api.FirModuleResolveStateConfigurator
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.FirFileBuilder
import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache import org.jetbrains.kotlin.idea.fir.low.level.api.file.builder.ModuleFileCache
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
@@ -41,7 +42,8 @@ internal class FirIdeProvider(
override val symbolProvider: FirSymbolProvider = SymbolProvider() override val symbolProvider: FirSymbolProvider = SymbolProvider()
private val indexHelper = IndexHelper(project, searchScope) private val indexHelper = IndexHelper(project, searchScope)
private val packageExistenceChecker = PackageExistenceCheckerForSingleModule(project, moduleInfo) private val packageExistenceChecker = ServiceManager.getService(project, FirModuleResolveStateConfigurator::class.java)
.createPackageExistingCheckerForModule(moduleInfo)
private val providerHelper = FirProviderHelper( private val providerHelper = FirProviderHelper(
cache, cache,
@@ -5,7 +5,7 @@
package org.jetbrains.kotlin.idea.frontend.api.fir package org.jetbrains.kotlin.idea.frontend.api.fir
import com.intellij.openapi.components.service import com.intellij.openapi.components.ServiceManager
import org.jetbrains.kotlin.idea.frontend.api.InvalidWayOfUsingAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.InvalidWayOfUsingAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSession
import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSessionProvider import org.jetbrains.kotlin.idea.frontend.api.KtAnalysisSessionProvider
@@ -21,7 +21,7 @@ internal inline fun <R> analyzeWithSymbolAsContext(
require(contextSymbol is KtFirSymbol<*>) require(contextSymbol is KtFirSymbol<*>)
val resolveState = contextSymbol.firRef.resolveState val resolveState = contextSymbol.firRef.resolveState
val token = contextSymbol.token val token = contextSymbol.token
val analysisSessionProvider = resolveState.project.service<KtAnalysisSessionProvider>() val analysisSessionProvider = ServiceManager.getService(resolveState.project, KtAnalysisSessionProvider::class.java)
check(analysisSessionProvider is KtFirAnalysisSessionProvider) check(analysisSessionProvider is KtFirAnalysisSessionProvider)
val analysisSession = analysisSessionProvider.getCachedAnalysisSession(resolveState, token) val analysisSession = analysisSessionProvider.getCachedAnalysisSession(resolveState, token)
?: throw EntityWasGarbageCollectedException("KtAnalysisSession") ?: throw EntityWasGarbageCollectedException("KtAnalysisSession")