Move script definition extraction functions to the plugin

plus finish refactoring of these functions
This commit is contained in:
Ilya Chernikov
2019-02-14 10:10:36 +01:00
parent 815fcd062d
commit adb4d264ec
12 changed files with 82 additions and 66 deletions
@@ -16,15 +16,8 @@
package org.jetbrains.kotlin.script
import com.intellij.ide.highlighter.JavaClassFileType
import com.intellij.openapi.components.ServiceManager
import com.intellij.openapi.fileTypes.FileTypeRegistry
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.psi.PsiFile
import com.intellij.psi.PsiManager
import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.psi.KtFile
interface ScriptDefinitionProvider {
fun findScriptDefinition(fileName: String): KotlinScriptDefinition?
@@ -39,41 +32,4 @@ interface ScriptDefinitionProvider {
}
}
fun PsiFile.scriptDefinition(): KotlinScriptDefinition? {
// Do not use psiFile.script, see comments in findScriptDefinition
if (this !is KtFile/* || this.script == null*/) return null
val file = virtualFile ?: originalFile.virtualFile ?: return null
if (file.isNonScript()) return null
return scriptDefinitionByFileName(project, file.name)
}
fun findScriptDefinition(file: VirtualFile, project: Project): KotlinScriptDefinition? {
if (file.isNonScript()) return null
// Do not use psiFile.script here because this method can be called during indexes access
// and accessing stubs may cause deadlock
// TODO: measure performace effect and if necessary consider detecting indexing here or using separate logic for non-IDE operations to speed up filtering
if ((PsiManager.getInstance(project).findFile(file) as? KtFile)/*?.script*/ == null) return null
return scriptDefinitionByFileName(project, file.name)
}
fun scriptDefinitionByFileName(project: Project, fileName: String): KotlinScriptDefinition {
val scriptDefinitionProvider = ScriptDefinitionProvider.getInstance(project) ?: return null
?: throw IllegalStateException("Unable to get script definition: ScriptDefinitionProvider is not configured.")
return scriptDefinitionProvider.findScriptDefinition(fileName) ?: scriptDefinitionProvider.getDefaultScriptDefinition()
}
private fun VirtualFile.isNonScript(): Boolean =
isDirectory ||
extension == KotlinFileType.EXTENSION ||
extension == JavaClassFileType.INSTANCE.defaultExtension ||
!this.isKotlinFileType()
private fun VirtualFile.isKotlinFileType(): Boolean {
val typeRegistry = FileTypeRegistry.getInstance()
return typeRegistry.getFileTypeByFile(this) == KotlinFileType.INSTANCE ||
typeRegistry.getFileTypeByFileName(name) == KotlinFileType.INSTANCE
}