Avoid PsiFile searching when resolving imported scripts descriptors.
This commit is contained in:
committed by
Ilya Chernikov
parent
91a58fffb8
commit
158f7f1cd7
+28
-16
@@ -47,6 +47,7 @@ import java.io.File
|
||||
import kotlin.reflect.KClass
|
||||
import kotlin.reflect.KType
|
||||
import kotlin.script.experimental.api.*
|
||||
import kotlin.script.experimental.host.FileBasedScriptSource
|
||||
import kotlin.script.experimental.host.GetScriptingClass
|
||||
import kotlin.script.experimental.host.ScriptingHostConfiguration
|
||||
import kotlin.script.experimental.host.getScriptingClass
|
||||
@@ -174,29 +175,40 @@ class LazyScriptDescriptor(
|
||||
|
||||
override fun computeSupertypes() = listOf(baseClassDescriptor()?.defaultType ?: builtIns.anyType)
|
||||
|
||||
// TODO: consider passing ScriptSource to avoid psi file fsearching
|
||||
private inner class ImportedScriptDescriptorsFinder {
|
||||
|
||||
val fileManager = VirtualFileManager.getInstance()
|
||||
val localFS = fileManager.getFileSystem(StandardFileSystems.FILE_PROTOCOL)
|
||||
val psiManager = PsiManager.getInstance(scriptInfo.script.project)
|
||||
val localFS by lazy {
|
||||
val fileManager = VirtualFileManager.getInstance()
|
||||
fileManager.getFileSystem(StandardFileSystems.FILE_PROTOCOL)
|
||||
}
|
||||
val psiManager by lazy { PsiManager.getInstance(scriptInfo.script.project) }
|
||||
|
||||
operator fun invoke(importedScriptFile: File): ScriptDescriptor? {
|
||||
operator fun invoke(importedScript: SourceCode): ScriptDescriptor? {
|
||||
// Note: is not an error now - if import references other valid source file, it is simply compiled along with script
|
||||
// TODO: check if this is the behavior we want to have - see #KT-28916
|
||||
val ktScript = getKtFile(importedScript)?.declarations?.firstIsInstanceOrNull<KtScript>()
|
||||
?: return null
|
||||
return resolveSession.getScriptDescriptor(ktScript) as ScriptDescriptor
|
||||
}
|
||||
|
||||
fun errorDescriptor(errorDiagnostic: DiagnosticFactory1<PsiElement, String>?): ScriptDescriptor? {
|
||||
reportErrorString1(errorDiagnostic, importedScriptFile.path)
|
||||
private fun getKtFile(script: SourceCode): KtFile? {
|
||||
if (script is KtFileScriptSource) return script.ktFile
|
||||
|
||||
// TODO: support any kind of ScriptSource.
|
||||
if (script !is FileBasedScriptSource) return null
|
||||
|
||||
fun errorKtFile(errorDiagnostic: DiagnosticFactory1<PsiElement, String>?): KtFile? {
|
||||
reportErrorString1(errorDiagnostic, script.file.path)
|
||||
return null
|
||||
}
|
||||
|
||||
val vfile = localFS.findFileByPath(importedScriptFile.absolutePath)
|
||||
?: return errorDescriptor(MISSING_IMPORTED_SCRIPT_FILE)
|
||||
val psiFile = psiManager.findFile(vfile)
|
||||
?: return errorDescriptor(MISSING_IMPORTED_SCRIPT_PSI)
|
||||
// Note: is not an error now - if import references other valid source file, it is simply compiled along with script
|
||||
// TODO: check if this is the behavior we want to have - see #KT-28916
|
||||
val ktScript = (psiFile as? KtFile)?.declarations?.firstIsInstanceOrNull<KtScript>()
|
||||
?: return null
|
||||
return resolveSession.getScriptDescriptor(ktScript) as ScriptDescriptor
|
||||
val virtualFile = when (script) {
|
||||
is VirtualFileScriptSource -> script.virtualFile
|
||||
else -> localFS.findFileByPath(script.file.absolutePath) ?: return errorKtFile(MISSING_IMPORTED_SCRIPT_FILE)
|
||||
}
|
||||
|
||||
val psiFile = psiManager.findFile(virtualFile) ?: return errorKtFile(MISSING_IMPORTED_SCRIPT_PSI)
|
||||
return psiFile as? KtFile
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+5
-6
@@ -114,7 +114,7 @@ abstract class ScriptCompilationConfigurationWrapper(val script: SourceCode) {
|
||||
abstract val dependenciesSources: List<File>
|
||||
abstract val javaHome: File?
|
||||
abstract val defaultImports: List<String>
|
||||
abstract val importedScripts: List<File>
|
||||
abstract val importedScripts: List<SourceCode>
|
||||
|
||||
override fun equals(other: Any?): Boolean = script == (other as? ScriptCompilationConfigurationWrapper)?.script
|
||||
|
||||
@@ -141,9 +141,8 @@ abstract class ScriptCompilationConfigurationWrapper(val script: SourceCode) {
|
||||
override val defaultImports: List<String>
|
||||
get() = configuration?.get(ScriptCompilationConfiguration.defaultImports).orEmpty()
|
||||
|
||||
override val importedScripts: List<File>
|
||||
get() = configuration?.get(ScriptCompilationConfiguration.importScripts)
|
||||
?.mapNotNull { (it as? FileBasedScriptSource)?.file }.orEmpty()
|
||||
override val importedScripts: List<SourceCode>
|
||||
get() = configuration?.get(ScriptCompilationConfiguration.importScripts).orEmpty()
|
||||
|
||||
@Suppress("OverridingDeprecatedMember")
|
||||
override val legacyDependencies: ScriptDependencies?
|
||||
@@ -178,8 +177,8 @@ abstract class ScriptCompilationConfigurationWrapper(val script: SourceCode) {
|
||||
override val defaultImports: List<String>
|
||||
get() = legacyDependencies?.imports.orEmpty()
|
||||
|
||||
override val importedScripts: List<File>
|
||||
get() = legacyDependencies?.scripts.orEmpty()
|
||||
override val importedScripts: List<SourceCode>
|
||||
get() = legacyDependencies?.scripts?.map { FileScriptSource(it) }.orEmpty()
|
||||
|
||||
override val configuration: ScriptCompilationConfiguration?
|
||||
get() {
|
||||
|
||||
Reference in New Issue
Block a user