Move property with template to script definition interface
This commit is contained in:
@@ -19,7 +19,6 @@ package org.jetbrains.kotlin.cli.jvm.repl
|
|||||||
import com.google.common.base.Throwables
|
import com.google.common.base.Throwables
|
||||||
import com.intellij.openapi.Disposable
|
import com.intellij.openapi.Disposable
|
||||||
import com.intellij.openapi.vfs.CharsetToolkit
|
import com.intellij.openapi.vfs.CharsetToolkit
|
||||||
import com.intellij.openapi.vfs.VirtualFile
|
|
||||||
import com.intellij.psi.PsiFileFactory
|
import com.intellij.psi.PsiFileFactory
|
||||||
import com.intellij.psi.impl.PsiFileFactoryImpl
|
import com.intellij.psi.impl.PsiFileFactoryImpl
|
||||||
import com.intellij.testFramework.LightVirtualFile
|
import com.intellij.testFramework.LightVirtualFile
|
||||||
@@ -38,14 +37,11 @@ import org.jetbrains.kotlin.config.CompilerConfiguration
|
|||||||
import org.jetbrains.kotlin.config.JVMConfigurationKeys
|
import org.jetbrains.kotlin.config.JVMConfigurationKeys
|
||||||
import org.jetbrains.kotlin.descriptors.ScriptDescriptor
|
import org.jetbrains.kotlin.descriptors.ScriptDescriptor
|
||||||
import org.jetbrains.kotlin.idea.KotlinLanguage
|
import org.jetbrains.kotlin.idea.KotlinLanguage
|
||||||
import org.jetbrains.kotlin.name.Name
|
|
||||||
import org.jetbrains.kotlin.parsing.KotlinParserDefinition
|
import org.jetbrains.kotlin.parsing.KotlinParserDefinition
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import org.jetbrains.kotlin.psi.KtScript
|
import org.jetbrains.kotlin.psi.KtScript
|
||||||
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
|
||||||
import org.jetbrains.kotlin.script.KotlinScriptDefinition
|
import org.jetbrains.kotlin.script.KotlinScriptDefinitionFromTemplate
|
||||||
import org.jetbrains.kotlin.script.ScriptParameter
|
|
||||||
import org.jetbrains.kotlin.script.StandardScriptDefinition
|
|
||||||
import java.io.PrintWriter
|
import java.io.PrintWriter
|
||||||
import java.net.URLClassLoader
|
import java.net.URLClassLoader
|
||||||
|
|
||||||
@@ -184,14 +180,8 @@ class ReplInterpreter(
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
private val SCRIPT_RESULT_FIELD_NAME = "\$\$result"
|
private val SCRIPT_RESULT_FIELD_NAME = "\$\$result"
|
||||||
private val REPL_LINE_AS_SCRIPT_DEFINITION = object : KotlinScriptDefinition {
|
private val REPL_LINE_AS_SCRIPT_DEFINITION = object : KotlinScriptDefinitionFromTemplate(Any::class) {
|
||||||
override val name = "Kotlin REPL"
|
override val name = "Kotlin REPL"
|
||||||
|
|
||||||
override fun getScriptParameters(scriptDescriptor: ScriptDescriptor): List<ScriptParameter> = emptyList()
|
|
||||||
|
|
||||||
override fun <TF> isScript(file: TF): Boolean = StandardScriptDefinition.isScript(file)
|
|
||||||
|
|
||||||
override fun getScriptName(script: KtScript): Name = StandardScriptDefinition.getScriptName(script)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun renderStackTrace(cause: Throwable, startFromMethodName: String): String {
|
private fun renderStackTrace(cause: Throwable, startFromMethodName: String): String {
|
||||||
|
|||||||
+7
@@ -27,10 +27,17 @@ import org.jetbrains.kotlin.utils.KotlinPathsFromHomeDir
|
|||||||
import org.jetbrains.kotlin.utils.PathUtil
|
import org.jetbrains.kotlin.utils.PathUtil
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.concurrent.Future
|
import java.util.concurrent.Future
|
||||||
|
import kotlin.reflect.KClass
|
||||||
|
import kotlin.script.StandardScriptTemplate
|
||||||
|
|
||||||
|
|
||||||
data class KotlinConfigurableScriptDefinition(val config: KotlinScriptConfig, val environmentVars: Map<String, List<String>>?) : KotlinScriptDefinition {
|
data class KotlinConfigurableScriptDefinition(val config: KotlinScriptConfig, val environmentVars: Map<String, List<String>>?) : KotlinScriptDefinition {
|
||||||
override val name = config.name
|
override val name = config.name
|
||||||
|
|
||||||
|
// This is a temporary workaround: this class will be removed later
|
||||||
|
override val template: KClass<out Any>
|
||||||
|
get() = StandardScriptTemplate::class
|
||||||
|
|
||||||
override fun getScriptParameters(scriptDescriptor: ScriptDescriptor): List<ScriptParameter> =
|
override fun getScriptParameters(scriptDescriptor: ScriptDescriptor): List<ScriptParameter> =
|
||||||
config.parameters.map { ScriptParameter(Name.identifier(it.name), getKotlinTypeByFqName(scriptDescriptor, it.type)) }
|
config.parameters.map { ScriptParameter(Name.identifier(it.name), getKotlinTypeByFqName(scriptDescriptor, it.type)) }
|
||||||
|
|
||||||
|
|||||||
@@ -43,6 +43,8 @@ import kotlin.script.StandardScriptTemplate
|
|||||||
interface KotlinScriptDefinition {
|
interface KotlinScriptDefinition {
|
||||||
val name: String get() = "Kotlin Script"
|
val name: String get() = "Kotlin Script"
|
||||||
|
|
||||||
|
val template: KClass<out Any>
|
||||||
|
|
||||||
// TODO: consider creating separate type (subtype? for kotlin scripts)
|
// TODO: consider creating separate type (subtype? for kotlin scripts)
|
||||||
val fileType: LanguageFileType get() = KotlinFileType.INSTANCE
|
val fileType: LanguageFileType get() = KotlinFileType.INSTANCE
|
||||||
|
|
||||||
|
|||||||
@@ -81,6 +81,9 @@ data class KotlinScriptConfig(
|
|||||||
@Tag("files")
|
@Tag("files")
|
||||||
var fileNameMatch: String = ".*\\.kts",
|
var fileNameMatch: String = ".*\\.kts",
|
||||||
|
|
||||||
|
@Tag("template")
|
||||||
|
var template: String = "kotlin.script.StandardScriptTemplate",
|
||||||
|
|
||||||
@Tag("classpath")
|
@Tag("classpath")
|
||||||
@AbstractCollection(surroundWithTag = false, elementTag = "path", elementValueAttribute = "")
|
@AbstractCollection(surroundWithTag = false, elementTag = "path", elementValueAttribute = "")
|
||||||
var classpath: MutableList<String> = ArrayList(),
|
var classpath: MutableList<String> = ArrayList(),
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ import kotlin.reflect.KClass
|
|||||||
import kotlin.reflect.memberFunctions
|
import kotlin.reflect.memberFunctions
|
||||||
import kotlin.reflect.primaryConstructor
|
import kotlin.reflect.primaryConstructor
|
||||||
|
|
||||||
open class KotlinScriptDefinitionFromTemplate(val template: KClass<out Any>,
|
open class KotlinScriptDefinitionFromTemplate(final override val template: KClass<out Any>,
|
||||||
val resolver: ScriptDependenciesResolver? = null,
|
val resolver: ScriptDependenciesResolver? = null,
|
||||||
val scriptFilePattern: String? = null,
|
val scriptFilePattern: String? = null,
|
||||||
val environment: Map<String, Any?>? = null
|
val environment: Map<String, Any?>? = null
|
||||||
|
|||||||
@@ -22,19 +22,12 @@ import com.intellij.openapi.util.Pair;
|
|||||||
import com.intellij.psi.PsiErrorElement;
|
import com.intellij.psi.PsiErrorElement;
|
||||||
import com.intellij.util.ArrayUtil;
|
import com.intellij.util.ArrayUtil;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.kotlin.builtins.DefaultBuiltIns;
|
|
||||||
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
|
|
||||||
import org.jetbrains.kotlin.checkers.CheckerTestUtil;
|
import org.jetbrains.kotlin.checkers.CheckerTestUtil;
|
||||||
import org.jetbrains.kotlin.name.Name;
|
|
||||||
import org.jetbrains.kotlin.psi.KtFile;
|
import org.jetbrains.kotlin.psi.KtFile;
|
||||||
import org.jetbrains.kotlin.resolve.AnalyzingUtils;
|
import org.jetbrains.kotlin.resolve.AnalyzingUtils;
|
||||||
import org.jetbrains.kotlin.script.KotlinScriptDefinitionProvider;
|
import org.jetbrains.kotlin.script.KotlinScriptDefinitionProvider;
|
||||||
import org.jetbrains.kotlin.script.ScriptParameter;
|
|
||||||
import org.jetbrains.kotlin.script.StandardScriptDefinition;
|
import org.jetbrains.kotlin.script.StandardScriptDefinition;
|
||||||
import org.jetbrains.kotlin.scripts.SimpleParamsTestScriptDefinition;
|
|
||||||
import org.jetbrains.kotlin.test.KotlinTestUtils;
|
import org.jetbrains.kotlin.test.KotlinTestUtils;
|
||||||
import org.jetbrains.kotlin.types.KotlinType;
|
|
||||||
import org.jetbrains.kotlin.types.Variance;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|||||||
@@ -16,39 +16,10 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.scripts
|
package org.jetbrains.kotlin.scripts
|
||||||
|
|
||||||
import com.intellij.openapi.project.Project
|
|
||||||
import org.jetbrains.kotlin.descriptors.ScriptDescriptor
|
|
||||||
import org.jetbrains.kotlin.name.Name
|
|
||||||
import org.jetbrains.kotlin.psi.KtScript
|
|
||||||
import org.jetbrains.kotlin.script.*
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.net.URL
|
import java.net.URL
|
||||||
import java.net.URLClassLoader
|
import java.net.URLClassLoader
|
||||||
|
|
||||||
abstract class BaseScriptDefinition (val extension: String, val cp: List<File>? = null) : KotlinScriptDefinition {
|
|
||||||
override val name = "Test Kotlin Script"
|
|
||||||
override fun <TF> isScript(file: TF): Boolean = getFileName(file).endsWith(extension)
|
|
||||||
override fun getScriptName(script: KtScript): Name = ScriptNameUtil.fileNameWithExtensionStripped(script, extension)
|
|
||||||
override fun <TF> getDependenciesFor(file: TF, project: Project, previousDependencies: KotlinScriptExternalDependencies?): KotlinScriptExternalDependencies? =
|
|
||||||
object : KotlinScriptExternalDependencies {
|
|
||||||
override val classpath: Iterable<File> = cp ?: (classpathFromProperty() + classpathFromClassloader(BaseScriptDefinition::class.java.classLoader)).distinct()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
open class SimpleParamsWithClasspathTestScriptDefinition(extension: String, val parameters: List<ScriptParameter>, classpath: List<File>? = null)
|
|
||||||
: BaseScriptDefinition(extension, classpath)
|
|
||||||
{
|
|
||||||
override fun getScriptParameters(scriptDescriptor: ScriptDescriptor) = parameters
|
|
||||||
}
|
|
||||||
|
|
||||||
open class SimpleParamsTestScriptDefinition(extension: String, parameters: List<ScriptParameter>) : SimpleParamsWithClasspathTestScriptDefinition(extension, parameters)
|
|
||||||
|
|
||||||
fun classpathFromProperty(): List<File> =
|
|
||||||
System.getProperty("java.class.path")?.let {
|
|
||||||
it.split(String.format("\\%s", File.pathSeparatorChar).toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()
|
|
||||||
.map { File(it) }
|
|
||||||
} ?: emptyList()
|
|
||||||
|
|
||||||
fun URL.toFile() =
|
fun URL.toFile() =
|
||||||
try {
|
try {
|
||||||
File(toURI().schemeSpecificPart)
|
File(toURI().schemeSpecificPart)
|
||||||
@@ -56,10 +27,4 @@ fun URL.toFile() =
|
|||||||
catch (e: java.net.URISyntaxException) {
|
catch (e: java.net.URISyntaxException) {
|
||||||
if (protocol != "file") null
|
if (protocol != "file") null
|
||||||
else File(file)
|
else File(file)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun classpathFromClassloader(classLoader: ClassLoader): List<File> =
|
|
||||||
(classLoader as? URLClassLoader)?.urLs
|
|
||||||
?.mapNotNull { it.toFile() }
|
|
||||||
?: emptyList()
|
|
||||||
|
|
||||||
@@ -55,7 +55,6 @@ import org.jetbrains.kotlin.console.gutter.ConsoleGutterContentProvider
|
|||||||
import org.jetbrains.kotlin.console.gutter.ConsoleIndicatorRenderer
|
import org.jetbrains.kotlin.console.gutter.ConsoleIndicatorRenderer
|
||||||
import org.jetbrains.kotlin.console.gutter.IconWithTooltip
|
import org.jetbrains.kotlin.console.gutter.IconWithTooltip
|
||||||
import org.jetbrains.kotlin.console.gutter.ReplIcons
|
import org.jetbrains.kotlin.console.gutter.ReplIcons
|
||||||
import org.jetbrains.kotlin.descriptors.ScriptDescriptor
|
|
||||||
import org.jetbrains.kotlin.idea.KotlinLanguage
|
import org.jetbrains.kotlin.idea.KotlinLanguage
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.ModuleTestSourceInfo
|
import org.jetbrains.kotlin.idea.caches.resolve.ModuleTestSourceInfo
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
|
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor
|
||||||
@@ -68,9 +67,8 @@ import org.jetbrains.kotlin.psi.moduleInfo
|
|||||||
import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil
|
import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil
|
||||||
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor
|
import org.jetbrains.kotlin.resolve.lazy.descriptors.LazyScriptDescriptor
|
||||||
import org.jetbrains.kotlin.resolve.repl.ReplState
|
import org.jetbrains.kotlin.resolve.repl.ReplState
|
||||||
import org.jetbrains.kotlin.script.KotlinScriptDefinition
|
import org.jetbrains.kotlin.script.KotlinScriptDefinitionFromTemplate
|
||||||
import org.jetbrains.kotlin.script.KotlinScriptDefinitionProvider
|
import org.jetbrains.kotlin.script.KotlinScriptDefinitionProvider
|
||||||
import org.jetbrains.kotlin.script.ScriptParameter
|
|
||||||
import java.awt.Color
|
import java.awt.Color
|
||||||
import java.awt.Font
|
import java.awt.Font
|
||||||
import java.util.concurrent.CountDownLatch
|
import java.util.concurrent.CountDownLatch
|
||||||
@@ -126,7 +124,7 @@ class KotlinConsoleRunner(
|
|||||||
val executor = CommandExecutor(this)
|
val executor = CommandExecutor(this)
|
||||||
var compilerHelper: ConsoleCompilerHelper by Delegates.notNull()
|
var compilerHelper: ConsoleCompilerHelper by Delegates.notNull()
|
||||||
|
|
||||||
private val consoleScriptDefinition = object : KotlinScriptDefinition {
|
private val consoleScriptDefinition = object : KotlinScriptDefinitionFromTemplate(Any::class) {
|
||||||
override val name = "Kotlin REPL"
|
override val name = "Kotlin REPL"
|
||||||
override fun <TF> isScript(file: TF): Boolean {
|
override fun <TF> isScript(file: TF): Boolean {
|
||||||
val vf = when (file) {
|
val vf = when (file) {
|
||||||
@@ -136,7 +134,6 @@ class KotlinConsoleRunner(
|
|||||||
}
|
}
|
||||||
return vf == consoleView.virtualFile
|
return vf == consoleView.virtualFile
|
||||||
}
|
}
|
||||||
override fun getScriptParameters(scriptDescriptor: ScriptDescriptor) = emptyList<ScriptParameter>()
|
|
||||||
override fun getScriptName(script: KtScript) = Name.identifier("REPL")
|
override fun getScriptName(script: KtScript) = Name.identifier("REPL")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user