From 28b01126d98bccb284f289e78611f4a664b9e549 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Fri, 2 Dec 2016 17:02:09 +0100 Subject: [PATCH] Improve type boundaries for KotlinScriptDefinition interface --- .../kotlin/script/KotlinScriptDefinition.kt | 4 ++-- .../KotlinScriptDefinitionFromAnnotatedTemplate.kt | 12 ++++++------ .../script/KotlinScriptDefinitionProvider.kt | 4 ++-- .../script/KotlinScriptExternalImportsProvider.kt | 14 +++++++------- .../org/jetbrains/kotlin/script/scriptFileUtil.kt | 12 ++++++------ .../kotlin/console/KotlinConsoleRunner.kt | 2 +- 6 files changed, 24 insertions(+), 24 deletions(-) diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt index d60e2c42eea..f83c3458ec3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt @@ -37,13 +37,13 @@ open class KotlinScriptDefinition(val template: KClass) { open val annotationsForSamWithReceivers: List get() = emptyList() - open fun isScript(file: TF): Boolean = + open fun isScript(file: TF): Boolean = getFileName(file).endsWith(KotlinParserDefinition.STD_SCRIPT_EXT) open fun getScriptName(script: KtScript): Name = ScriptNameUtil.fileNameWithExtensionStripped(script, KotlinParserDefinition.STD_SCRIPT_EXT) - open fun getDependenciesFor(file: TF, project: Project, previousDependencies: KotlinScriptExternalDependencies?): KotlinScriptExternalDependencies? = null + open fun getDependenciesFor(file: TF, project: Project, previousDependencies: KotlinScriptExternalDependencies?): KotlinScriptExternalDependencies? = null } interface KotlinScriptExternalDependencies : Comparable { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionFromAnnotatedTemplate.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionFromAnnotatedTemplate.kt index 49795a92077..9895c1c06bf 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionFromAnnotatedTemplate.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionFromAnnotatedTemplate.kt @@ -81,19 +81,19 @@ open class KotlinScriptDefinitionFromAnnotatedTemplate( override val name = template.simpleName!! - override fun isScript(file: TF): Boolean = + override fun isScript(file: TF): Boolean = scriptFilePattern.let { Regex(it).matches(getFileName(file)) } // TODO: implement other strategy - e.g. try to extract something from match with ScriptFilePattern override fun getScriptName(script: KtScript): Name = ScriptNameUtil.fileNameWithExtensionStripped(script, KotlinParserDefinition.STD_SCRIPT_EXT) - override fun getDependenciesFor(file: TF, project: Project, previousDependencies: KotlinScriptExternalDependencies?): KotlinScriptExternalDependencies? { + override fun getDependenciesFor(file: TF, project: Project, previousDependencies: KotlinScriptExternalDependencies?): KotlinScriptExternalDependencies? { fun logClassloadingError(ex: Throwable) { logScriptDefMessage(ScriptDependenciesResolver.ReportSeverity.WARNING, ex.message ?: "Invalid script template: ${template.qualifiedName}", null) } - val script = BasicScriptContents(file, getAnnotations = { + fun makeScriptContents() = BasicScriptContents(file, getAnnotations = { val classLoader = (template as Any).javaClass.classLoader try { getAnnotationEntries(file, project) @@ -112,7 +112,7 @@ open class KotlinScriptDefinitionFromAnnotatedTemplate( }) try { - val fileDeps = resolver?.resolve(script, environment, ::logScriptDefMessage, previousDependencies) + val fileDeps = resolver?.resolve(makeScriptContents(), environment, ::logScriptDefMessage, previousDependencies) // TODO: use it as a Future return fileDeps?.get() } @@ -122,7 +122,7 @@ open class KotlinScriptDefinitionFromAnnotatedTemplate( return null } - private fun getAnnotationEntries(file: TF, project: Project): Iterable = when (file) { + private fun getAnnotationEntries(file: TF, project: Project): Iterable = when (file) { is PsiFile -> getAnnotationEntriesFromPsiFile(file) is VirtualFile -> getAnnotationEntriesFromVirtualFile(file, project) is File -> { @@ -143,7 +143,7 @@ open class KotlinScriptDefinitionFromAnnotatedTemplate( return getAnnotationEntriesFromPsiFile(psiFile) } - class BasicScriptContents(myFile: TF, getAnnotations: () -> Iterable) : ScriptContents { + class BasicScriptContents(myFile: TF, getAnnotations: () -> Iterable) : ScriptContents { override val file: File? by lazy { getFile(myFile) } override val annotations: Iterable by lazy { getAnnotations() } override val text: CharSequence? by lazy { getFileContents(myFile) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt index 7d9402c07a4..f3124fa7fe3 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt @@ -44,11 +44,11 @@ class KotlinScriptDefinitionProvider { return changed } - fun findScriptDefinition(file: TF): KotlinScriptDefinition? = definitionsLock.read { + fun findScriptDefinition(file: TF): KotlinScriptDefinition? = definitionsLock.read { definitions.firstOrNull { it.isScript(file) } } - fun isScript(file: TF): Boolean = findScriptDefinition(file) != null + fun isScript(file: TF): Boolean = findScriptDefinition(file) != null fun addScriptDefinition(scriptDefinition: KotlinScriptDefinition) { definitionsLock.write { diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptExternalImportsProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptExternalImportsProvider.kt index 2ace7dfdf14..7da97944b66 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptExternalImportsProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptExternalImportsProvider.kt @@ -31,13 +31,13 @@ class KotlinScriptExternalImportsProvider(val project: Project, private val scri private val cache = hashMapOf() private val cacheOfNulls = hashSetOf() - fun getExternalImports(file: TF): KotlinScriptExternalDependencies? = cacheLock.read { calculateExternalDependencies(file) } + fun getExternalImports(file: TF): KotlinScriptExternalDependencies? = cacheLock.read { calculateExternalDependencies(file) } - fun getExternalImports(files: Iterable): List = cacheLock.read { + fun getExternalImports(files: Iterable): List = cacheLock.read { files.mapNotNull { calculateExternalDependencies(it) } } - private fun calculateExternalDependencies(file: TF): KotlinScriptExternalDependencies? { + private fun calculateExternalDependencies(file: TF): KotlinScriptExternalDependencies? { val path = getFilePath(file) return cache[path] ?: if (cacheOfNulls.contains(path)) null @@ -56,7 +56,7 @@ class KotlinScriptExternalImportsProvider(val project: Project, private val scri } // optimized for initial caching, additional handling of possible duplicates to save a call to distinct - fun cacheExternalImports(files: Iterable): Unit = cacheLock.write { + fun cacheExternalImports(files: Iterable): Unit = cacheLock.write { val uncached = hashSetOf() files.forEach { file -> val path = getFilePath(file) @@ -130,9 +130,9 @@ class KotlinScriptExternalImportsProvider(val project: Project, private val scri } } - fun invalidateCachesFor(vararg files: TF) { invalidateCachesFor(files.asIterable()) } + fun invalidateCachesFor(vararg files: TF) { invalidateCachesFor(files.asIterable()) } - fun invalidateCachesFor(files: Iterable) { + fun invalidateCachesFor(files: Iterable) { cacheLock.write { files.forEach { file -> val path = getFilePath(file) @@ -150,7 +150,7 @@ class KotlinScriptExternalImportsProvider(val project: Project, private val scri cache.values.flatMap { it.sources } }.distinct() - fun getCombinedClasspathFor(files: Iterable): List = + fun getCombinedClasspathFor(files: Iterable): List = getExternalImports(files) .flatMap { it.classpath } .distinct() diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/scriptFileUtil.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/scriptFileUtil.kt index be32c3b484a..7e6703563b2 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/scriptFileUtil.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/scriptFileUtil.kt @@ -21,42 +21,42 @@ import com.intellij.psi.PsiFile import java.io.File import java.io.InputStream -fun getFileName(file: TF): String = when (file) { +fun getFileName(file: TF): String = when (file) { is PsiFile -> file.originalFile.name is VirtualFile -> file.name is File -> file.name else -> throw IllegalArgumentException("Unsupported file type $file") } -fun getFilePath(file: TF): String = when (file) { +fun getFilePath(file: TF): String = when (file) { is PsiFile -> file.originalFile.run { virtualFile?.path ?: name } // TODO: replace name with path of PSI elements is VirtualFile -> file.path is File -> file.canonicalPath else -> throw IllegalArgumentException("Unsupported file type $file") } -fun isValidFile(file: TF): Boolean = when (file) { +fun isValidFile(file: TF): Boolean = when (file) { is PsiFile -> file.isValid is VirtualFile -> file.isValid is File -> file.exists() && file.isFile else -> throw IllegalArgumentException("Unsupported file type $file") } -fun getFile(file: TF): File? = when (file) { +fun getFile(file: TF): File? = when (file) { is PsiFile -> file.originalFile.run { File(virtualFile?.path) } is VirtualFile -> File(file.path) is File -> file else -> throw IllegalArgumentException("Unsupported file type $file") } -fun getFileContents(file: TF): CharSequence = when (file) { +fun getFileContents(file: TF): CharSequence = when (file) { is PsiFile -> file.viewProvider.contents is VirtualFile -> file.inputStream.reader(charset = file.charset).readText() is File -> file.readText() else -> throw IllegalArgumentException("Unsupported file type $file") } -fun getFileContentsStream(file: TF): InputStream = when (file) { +fun getFileContentsStream(file: TF): InputStream = when (file) { is PsiFile -> file.viewProvider.contents.toString().byteInputStream() is VirtualFile -> file.inputStream is File -> file.inputStream() diff --git a/idea/idea-repl/src/org/jetbrains/kotlin/console/KotlinConsoleRunner.kt b/idea/idea-repl/src/org/jetbrains/kotlin/console/KotlinConsoleRunner.kt index 7b42006c354..46f437bb338 100644 --- a/idea/idea-repl/src/org/jetbrains/kotlin/console/KotlinConsoleRunner.kt +++ b/idea/idea-repl/src/org/jetbrains/kotlin/console/KotlinConsoleRunner.kt @@ -126,7 +126,7 @@ class KotlinConsoleRunner( private val consoleScriptDefinition = object : KotlinScriptDefinition(Any::class) { override val name = "Kotlin REPL" - override fun isScript(file: TF): Boolean { + override fun isScript(file: TF): Boolean { val vf = when (file) { is PsiFile -> file.originalFile.virtualFile is VirtualFile -> file