Refactor script configuration for better functionality separation
This commit is contained in:
+39
-16
@@ -17,43 +17,66 @@
|
|||||||
package org.jetbrains.kotlin.script
|
package org.jetbrains.kotlin.script
|
||||||
|
|
||||||
import com.intellij.openapi.components.AbstractProjectComponent
|
import com.intellij.openapi.components.AbstractProjectComponent
|
||||||
import com.intellij.openapi.diagnostic.Logger
|
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.openapi.util.JDOMUtil
|
import com.intellij.openapi.util.JDOMUtil
|
||||||
import com.intellij.openapi.vfs.VirtualFile
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
import com.intellij.util.xmlb.XmlSerializer
|
import com.intellij.util.xmlb.XmlSerializer
|
||||||
import com.intellij.util.xmlb.annotations.AbstractCollection
|
import com.intellij.util.xmlb.annotations.AbstractCollection
|
||||||
import com.intellij.util.xmlb.annotations.Tag
|
import com.intellij.util.xmlb.annotations.Tag
|
||||||
|
import org.jdom.Document
|
||||||
|
import org.jdom.Element
|
||||||
|
import org.jdom.output.Format
|
||||||
|
import org.jdom.output.XMLOutputter
|
||||||
import org.jetbrains.kotlin.descriptors.ScriptDescriptor
|
import org.jetbrains.kotlin.descriptors.ScriptDescriptor
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.parsing.KotlinParserDefinition
|
import org.jetbrains.kotlin.parsing.KotlinParserDefinition
|
||||||
import org.jetbrains.kotlin.psi.KtScript
|
import org.jetbrains.kotlin.psi.KtScript
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
import java.io.StringWriter
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class KotlinScriptConfigurationManager(project: Project, scriptDefinitionProvider: KotlinScriptDefinitionProvider) : AbstractProjectComponent(project) {
|
|
||||||
private val LOG by lazy { Logger.getInstance(KotlinScriptConfigurationManager::class.java) }
|
|
||||||
|
|
||||||
|
val SCRIPT_CONFIG_FILE_EXTENSION = ".ktscfg.xml"
|
||||||
|
|
||||||
|
class KotlinScriptConfigurationManager(project: Project, scriptDefinitionProvider: KotlinScriptDefinitionProvider) : AbstractProjectComponent(project) {
|
||||||
init {
|
init {
|
||||||
val scriptDefs = arrayListOf<KotlinScriptDefinition>()
|
loadScriptDefinitionsFromDirectoryWithConfigs(File(project.basePath ?: ".")).let {
|
||||||
File(project.basePath ?: ".").listFiles().forEach {
|
if (it.isNotEmpty()) {
|
||||||
if (it.name.endsWith(".ktscfg.xml")) {
|
scriptDefinitionProvider.setScriptDefinitions(it + StandardScriptDefinition)
|
||||||
val doc = JDOMUtil.loadDocument(it)
|
|
||||||
doc.rootElement.children.forEach {
|
|
||||||
val def = XmlSerializer.deserialize(it, KotlinScriptConfig::class.java)
|
|
||||||
if (def != null)
|
|
||||||
scriptDefs.add(KotlinConfigurableScriptDefinition(def))
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (scriptDefs.isNotEmpty()) {
|
|
||||||
scriptDefs.add(StandardScriptDefinition)
|
|
||||||
scriptDefinitionProvider.setScriptDefinitions(scriptDefs)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun loadScriptDefinitionsFromDirectoryWithConfigs(dir: File): List<KotlinConfigurableScriptDefinition> =
|
||||||
|
dir.listFiles { file -> file.name.endsWith(SCRIPT_CONFIG_FILE_EXTENSION, ignoreCase = true) }
|
||||||
|
.flatMap (::loadScriptDefinitionsFromConfig)
|
||||||
|
|
||||||
|
fun loadScriptDefinitionsFromConfig(configFile: File): List<KotlinConfigurableScriptDefinition> =
|
||||||
|
JDOMUtil.loadDocument(configFile).rootElement.children.mapNotNull {
|
||||||
|
XmlSerializer.deserialize(it, KotlinScriptConfig::class.java)?.let {
|
||||||
|
KotlinConfigurableScriptDefinition(it)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("unused")
|
||||||
|
fun generateSampleScriptConfig(): String {
|
||||||
|
|
||||||
|
val doc = Document(Element("KotlinScriptDefinitions"))
|
||||||
|
val element = XmlSerializer.serialize(
|
||||||
|
KotlinScriptConfig(name = "abc", fileNameMatch = ".*\\.kts", classpath = arrayListOf("aaa", "bbb"),
|
||||||
|
parameters = arrayListOf(KotlinScriptParameterConfig("p1", "t1"))))
|
||||||
|
doc.rootElement.addContent(element)
|
||||||
|
|
||||||
|
val sw = StringWriter()
|
||||||
|
with (XMLOutputter()) {
|
||||||
|
format = Format.getPrettyFormat()
|
||||||
|
output(doc, sw)
|
||||||
|
}
|
||||||
|
return sw.toString()
|
||||||
|
}
|
||||||
|
|
||||||
@Tag("scriptParam")
|
@Tag("scriptParam")
|
||||||
class KotlinScriptParameterConfig(@Tag("name") var name: String = "",
|
class KotlinScriptParameterConfig(@Tag("name") var name: String = "",
|
||||||
@Tag("type") var type: String = "")
|
@Tag("type") var type: String = "")
|
||||||
|
|||||||
Reference in New Issue
Block a user