Refactoring: use KtScript.scriptDefinition instead of KotlinScriptDefinitionProvider.findScriptDefinition if possible

This commit is contained in:
Natalia Selezneva
2018-07-20 16:22:49 +03:00
parent 736361e345
commit f71269009a
9 changed files with 51 additions and 49 deletions
@@ -28,8 +28,7 @@ import kotlin.concurrent.write
import kotlin.script.experimental.dependencies.ScriptDependencies
class CliScriptDependenciesProvider(
private val project: Project,
private val scriptDefinitionProvider: ScriptDefinitionProvider
private val project: Project
) : ScriptDependenciesProvider {
private val cacheLock = ReentrantReadWriteLock()
@@ -45,7 +44,7 @@ class CliScriptDependenciesProvider(
val cached = cache[path]
return if (cached != null) cached
else {
val scriptDef = scriptDefinitionProvider.findScriptDefinition(file)
val scriptDef = findScriptDefinition(file, project)
if (scriptDef != null) {
val result = scriptContentLoader.loadContentsAndResolveDependencies(scriptDef, file)
@@ -603,7 +603,7 @@ class KotlinCoreEnvironment private constructor(
registerService(ScriptDefinitionProvider::class.java, scriptDefinitionProvider)
registerService(
ScriptDependenciesProvider::class.java,
CliScriptDependenciesProvider(projectEnvironment.project, scriptDefinitionProvider)
CliScriptDependenciesProvider(projectEnvironment.project)
)
registerService(KotlinJavaPsiFacade::class.java, KotlinJavaPsiFacade(this))
registerService(KtLightClassForFacade.FacadeStubCache::class.java, KtLightClassForFacade.FacadeStubCache(this))
@@ -38,7 +38,7 @@ import org.jetbrains.kotlin.resolve.scopes.LexicalScopeKind
import org.jetbrains.kotlin.resolve.source.toSourceElement
import org.jetbrains.kotlin.script.KotlinScriptDefinition
import org.jetbrains.kotlin.script.ScriptPriorities
import org.jetbrains.kotlin.script.getScriptDefinition
import org.jetbrains.kotlin.script.findScriptDefinition
import org.jetbrains.kotlin.types.TypeSubstitutor
import kotlin.reflect.KClass
import kotlin.reflect.KType
@@ -69,7 +69,7 @@ class LazyScriptDescriptor(
val scriptDefinition: () -> KotlinScriptDefinition = resolveSession.storageManager.createLazyValue {
val file = scriptInfo.script.containingKtFile
getScriptDefinition(file) ?: throw RuntimeException("file ${file.name} is not a script")
findScriptDefinition(file) ?: throw RuntimeException("file ${file.name} is not a script")
}
override fun substitute(substitutor: TypeSubstitutor) = this
@@ -16,12 +16,15 @@
package org.jetbrains.kotlin.script
import com.intellij.ide.highlighter.JavaClassFileType
import com.intellij.ide.highlighter.JavaFileType
import com.intellij.openapi.components.ServiceManager
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
import java.util.concurrent.locks.ReentrantReadWriteLock
import kotlin.concurrent.read
import kotlin.concurrent.write
@@ -37,18 +40,25 @@ interface ScriptDefinitionProvider {
}
}
fun ScriptDefinitionProvider.findScriptDefinition(file: VirtualFile): KotlinScriptDefinition? =
if (file.isDirectory) null
else findScriptDefinition(file.name)
fun findScriptDefinition(file: VirtualFile, project: Project): KotlinScriptDefinition? {
if (file.isDirectory) return null
if (file.extension == KotlinFileType.EXTENSION || file.extension == JavaClassFileType.INSTANCE.defaultExtension) return null
val psiFile = PsiManager.getInstance(project).findFile(file)
if (psiFile != null) {
if (psiFile !is KtFile || !psiFile.isScript()) {
return null
}
return psiFile.script?.kotlinScriptDefinition?.value
}
fun getScriptDefinition(file: VirtualFile, project: Project): KotlinScriptDefinition? =
if (file.isDirectory) null
else ScriptDefinitionProvider.getInstance(project).findScriptDefinition(file)
return ScriptDefinitionProvider.getInstance(project).findScriptDefinition(file.name)
}
fun getScriptDefinition(psiFile: PsiFile): KotlinScriptDefinition? =
if (psiFile.isDirectory) null
else ScriptDefinitionProvider.getInstance(psiFile.project).findScriptDefinition(psiFile.name)
fun findScriptDefinition(psiFile: PsiFile): KotlinScriptDefinition? {
if (psiFile.isDirectory) return null
return (psiFile as? KtFile)?.script?.kotlinScriptDefinition?.value
}
abstract class LazyScriptDefinitionProvider : ScriptDefinitionProvider {