Improve class name generation for scripts and REPL snippets

- allow to override default name/scheme
- implement host/engine specific names for jsr223 to avoid classloading
  clashes (also fix "eval in eval" test)
This commit is contained in:
Ilya Chernikov
2019-09-16 14:13:09 +02:00
parent 6de05bb2c7
commit d3b826c71d
7 changed files with 43 additions and 7 deletions
@@ -31,6 +31,7 @@ abstract class ScriptDefinition : UserDataHolderBase() {
abstract fun isScript(file: File): Boolean
abstract val fileExtension: String
abstract val name: String
open val defaultClassName: String = "Script"
// TODO: used in settings, find out the reason and refactor accordingly
abstract val definitionId: String
@@ -138,6 +139,9 @@ abstract class ScriptDefinition : UserDataHolderBase() {
compilationConfiguration[ScriptCompilationConfiguration.displayName]?.takeIf { it.isNotBlank() }
?: compilationConfiguration[ScriptCompilationConfiguration.baseClass]!!.typeName.substringAfterLast('.')
override val defaultClassName: String
get() = compilationConfiguration[ScriptCompilationConfiguration.defaultIdentifier] ?: super.defaultClassName
override val definitionId: String get() = compilationConfiguration[ScriptCompilationConfiguration.baseClass]!!.typeName
override val contextClassLoader: ClassLoader? by lazy {
@@ -291,7 +291,7 @@ fun SourceCode.getVirtualFile(definition: ScriptDefinition): VirtualFile {
val vFile = LocalFileSystem.getInstance().findFileByIoFile(file)
if (vFile != null) return vFile
}
val scriptName = withCorrectExtension(name ?: "script", definition.fileExtension)
val scriptName = withCorrectExtension(name ?: definition.defaultClassName, definition.fileExtension)
val scriptPath = when (this) {
is FileScriptSource -> file.path
is ExternalSourceCode -> externalLocation.toString()