Use module name from userData to get module info for scratch file
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
|
||||
package org.jetbrains.kotlin.idea.caches.project
|
||||
|
||||
import com.intellij.ide.scratch.ScratchFileService
|
||||
import com.intellij.openapi.module.Module
|
||||
import com.intellij.openapi.module.ModuleManager
|
||||
import com.intellij.openapi.project.Project
|
||||
@@ -21,6 +22,7 @@ import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade
|
||||
import org.jetbrains.kotlin.asJava.elements.KtLightElement
|
||||
import org.jetbrains.kotlin.idea.caches.lightClasses.KtLightClassForDecompiledDeclaration
|
||||
import org.jetbrains.kotlin.idea.core.script.ScriptDependenciesManager
|
||||
import org.jetbrains.kotlin.idea.core.script.scriptRelatedModuleName
|
||||
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
|
||||
import org.jetbrains.kotlin.idea.util.isInSourceContentWithoutInjected
|
||||
import org.jetbrains.kotlin.idea.util.isKotlinBinary
|
||||
@@ -230,6 +232,11 @@ private inline fun <T> collectInfosByVirtualFile(
|
||||
it.toIdeaModuleInfo(project, virtualFile, treatAsLibrarySource)?.let(onOccurrence)
|
||||
}
|
||||
|
||||
if (ScratchFileService.isInScratchRoot(virtualFile)) {
|
||||
val scratchModule = virtualFile.scriptRelatedModuleName?.let { ModuleManager.getInstance(project).findModuleByName(it) }
|
||||
onOccurrence(scratchModule?.testSourceInfo() ?: scratchModule?.productionSourceInfo())
|
||||
}
|
||||
|
||||
val scriptDefinition = getScriptDefinition(virtualFile, project)
|
||||
if (scriptDefinition != null) {
|
||||
onOccurrence(ScriptModuleInfo(project, virtualFile, scriptDefinition))
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* Copyright 2010-2018 JetBrains s.r.o. 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.idea.core.script
|
||||
|
||||
import com.intellij.openapi.vfs.VirtualFile
|
||||
import com.intellij.openapi.vfs.VirtualFileWithId
|
||||
import com.intellij.openapi.vfs.newvfs.FileAttribute
|
||||
import kotlin.reflect.KProperty
|
||||
|
||||
var VirtualFile.scriptRelatedModuleName: String? by ScratchModuleNameProperty()
|
||||
|
||||
private val moduleNameAttribute = FileAttribute("kotlin-script-moduleName", 1, false)
|
||||
private class ScratchModuleNameProperty {
|
||||
|
||||
operator fun getValue(file: VirtualFile, property: KProperty<*>): String? {
|
||||
if (file !is VirtualFileWithId) return null
|
||||
|
||||
return moduleNameAttribute.readAttributeBytes(file)?.let { String(it) }
|
||||
}
|
||||
|
||||
operator fun setValue(file: VirtualFile, property: KProperty<*>, newValue: String?) {
|
||||
if (file !is VirtualFileWithId) return
|
||||
|
||||
if (newValue != null) {
|
||||
moduleNameAttribute.writeAttributeBytes(file, newValue.toByteArray())
|
||||
}
|
||||
}
|
||||
}
|
||||
+4
-31
@@ -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())
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user