FIR IDE: move KotlinOutOfBlockModificationTrackerFactory to frontend independent module

This commit is contained in:
Ilya Kirillov
2020-12-16 22:21:33 +01:00
parent a30d9e0ed3
commit 0862928bf7
10 changed files with 61 additions and 17 deletions
@@ -0,0 +1,20 @@
/*
* 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.trackers
import com.intellij.openapi.module.Module
import com.intellij.openapi.util.ModificationTracker
class KotlinFE10OutOfBlockModificationTracker : KotlinOutOfBlockModificationTrackerFactory() {
override fun createProjectWideOutOfBlockModificationTracker(): ModificationTracker =
throwUnsupportedError()
override fun createModuleWithoutDependenciesOutOfBlockModificationTracker(module: Module): ModificationTracker =
throwUnsupportedError()
private fun throwUnsupportedError(): Nothing =
error("Supported only for FIR plugin now, sorry, consider using KotlinModificationTrackerService instead")
}
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.sessions.FirIdeSessionProvide
import org.jetbrains.kotlin.idea.fir.low.level.api.trackers.KotlinFirOutOfBlockModificationTrackerFactory
import org.jetbrains.kotlin.idea.util.cachedValue
import org.jetbrains.kotlin.idea.util.getValue
import org.jetbrains.kotlin.trackers.createProjectWideOutOfBlockModificationTracker
import java.util.concurrent.ConcurrentHashMap
internal class FirIdeResolveStateService(project: Project) {
@@ -24,7 +25,7 @@ internal class FirIdeResolveStateService(project: Project) {
private val stateCache by cachedValue(
project,
project.service<KotlinFirOutOfBlockModificationTrackerFactory>().createProjectWideOutOfBlockModificationTracker(),
project.createProjectWideOutOfBlockModificationTracker(),
ProjectRootModificationTracker.getInstance(project),
) {
ConcurrentHashMap<IdeaModuleInfo, FirModuleResolveStateImpl>()
@@ -5,7 +5,6 @@
package org.jetbrains.kotlin.idea.fir.low.level.api.sessions
import com.intellij.openapi.components.service
import com.intellij.openapi.project.Project
import kotlinx.collections.immutable.PersistentMap
import kotlinx.collections.immutable.persistentMapOf
@@ -17,6 +16,7 @@ import org.jetbrains.kotlin.idea.fir.low.level.api.FirTransformerProvider
import org.jetbrains.kotlin.idea.fir.low.level.api.trackers.KotlinFirOutOfBlockModificationTrackerFactory
import org.jetbrains.kotlin.idea.fir.low.level.api.util.addValueFor
import org.jetbrains.kotlin.idea.fir.low.level.api.util.executeWithoutPCE
import org.jetbrains.kotlin.trackers.createModuleWithoutDependenciesOutOfBlockModificationTracker
import java.util.concurrent.ConcurrentHashMap
internal class FirIdeSessionProviderStorage(private val project: Project) {
@@ -113,8 +113,7 @@ private class FromModuleViewSessionCache(
private class FirSessionWithModificationTracker(
val firSession: FirIdeSourcesSession,
) {
private val modificationTracker = firSession.project.service<KotlinFirOutOfBlockModificationTrackerFactory>()
.createModuleWithoutDependenciesOutOfBlockModificationTracker(firSession.moduleInfo.module)
private val modificationTracker = firSession.moduleInfo.module.createModuleWithoutDependenciesOutOfBlockModificationTracker()
private val timeStamp = modificationTracker.modificationCount
@@ -10,12 +10,13 @@ import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.ModificationTracker
import org.jetbrains.annotations.TestOnly
import org.jetbrains.kotlin.trackers.KotlinOutOfBlockModificationTrackerFactory
class KotlinFirOutOfBlockModificationTrackerFactory(private val project: Project) {
fun createProjectWideOutOfBlockModificationTracker(): ModificationTracker =
class KotlinFirOutOfBlockModificationTrackerFactory(private val project: Project) : KotlinOutOfBlockModificationTrackerFactory() {
override fun createProjectWideOutOfBlockModificationTracker(): ModificationTracker =
KotlinFirOutOfBlockModificationTracker(project)
fun createModuleWithoutDependenciesOutOfBlockModificationTracker(module: Module): ModificationTracker =
override fun createModuleWithoutDependenciesOutOfBlockModificationTracker(module: Module): ModificationTracker =
KotlinFirOutOfBlockModuleModificationTracker(module)
@TestOnly
@@ -24,12 +25,6 @@ class KotlinFirOutOfBlockModificationTrackerFactory(private val project: Project
}
}
fun Project.createProjectWideOutOfBlockModificationTracker() =
service<KotlinFirOutOfBlockModificationTrackerFactory>().createProjectWideOutOfBlockModificationTracker()
fun Module.createModuleWithoutDependenciesOutOfBlockModificationTracker() =
project.service<KotlinFirOutOfBlockModificationTrackerFactory>().createModuleWithoutDependenciesOutOfBlockModificationTracker(this)
private class KotlinFirOutOfBlockModificationTracker(project: Project) : ModificationTracker {
private val trackerService = project.service<KotlinFirModificationTrackerService>()
@@ -5,12 +5,12 @@
package org.jetbrains.kotlin.idea.fir.low.level.api.trackers
import com.intellij.openapi.components.service
import com.intellij.openapi.util.io.FileUtil
import com.intellij.psi.PsiDocumentManager
import junit.framework.Assert
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.test.InTextDirectivesUtils
import org.jetbrains.kotlin.trackers.createProjectWideOutOfBlockModificationTracker
import java.io.File
abstract class AbstractProjectWideOutOfBlockKotlinModificationTrackerTest : KotlinLightCodeInsightFixtureTestCase() {
@@ -23,7 +23,7 @@ abstract class AbstractProjectWideOutOfBlockKotlinModificationTrackerTest : Kotl
val textToType = InTextDirectivesUtils.findStringWithPrefixes(fileText, "// TYPE:") ?: DEFAULT_TEXT_TO_TYPE
val outOfBlock = InTextDirectivesUtils.getPrefixedBoolean(fileText, "// OUT_OF_BLOCK:")
?: error("Please, specify should out of block change happen or not by `// OUT_OF_BLOCK:` directive")
val tracker = project.service<KotlinFirOutOfBlockModificationTrackerFactory>().createProjectWideOutOfBlockModificationTracker()
val tracker = project.createProjectWideOutOfBlockModificationTracker()
val initialModificationCount = tracker.modificationCount
myFixture.type(textToType)
PsiDocumentManager.getInstance(project).commitAllDocuments()
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.idea.util.rootManager
import org.jetbrains.kotlin.idea.util.sourceRoots
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.trackers.createModuleWithoutDependenciesOutOfBlockModificationTracker
import java.nio.file.Files
import kotlin.io.path.ExperimentalPathApi
import kotlin.io.path.writeText
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.psiUtil.collectDescendantsOfType
import org.jetbrains.kotlin.trackers.KotlinOutOfBlockModificationTrackerFactory
import java.io.File
abstract class AbstractMemoryLeakInSymbolsTest : KotlinLightCodeInsightFixtureTestCase() {
@@ -51,7 +52,7 @@ abstract class AbstractMemoryLeakInSymbolsTest : KotlinLightCodeInsightFixtureTe
@OptIn(InvalidWayOfUsingAnalysisSession::class)
private fun invalidateAllCaches(ktFile: KtFile) {
project.service<KotlinFirOutOfBlockModificationTrackerFactory>().incrementModificationsCount()
(project.service<KotlinOutOfBlockModificationTrackerFactory>() as KotlinFirOutOfBlockModificationTrackerFactory).incrementModificationsCount()
(project.service<KtAnalysisSessionProvider>() as KtFirAnalysisSessionProvider).clearCaches()
executeOnPooledThreadInReadAction { analyze(ktFile) {} }
}
@@ -0,0 +1,23 @@
/*
* 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.trackers
import com.intellij.openapi.components.service
import com.intellij.openapi.module.Module
import com.intellij.openapi.project.Project
import com.intellij.openapi.util.ModificationTracker
abstract class KotlinOutOfBlockModificationTrackerFactory {
abstract fun createProjectWideOutOfBlockModificationTracker(): ModificationTracker
abstract fun createModuleWithoutDependenciesOutOfBlockModificationTracker(module: Module): ModificationTracker
}
fun Project.createProjectWideOutOfBlockModificationTracker() =
service<KotlinOutOfBlockModificationTrackerFactory>().createProjectWideOutOfBlockModificationTracker()
fun Module.createModuleWithoutDependenciesOutOfBlockModificationTracker() =
project.service<KotlinOutOfBlockModificationTrackerFactory>().createModuleWithoutDependenciesOutOfBlockModificationTracker(this)
@@ -127,6 +127,9 @@ The Kotlin plugin provides language support in IntelliJ IDEA and Android Studio.
<highlightingPassFactory implementation="org.jetbrains.kotlin.idea.refactoring.cutPaste.MoveDeclarationsPassFactory$Registrar"/>
<projectService serviceImplementation="org.jetbrains.kotlin.idea.caches.trackers.KotlinCodeBlockModificationListener"/>
<projectService serviceInterface="org.jetbrains.kotlin.trackers.KotlinOutOfBlockModificationTrackerFactory"
serviceImplementation="org.jetbrains.kotlin.trackers.KotlinFE10OutOfBlockModificationTracker"/>
<statistics.counterUsagesCollector groupId="kotlin.gradle.target" version="2"/>
<statistics.counterUsagesCollector groupId="kotlin.maven.target" version="3"/>
+2 -1
View File
@@ -131,7 +131,8 @@ The Kotlin FIR plugin provides language support in IntelliJ IDEA and Android Stu
<highlightingPassFactory implementation="org.jetbrains.kotlin.idea.fir.highlighter.KotlinDiagnosticHighlightingPassFactory"/>
<projectService serviceImplementation="org.jetbrains.kotlin.idea.fir.low.level.api.trackers.KotlinFirModificationTrackerService"/>
<projectService serviceImplementation="org.jetbrains.kotlin.idea.fir.low.level.api.trackers.KotlinFirOutOfBlockModificationTrackerFactory"/>
<projectService serviceInterface="org.jetbrains.kotlin.trackers.KotlinOutOfBlockModificationTrackerFactory"
serviceImplementation="org.jetbrains.kotlin.idea.fir.low.level.api.trackers.KotlinFirOutOfBlockModificationTrackerFactory"/>
<psi.treeChangePreprocessor implementation="org.jetbrains.kotlin.idea.fir.low.level.api.trackers.KotlinOutOfBlockPsiTreeChangePreprocessor"/>
</extensions>