Scripts: pass File finding script definition instead of File.name

This commit is contained in:
Natalia Selezneva
2019-07-09 12:49:44 +03:00
parent ac4df86fa6
commit fbe965be9d
8 changed files with 36 additions and 25 deletions
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.scripting.definitions
import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.project.Project
import java.io.File
interface ScriptDefinitionProvider {
@Deprecated("Migrating to configuration refinement", level = DeprecationLevel.ERROR)
@@ -15,9 +16,9 @@ interface ScriptDefinitionProvider {
@Deprecated("Migrating to configuration refinement", level = DeprecationLevel.ERROR)
fun getDefaultScriptDefinition(): KotlinScriptDefinition
fun isScript(fileName: String): Boolean
fun isScript(file: File): Boolean
fun findDefinition(fileName: String): ScriptDefinition?
fun findDefinition(file: File): ScriptDefinition?
fun getDefaultDefinition(): ScriptDefinition
fun getKnownFilenameExtensions(): Sequence<String>
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.scripting.definitions
import com.intellij.ide.highlighter.JavaFileType
import org.jetbrains.kotlin.idea.KotlinFileType
import java.io.File
import java.util.concurrent.locks.ReentrantReadWriteLock
import kotlin.concurrent.read
import kotlin.concurrent.write
@@ -44,15 +45,19 @@ abstract class LazyScriptDefinitionProvider : ScriptDefinitionProvider {
fileName.endsWith(it, ignoreCase = true)
}
override fun findDefinition(fileName: String): ScriptDefinition? =
if (nonScriptFileName(fileName)) null
override fun findDefinition(file: File): ScriptDefinition? =
if (nonScriptFileName(file.name)) null
else lock.read {
cachedDefinitions.firstOrNull { it.isScript(fileName) }
cachedDefinitions.firstOrNull { it.isScript(file) }
}
override fun findScriptDefinition(fileName: String): KotlinScriptDefinition? = findDefinition(fileName)?.legacyDefinition
override fun findScriptDefinition(fileName: String): KotlinScriptDefinition? =
if (nonScriptFileName(fileName)) null
else lock.read {
cachedDefinitions.map { it.legacyDefinition }.firstOrNull { it.isScript(fileName) }
}
override fun isScript(fileName: String) = findDefinition(fileName) != null
override fun isScript(file: File) = findDefinition(file) != null
override fun getKnownFilenameExtensions(): Sequence<String> = lock.read {
cachedDefinitions.map { it.fileExtension }
@@ -27,7 +27,7 @@ abstract class ScriptDefinition : UserDataHolderBase() {
abstract val compilationConfiguration: ScriptCompilationConfiguration
abstract val evaluationConfiguration: ScriptEvaluationConfiguration?
abstract fun isScript(fileName: String): Boolean
abstract fun isScript(file: File): Boolean
abstract val fileExtension: String
abstract val name: String
// TODO: used in settings, find out the reason and refactor accordingly
@@ -68,7 +68,7 @@ abstract class ScriptDefinition : UserDataHolderBase() {
)
}
override fun isScript(fileName: String): Boolean = legacyDefinition.isScript(fileName)
override fun isScript(file: File): Boolean = legacyDefinition.isScript(file.name)
override val fileExtension: String get() = legacyDefinition.fileExtension
@@ -116,7 +116,7 @@ abstract class ScriptDefinition : UserDataHolderBase() {
)
}
override fun isScript(fileName: String): Boolean = fileName.endsWith(".$fileExtension")
override fun isScript(file: File): Boolean = file.name.endsWith(".$fileExtension")
override val fileExtension: String get() = compilationConfiguration[ScriptCompilationConfiguration.fileExtension]!!
@@ -15,6 +15,7 @@ import com.intellij.psi.PsiFile
import com.intellij.psi.PsiManager
import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.psi.KtFile
import java.io.File
inline fun <T> runReadAction(crossinline runnable: () -> T): T {
return ApplicationManager.getApplication().runReadAction(Computable { runnable() })
@@ -26,7 +27,7 @@ fun PsiFile.findScriptDefinition(): ScriptDefinition? {
val file = virtualFile ?: originalFile.virtualFile ?: return null
if (file.isNonScript()) return null
return findScriptDefinitionByFileName(project, file.name)
return findScriptDefinitionByFilePath(project, File(file.path))
}
fun VirtualFile.findScriptDefinition(project: Project): ScriptDefinition? {
@@ -37,14 +38,14 @@ fun VirtualFile.findScriptDefinition(project: Project): ScriptDefinition? {
if (runReadAction { PsiManager.getInstance(project).findFile(this) as? KtFile }/*?.script*/ == null) return null
return findScriptDefinitionByFileName(project, name)
return findScriptDefinitionByFilePath(project, File(path))
}
fun findScriptDefinitionByFileName(project: Project, fileName: String): ScriptDefinition {
fun findScriptDefinitionByFilePath(project: Project, file: File): ScriptDefinition {
val scriptDefinitionProvider = ScriptDefinitionProvider.getInstance(project) ?: return null
?: throw IllegalStateException("Unable to get script definition: ScriptDefinitionProvider is not configured.")
return scriptDefinitionProvider.findDefinition(fileName) ?: scriptDefinitionProvider.getDefaultDefinition()
return scriptDefinitionProvider.findDefinition(file) ?: scriptDefinitionProvider.getDefaultDefinition()
}
internal fun VirtualFile.isNonScript(): Boolean =