Scratch: restore information about module in scratch panel after ide restart

This commit is contained in:
Natalia Selezneva
2018-01-19 13:02:43 +03:00
parent 0a274a7e61
commit d6d2d4271b
2 changed files with 42 additions and 9 deletions
@@ -23,9 +23,11 @@ import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.fileEditor.FileEditorManager import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.fileEditor.FileEditorManagerListener import com.intellij.openapi.fileEditor.FileEditorManagerListener
import com.intellij.openapi.module.Module import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.project.Project import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ProjectRootManager import com.intellij.openapi.roots.ProjectRootManager
import com.intellij.openapi.vfs.VirtualFile import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.newvfs.FileAttribute
import com.intellij.psi.PsiManager import com.intellij.psi.PsiManager
import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.idea.caches.resolve.NotUnderContentRootModuleInfo import org.jetbrains.kotlin.idea.caches.resolve.NotUnderContentRootModuleInfo
@@ -36,9 +38,10 @@ import org.jetbrains.kotlin.parsing.KotlinParserDefinition.Companion.STD_SCRIPT_
import org.jetbrains.kotlin.parsing.KotlinParserDefinition.Companion.STD_SCRIPT_SUFFIX import org.jetbrains.kotlin.parsing.KotlinParserDefinition.Companion.STD_SCRIPT_SUFFIX
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.moduleInfo import org.jetbrains.kotlin.psi.moduleInfo
import kotlin.reflect.KProperty
class ScratchFileModuleInfoProvider(project: Project) : AbstractProjectComponent(project) { class ScratchFileModuleInfoProvider(project: Project) : AbstractProjectComponent(project) {
private val LOG =Logger.getInstance(this.javaClass) private val LOG = Logger.getInstance(this.javaClass)
override fun projectOpened() { override fun projectOpened() {
myProject.messageBus.connect(myProject).subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, ScratchFileModuleListener()) myProject.messageBus.connect(myProject).subscribe(FileEditorManagerListener.FILE_EDITOR_MANAGER, ScratchFileModuleListener())
@@ -69,15 +72,25 @@ class ScratchFileModuleInfoProvider(project: Project) : AbstractProjectComponent
return return
} }
getScratchPanel(ktFile)?.let { panel -> val scratchPanel = getEditorWithScratchPanel(source, file)?.second
ktFile.moduleInfo = getModuleInfo(panel.getModule()) scratchPanel?.addModuleListener { psiFile, module ->
psiFile.moduleInfo = getModuleInfo(module)
// Drop caches for old module
ProjectRootManager.getInstance(myProject).incModificationCount()
// Force re-highlighting
DaemonCodeAnalyzer.getInstance(myProject).restart(psiFile)
panel.addModuleListener { psiFile.virtualFile.moduleName = module.name
ktFile.moduleInfo = getModuleInfo(it) }
// Drop caches for old module
ProjectRootManager.getInstance(myProject).incModificationCount() val module =
// Force re-highlighting ktFile.virtualFile.moduleName?.let { ModuleManager.getInstance(myProject).findModuleByName(it) }
DaemonCodeAnalyzer.getInstance(myProject).restart(ktFile) if (module != null) {
scratchPanel?.setModule(module)
} else {
val firstModule = ModuleManager.getInstance(myProject).modules.firstOrNull()
if (firstModule != null) {
scratchPanel?.setModule(firstModule)
} }
} }
} }
@@ -85,4 +98,20 @@ class ScratchFileModuleInfoProvider(project: Project) : AbstractProjectComponent
private fun getModuleInfo(it: Module?) = private fun getModuleInfo(it: Module?) =
it?.testSourceInfo() ?: it?.productionSourceInfo() ?: NotUnderContentRootModuleInfo it?.testSourceInfo() ?: it?.productionSourceInfo() ?: NotUnderContentRootModuleInfo
}
private var VirtualFile.moduleName: String? by ScratchModuleNameProperty()
private val moduleNameAttribute = FileAttribute("ScratchModuleName", 1, false)
private class ScratchModuleNameProperty {
operator fun getValue(file: VirtualFile, property: KProperty<*>): String? {
return moduleNameAttribute.readAttributeBytes(file)?.let { String(it) }
}
operator fun setValue(file: VirtualFile, property: KProperty<*>, newValue: String?) {
if (newValue != null) {
moduleNameAttribute.writeAttributeBytes(file, newValue.toByteArray())
}
}
} }
@@ -70,6 +70,10 @@ class ScratchTopPanel private constructor(val scratchFile: ScratchFile) : JPanel
fun getModule(): Module? = moduleChooser.selectedModule fun getModule(): Module? = moduleChooser.selectedModule
fun setModule(module: Module) {
moduleChooser.selectedModule = module
}
fun addModuleListener(f: (Module) -> Unit) { fun addModuleListener(f: (Module) -> Unit) {
moduleChooser.addActionListener { moduleChooser.addActionListener {
moduleChooser.selectedModule?.let { f(it) } moduleChooser.selectedModule?.let { f(it) }