From 0862928bf70a7881391caad3f9f3b25ba7b863b3 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Wed, 16 Dec 2020 22:21:33 +0100 Subject: [PATCH] FIR IDE: move KotlinOutOfBlockModificationTrackerFactory to frontend independent module --- ...KotlinFE10OutOfBlockModificationTracker.kt | 20 ++++++++++++++++ .../level/api/FirIdeResolveStateService.kt | 3 ++- .../sessions/FirIdeSessionProviderStorage.kt | 5 ++-- ...FirOutOfBlockModificationTrackerFactory.kt | 13 ++++------- ...OutOfBlockKotlinModificationTrackerTest.kt | 4 ++-- .../KotlinModuleOutOfBlockTrackerTest.kt | 1 + .../AbstractMemoryLeakInSymbolsTest.kt | 3 ++- ...linOutOfBlockModificationTrackerFactory.kt | 23 +++++++++++++++++++ .../resources-descriptors/META-INF/plugin.xml | 3 +++ idea/resources-fir/META-INF/plugin.xml | 3 ++- 10 files changed, 61 insertions(+), 17 deletions(-) create mode 100644 idea/idea-analysis/src/org/jetbrains/kotlin/trackers/KotlinFE10OutOfBlockModificationTracker.kt create mode 100644 idea/idea-frontend-independent/src/org/jetbrains/kotlin/trackers/KotlinOutOfBlockModificationTrackerFactory.kt diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/trackers/KotlinFE10OutOfBlockModificationTracker.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/trackers/KotlinFE10OutOfBlockModificationTracker.kt new file mode 100644 index 00000000000..ac191961816 --- /dev/null +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/trackers/KotlinFE10OutOfBlockModificationTracker.kt @@ -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") +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeResolveStateService.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeResolveStateService.kt index 69f5e4609b5..9ab4158ef0b 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeResolveStateService.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/FirIdeResolveStateService.kt @@ -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().createProjectWideOutOfBlockModificationTracker(), + project.createProjectWideOutOfBlockModificationTracker(), ProjectRootModificationTracker.getInstance(project), ) { ConcurrentHashMap() diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionProviderStorage.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionProviderStorage.kt index bd6454f6234..687b6718ba0 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionProviderStorage.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionProviderStorage.kt @@ -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() - .createModuleWithoutDependenciesOutOfBlockModificationTracker(firSession.moduleInfo.module) + private val modificationTracker = firSession.moduleInfo.module.createModuleWithoutDependenciesOutOfBlockModificationTracker() private val timeStamp = modificationTracker.modificationCount diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/trackers/KotlinFirOutOfBlockModificationTrackerFactory.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/trackers/KotlinFirOutOfBlockModificationTrackerFactory.kt index a5ab7fdee93..bb9a4be06d9 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/trackers/KotlinFirOutOfBlockModificationTrackerFactory.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/trackers/KotlinFirOutOfBlockModificationTrackerFactory.kt @@ -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().createProjectWideOutOfBlockModificationTracker() - -fun Module.createModuleWithoutDependenciesOutOfBlockModificationTracker() = - project.service().createModuleWithoutDependenciesOutOfBlockModificationTracker(this) - private class KotlinFirOutOfBlockModificationTracker(project: Project) : ModificationTracker { private val trackerService = project.service() diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/trackers/AbstractProjectWideOutOfBlockKotlinModificationTrackerTest.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/trackers/AbstractProjectWideOutOfBlockKotlinModificationTrackerTest.kt index c1ec05132c6..319746f8da0 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/trackers/AbstractProjectWideOutOfBlockKotlinModificationTrackerTest.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/trackers/AbstractProjectWideOutOfBlockKotlinModificationTrackerTest.kt @@ -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().createProjectWideOutOfBlockModificationTracker() + val tracker = project.createProjectWideOutOfBlockModificationTracker() val initialModificationCount = tracker.modificationCount myFixture.type(textToType) PsiDocumentManager.getInstance(project).commitAllDocuments() diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/trackers/KotlinModuleOutOfBlockTrackerTest.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/trackers/KotlinModuleOutOfBlockTrackerTest.kt index af6a808c70c..d34b3d764f8 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/trackers/KotlinModuleOutOfBlockTrackerTest.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/tests/org/jetbrains/kotlin/idea/fir/low/level/api/trackers/KotlinModuleOutOfBlockTrackerTest.kt @@ -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 diff --git a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/frontend/api/symbols/AbstractMemoryLeakInSymbolsTest.kt b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/frontend/api/symbols/AbstractMemoryLeakInSymbolsTest.kt index 095b7ad9089..328af9cd589 100644 --- a/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/frontend/api/symbols/AbstractMemoryLeakInSymbolsTest.kt +++ b/idea/idea-frontend-fir/tests/org/jetbrains/kotlin/idea/frontend/api/symbols/AbstractMemoryLeakInSymbolsTest.kt @@ -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().incrementModificationsCount() + (project.service() as KotlinFirOutOfBlockModificationTrackerFactory).incrementModificationsCount() (project.service() as KtFirAnalysisSessionProvider).clearCaches() executeOnPooledThreadInReadAction { analyze(ktFile) {} } } diff --git a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/trackers/KotlinOutOfBlockModificationTrackerFactory.kt b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/trackers/KotlinOutOfBlockModificationTrackerFactory.kt new file mode 100644 index 00000000000..7ae5d394b35 --- /dev/null +++ b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/trackers/KotlinOutOfBlockModificationTrackerFactory.kt @@ -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().createProjectWideOutOfBlockModificationTracker() + +fun Module.createModuleWithoutDependenciesOutOfBlockModificationTracker() = + project.service().createModuleWithoutDependenciesOutOfBlockModificationTracker(this) \ No newline at end of file diff --git a/idea/resources-descriptors/META-INF/plugin.xml b/idea/resources-descriptors/META-INF/plugin.xml index 7eb10ab8e9c..981f882d453 100644 --- a/idea/resources-descriptors/META-INF/plugin.xml +++ b/idea/resources-descriptors/META-INF/plugin.xml @@ -127,6 +127,9 @@ The Kotlin plugin provides language support in IntelliJ IDEA and Android Studio. + + diff --git a/idea/resources-fir/META-INF/plugin.xml b/idea/resources-fir/META-INF/plugin.xml index c766425df21..47ca6a926f4 100644 --- a/idea/resources-fir/META-INF/plugin.xml +++ b/idea/resources-fir/META-INF/plugin.xml @@ -131,7 +131,8 @@ The Kotlin FIR plugin provides language support in IntelliJ IDEA and Android Stu - +