Use module name from userData to get module info for scratch file

This commit is contained in:
Natalia Selezneva
2018-03-19 14:19:21 +03:00
parent 31266e49d0
commit c1dd86d323
3 changed files with 42 additions and 31 deletions
@@ -22,23 +22,17 @@ import com.intellij.openapi.components.AbstractProjectComponent
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.fileEditor.FileEditorManagerListener
import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleManager
import com.intellij.openapi.project.Project
import com.intellij.openapi.roots.ProjectRootManager
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.newvfs.FileAttribute
import com.intellij.psi.PsiManager
import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.idea.caches.project.NotUnderContentRootModuleInfo
import org.jetbrains.kotlin.idea.caches.project.moduleInfo
import org.jetbrains.kotlin.idea.caches.project.productionSourceInfo
import org.jetbrains.kotlin.idea.caches.project.testSourceInfo
import org.jetbrains.kotlin.idea.core.script.scriptRelatedModuleName
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_SUFFIX
import org.jetbrains.kotlin.psi.KtFile
import kotlin.reflect.KProperty
class ScratchFileModuleInfoProvider(project: Project) : AbstractProjectComponent(project) {
private val LOG = Logger.getInstance(this.javaClass)
@@ -74,17 +68,15 @@ class ScratchFileModuleInfoProvider(project: Project) : AbstractProjectComponent
val scratchPanel = getEditorWithScratchPanel(source, file)?.second
scratchPanel?.addModuleListener { psiFile, module ->
psiFile.moduleInfo = getModuleInfo(module)
psiFile.virtualFile.scriptRelatedModuleName = module.name
// Drop caches for old module
ProjectRootManager.getInstance(myProject).incModificationCount()
// Force re-highlighting
DaemonCodeAnalyzer.getInstance(myProject).restart(psiFile)
psiFile.virtualFile.moduleName = module.name
}
val module =
ktFile.virtualFile.moduleName?.let { ModuleManager.getInstance(myProject).findModuleByName(it) }
val module = ktFile.virtualFile.scriptRelatedModuleName?.let { ModuleManager.getInstance(myProject).findModuleByName(it) }
if (module != null) {
scratchPanel?.setModule(module)
} else {
@@ -95,23 +87,4 @@ class ScratchFileModuleInfoProvider(project: Project) : AbstractProjectComponent
}
}
}
private fun getModuleInfo(it: Module?) =
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())
}
}
}