Introduce ScratchPanelListener to set module in the created panel (KT-30049)
^KT-30049 Fixed
This commit is contained in:
+36
-44
@@ -17,18 +17,15 @@
|
|||||||
package org.jetbrains.kotlin.idea.scratch
|
package org.jetbrains.kotlin.idea.scratch
|
||||||
|
|
||||||
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer
|
import com.intellij.codeInsight.daemon.DaemonCodeAnalyzer
|
||||||
import com.intellij.ide.scratch.ScratchFileService
|
|
||||||
import com.intellij.openapi.components.ProjectComponent
|
import com.intellij.openapi.components.ProjectComponent
|
||||||
import com.intellij.openapi.diagnostic.Logger
|
import com.intellij.openapi.diagnostic.Logger
|
||||||
import com.intellij.openapi.fileEditor.FileEditorManager
|
|
||||||
import com.intellij.openapi.fileEditor.FileEditorManagerListener
|
|
||||||
import com.intellij.openapi.module.ModuleManager
|
import com.intellij.openapi.module.ModuleManager
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.openapi.vfs.VirtualFile
|
|
||||||
import com.intellij.psi.PsiManager
|
|
||||||
import org.jetbrains.kotlin.idea.KotlinFileType
|
import org.jetbrains.kotlin.idea.KotlinFileType
|
||||||
import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesModificationTracker
|
import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesModificationTracker
|
||||||
import org.jetbrains.kotlin.idea.core.script.scriptRelatedModuleName
|
import org.jetbrains.kotlin.idea.core.script.scriptRelatedModuleName
|
||||||
|
import org.jetbrains.kotlin.idea.scratch.ui.ScratchPanelListener
|
||||||
|
import org.jetbrains.kotlin.idea.scratch.ui.ScratchTopPanel
|
||||||
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
||||||
import org.jetbrains.kotlin.parsing.KotlinParserDefinition.Companion.STD_SCRIPT_EXT
|
import org.jetbrains.kotlin.parsing.KotlinParserDefinition.Companion.STD_SCRIPT_EXT
|
||||||
import org.jetbrains.kotlin.parsing.KotlinParserDefinition.Companion.STD_SCRIPT_SUFFIX
|
import org.jetbrains.kotlin.parsing.KotlinParserDefinition.Companion.STD_SCRIPT_SUFFIX
|
||||||
@@ -38,48 +35,43 @@ class ScratchFileModuleInfoProvider(val project: Project) : ProjectComponent {
|
|||||||
private val LOG = Logger.getInstance(this.javaClass)
|
private val LOG = Logger.getInstance(this.javaClass)
|
||||||
|
|
||||||
override fun projectOpened() {
|
override fun projectOpened() {
|
||||||
project.messageBus.connect(project).subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, ScratchFileModuleListener())
|
project.messageBus.connect().subscribe(ScratchPanelListener.TOPIC, object : ScratchPanelListener {
|
||||||
}
|
override fun panelAdded(panel: ScratchTopPanel) {
|
||||||
|
val ktFile = panel.scratchFile.getPsiFile() as? KtFile ?: return
|
||||||
|
val file = ktFile.virtualFile ?: return
|
||||||
|
|
||||||
private inner class ScratchFileModuleListener : FileEditorManagerListener {
|
// BUNCH: 181 scratch files are created with .kt extension
|
||||||
override fun fileOpened(source: FileEditorManager, file: VirtualFile) {
|
if (file.extension == KotlinFileType.EXTENSION) {
|
||||||
if (!file.isValid) return
|
runWriteAction {
|
||||||
if (!ScratchFileService.isInScratchRoot(file)) return
|
var newName = file.nameWithoutExtension + STD_SCRIPT_EXT
|
||||||
|
var i = 1
|
||||||
val ktFile = PsiManager.getInstance(project).findFile(file) as? KtFile ?: return
|
while (file.parent.findChild(newName) != null) {
|
||||||
|
newName = file.nameWithoutExtension + "_" + i + STD_SCRIPT_EXT
|
||||||
// BUNCH: 181 scratch files are created with .kt extension
|
i++
|
||||||
if (file.extension == KotlinFileType.EXTENSION) {
|
}
|
||||||
runWriteAction {
|
file.rename(this, newName)
|
||||||
var newName = file.nameWithoutExtension + STD_SCRIPT_EXT
|
|
||||||
var i = 1
|
|
||||||
while (file.parent.findChild(newName) != null) {
|
|
||||||
newName = file.nameWithoutExtension + "_" + i + STD_SCRIPT_EXT
|
|
||||||
i++
|
|
||||||
}
|
}
|
||||||
file.rename(this, newName)
|
}
|
||||||
|
|
||||||
|
if (file.extension != STD_SCRIPT_SUFFIX) {
|
||||||
|
LOG.error("Kotlin Scratch file should have .kts extension. Cannot add scratch panel for ${file.path}")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
panel.addModuleListener { psiFile, module ->
|
||||||
|
psiFile.virtualFile.scriptRelatedModuleName = module?.name
|
||||||
|
|
||||||
|
// Drop caches for old module
|
||||||
|
ScriptDependenciesModificationTracker.getInstance(project).incModificationCount()
|
||||||
|
// Force re-highlighting
|
||||||
|
DaemonCodeAnalyzer.getInstance(project).restart(psiFile)
|
||||||
|
}
|
||||||
|
|
||||||
|
val module = ktFile.virtualFile.scriptRelatedModuleName?.let { ModuleManager.getInstance(project).findModuleByName(it) }
|
||||||
|
if (module != null) {
|
||||||
|
panel.setModule(module)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
})
|
||||||
if (file.extension != STD_SCRIPT_SUFFIX) {
|
|
||||||
LOG.error("Kotlin Scratch file should have .kts extension. Cannot add scratch panel for ${file.path}")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
val scratchPanel = getEditorWithScratchPanel(source, file)?.second
|
|
||||||
scratchPanel?.addModuleListener { psiFile, module ->
|
|
||||||
psiFile.virtualFile.scriptRelatedModuleName = module?.name
|
|
||||||
|
|
||||||
// Drop caches for old module
|
|
||||||
ScriptDependenciesModificationTracker.getInstance(project).incModificationCount()
|
|
||||||
// Force re-highlighting
|
|
||||||
DaemonCodeAnalyzer.getInstance(project).restart(psiFile)
|
|
||||||
}
|
|
||||||
|
|
||||||
val module = ktFile.virtualFile.scriptRelatedModuleName?.let { ModuleManager.getInstance(project).findModuleByName(it) }
|
|
||||||
if (module != null) {
|
|
||||||
scratchPanel?.setModule(module)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -13,7 +13,9 @@ import com.intellij.openapi.project.Project
|
|||||||
import com.intellij.openapi.util.Disposer
|
import com.intellij.openapi.util.Disposer
|
||||||
import com.intellij.openapi.util.Key
|
import com.intellij.openapi.util.Key
|
||||||
import com.intellij.openapi.vfs.VirtualFile
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
|
import org.jetbrains.kotlin.idea.scratch.ui.ScratchPanelListener
|
||||||
import org.jetbrains.kotlin.idea.scratch.ui.ScratchTopPanel
|
import org.jetbrains.kotlin.idea.scratch.ui.ScratchTopPanel
|
||||||
|
import org.jetbrains.kotlin.idea.syncPublisherWithDisposeCheck
|
||||||
import org.jetbrains.kotlin.psi.UserDataProperty
|
import org.jetbrains.kotlin.psi.UserDataProperty
|
||||||
|
|
||||||
internal val LOG = Logger.getInstance("#org.jetbrains.kotlin.idea.scratch")
|
internal val LOG = Logger.getInstance("#org.jetbrains.kotlin.idea.scratch")
|
||||||
@@ -53,6 +55,7 @@ fun TextEditor.addScratchPanel(panel: ScratchTopPanel) {
|
|||||||
FileEditorManager.getInstance(panel.scratchFile.project).addTopComponent(this, panel)
|
FileEditorManager.getInstance(panel.scratchFile.project).addTopComponent(this, panel)
|
||||||
|
|
||||||
Disposer.register(this, panel)
|
Disposer.register(this, panel)
|
||||||
|
panel.scratchFile.project.syncPublisherWithDisposeCheck(ScratchPanelListener.TOPIC).panelAdded(panel)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun TextEditor.removeScratchPanel() {
|
fun TextEditor.removeScratchPanel() {
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import com.intellij.openapi.vfs.VirtualFile
|
|||||||
import com.intellij.psi.PsiFile
|
import com.intellij.psi.PsiFile
|
||||||
import com.intellij.psi.PsiManager
|
import com.intellij.psi.PsiManager
|
||||||
import com.intellij.ui.components.panels.HorizontalLayout
|
import com.intellij.ui.components.panels.HorizontalLayout
|
||||||
|
import com.intellij.util.messages.Topic
|
||||||
import org.jetbrains.annotations.TestOnly
|
import org.jetbrains.annotations.TestOnly
|
||||||
import org.jetbrains.kotlin.idea.caches.project.productionSourceInfo
|
import org.jetbrains.kotlin.idea.caches.project.productionSourceInfo
|
||||||
import org.jetbrains.kotlin.idea.caches.project.testSourceInfo
|
import org.jetbrains.kotlin.idea.caches.project.testSourceInfo
|
||||||
@@ -179,3 +180,11 @@ class ScratchTopPanel private constructor(val scratchFile: ScratchFile) : JPanel
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
interface ScratchPanelListener {
|
||||||
|
fun panelAdded(panel: ScratchTopPanel)
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
val TOPIC = Topic.create("ScratchPanelListener", ScratchPanelListener::class.java)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user