From 770ef16ef7b1c7f0a2686da6307d8f2efecde0fa Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Wed, 1 Jun 2016 12:15:51 +0200 Subject: [PATCH] Replace script recognition from by PsiFile to by virtual file, fix custom script name generation --- .../kotlin/cli/jvm/repl/ReplInterpreter.kt | 4 ++-- .../org/jetbrains/kotlin/parsing/KotlinParser.java | 2 +- .../src/org/jetbrains/kotlin/psi/KtScript.java | 2 +- .../lazy/descriptors/LazyScriptClassMemberScope.kt | 2 +- .../lazy/descriptors/LazyScriptDescriptor.kt | 2 +- .../script/KotlinScriptConfigurationManager.kt | 14 +++++--------- .../kotlin/script/KotlinScriptDefinition.kt | 6 +++--- .../script/KotlinScriptDefinitionProvider.kt | 6 +++--- .../kotlin/scripts/TestScriptDefinitions.kt | 4 ++-- .../kotlin/console/KotlinConsoleRunner.kt | 4 ++-- 10 files changed, 21 insertions(+), 25 deletions(-) diff --git a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplInterpreter.kt b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplInterpreter.kt index 07a55f4dfcf..b217d38c8b5 100644 --- a/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplInterpreter.kt +++ b/compiler/cli/src/org/jetbrains/kotlin/cli/jvm/repl/ReplInterpreter.kt @@ -19,7 +19,7 @@ package org.jetbrains.kotlin.cli.jvm.repl import com.google.common.base.Throwables import com.intellij.openapi.Disposable import com.intellij.openapi.vfs.CharsetToolkit -import com.intellij.psi.PsiFile +import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiFileFactory import com.intellij.psi.impl.PsiFileFactoryImpl import com.intellij.testFramework.LightVirtualFile @@ -239,7 +239,7 @@ class ReplInterpreter( override fun getScriptParameters(scriptDescriptor: ScriptDescriptor): List = emptyList() - override fun isScript(file: PsiFile): Boolean = StandardScriptDefinition.isScript(file) + override fun isScript(file: VirtualFile): Boolean = StandardScriptDefinition.isScript(file) override fun getScriptName(script: KtScript): Name = StandardScriptDefinition.getScriptName(script) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinParser.java b/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinParser.java index ffb39b9dc48..19c8d6f681b 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinParser.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/parsing/KotlinParser.java @@ -43,7 +43,7 @@ public class KotlinParser implements PsiParser { @NotNull public ASTNode parse(IElementType iElementType, PsiBuilder psiBuilder, PsiFile psiFile) { KotlinParsing jetParsing = KotlinParsing.createForTopLevel(new SemanticWhitespaceAwarePsiBuilderImpl(psiBuilder)); - if (scriptDefinitionProvider != null && scriptDefinitionProvider.isScript(psiFile) + if (scriptDefinitionProvider != null && scriptDefinitionProvider.isScript(psiFile.getOriginalFile().getVirtualFile()) || psiFile.getName().endsWith(KotlinParserDefinition.STD_SCRIPT_EXT)) { jetParsing.parseScript(); } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtScript.java b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtScript.java index da2bd9318e5..a7a7e2ebd44 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/psi/KtScript.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/psi/KtScript.java @@ -47,7 +47,7 @@ public class KtScript extends KtNamedDeclarationStub implement } KtFile containingKtFile = getContainingKtFile(); KotlinScriptDefinition kotlinScriptDefinition = - KotlinScriptDefinitionProvider.getInstance(getProject()).findScriptDefinition(containingKtFile); + KotlinScriptDefinitionProvider.getInstance(getProject()).findScriptDefinition(containingKtFile.getOriginalFile().getVirtualFile()); assert kotlinScriptDefinition != null : "Should not parse a script without definition"; return containingKtFile.getPackageFqName().child(kotlinScriptDefinition.getScriptName(this)); } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt index d7949b3681d..a3f2c2a2cb2 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptClassMemberScope.kt @@ -55,7 +55,7 @@ class LazyScriptClassMemberScope( private fun createScriptParameters(constructor: ConstructorDescriptorImpl): List { val file = scriptDescriptor.scriptInfo.script.getContainingKtFile() - val scriptDefinition = KotlinScriptDefinitionProvider.getInstance(file.project).findScriptDefinition(file) ?: + val scriptDefinition = KotlinScriptDefinitionProvider.getInstance(file.project).findScriptDefinition(file.originalFile.virtualFile) ?: throw RuntimeException("file ${file.name} is not a script") return scriptDefinition.getScriptParameters(scriptDescriptor).mapIndexed { index, scriptParameter -> ValueParameterDescriptorImpl( diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptDescriptor.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptDescriptor.kt index 5df1d003814..6f88c2b8d81 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptDescriptor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/lazy/descriptors/LazyScriptDescriptor.kt @@ -58,7 +58,7 @@ class LazyScriptDescriptor( private val scriptDefinition: KotlinScriptDefinition by lazy { val file = scriptInfo.script.getContainingKtFile() - KotlinScriptDefinitionProvider.getInstance(file.project).findScriptDefinition(file) ?: + KotlinScriptDefinitionProvider.getInstance(file.project).findScriptDefinition(file.originalFile.virtualFile) ?: throw RuntimeException("file ${file.name} is not a script") } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptConfigurationManager.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptConfigurationManager.kt index 56ca699c672..fdb2b22b3cf 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptConfigurationManager.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptConfigurationManager.kt @@ -20,20 +20,16 @@ import com.intellij.openapi.components.AbstractProjectComponent import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.project.Project import com.intellij.openapi.util.JDOMUtil -import com.intellij.psi.PsiFile +import com.intellij.openapi.vfs.VirtualFile import com.intellij.util.xmlb.XmlSerializer import com.intellij.util.xmlb.annotations.AbstractCollection import com.intellij.util.xmlb.annotations.Tag -import org.jdom.Document -import org.jdom.Element -import org.jdom.output.Format -import org.jdom.output.XMLOutputter import org.jetbrains.kotlin.descriptors.ScriptDescriptor import org.jetbrains.kotlin.name.Name +import org.jetbrains.kotlin.parsing.KotlinParserDefinition import org.jetbrains.kotlin.psi.KtScript import org.jetbrains.kotlin.types.KotlinType import java.io.File -import java.io.FileWriter import java.util.* class KotlinScriptConfigurationManager(project: Project, scriptDefinitionProvider: KotlinScriptDefinitionProvider) : AbstractProjectComponent(project) { @@ -98,10 +94,10 @@ class KotlinConfigurableScriptDefinition(val config: KotlinScriptConfig) : Kotli override fun getScriptParametersToPassToSuperclass(scriptDescriptor: ScriptDescriptor): List = config.superclassParamsMapping.map { Name.identifier(it) } - override fun isScript(file: PsiFile): Boolean = - Regex(config.fileNameMatch).matches(file.name) + override fun isScript(file: VirtualFile): Boolean = + Regex(config.fileNameMatch).matches(file.name) - override fun getScriptName(script: KtScript): Name = Name.identifier(script.name ?: config.name) + override fun getScriptName(script: KtScript): Name = ScriptNameUtil.fileNameWithExtensionStripped(script, KotlinParserDefinition.STD_SCRIPT_EXT) override fun getScriptDependenciesClasspath(): List = config.classpath } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt index 31938e8626a..727ef3ca71f 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinition.kt @@ -16,7 +16,7 @@ package org.jetbrains.kotlin.script -import com.intellij.psi.PsiFile +import com.intellij.openapi.vfs.VirtualFile import com.intellij.util.PathUtil import org.jetbrains.kotlin.descriptors.ScriptDescriptor import org.jetbrains.kotlin.name.ClassId @@ -36,7 +36,7 @@ interface KotlinScriptDefinition { fun getScriptParameters(scriptDescriptor: ScriptDescriptor): List fun getScriptSupertypes(scriptDescriptor: ScriptDescriptor): List = emptyList() fun getScriptParametersToPassToSuperclass(scriptDescriptor: ScriptDescriptor): List = emptyList() - fun isScript(file: PsiFile): Boolean + fun isScript(file: VirtualFile): Boolean fun getScriptName(script: KtScript): Name fun getScriptDependenciesClasspath(): List = emptyList() } @@ -52,7 +52,7 @@ object StandardScriptDefinition : KotlinScriptDefinition { return ScriptNameUtil.fileNameWithExtensionStripped(script, KotlinParserDefinition.STD_SCRIPT_EXT) } - override fun isScript(file: PsiFile): Boolean { + override fun isScript(file: VirtualFile): Boolean { return PathUtil.getFileExtension(file.name) == KotlinParserDefinition.STD_SCRIPT_SUFFIX } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt index f5d060f278b..d18d933c7c5 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/script/KotlinScriptDefinitionProvider.kt @@ -18,14 +18,14 @@ package org.jetbrains.kotlin.script import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.project.Project -import com.intellij.psi.PsiFile +import com.intellij.openapi.vfs.VirtualFile class KotlinScriptDefinitionProvider { private val definitions: MutableList = arrayListOf(StandardScriptDefinition) - fun findScriptDefinition(psiFile: PsiFile): KotlinScriptDefinition? = definitions.firstOrNull { it.isScript(psiFile) } + fun findScriptDefinition(file: VirtualFile?): KotlinScriptDefinition? = file?.let { file -> definitions.firstOrNull { it.isScript(file) } } - fun isScript(psiFile: PsiFile): Boolean = findScriptDefinition(psiFile) != null + fun isScript(file: VirtualFile?): Boolean = findScriptDefinition(file) != null fun addScriptDefinition(scriptDefinition: KotlinScriptDefinition) { definitions.add(0, scriptDefinition) diff --git a/compiler/tests-common/org/jetbrains/kotlin/scripts/TestScriptDefinitions.kt b/compiler/tests-common/org/jetbrains/kotlin/scripts/TestScriptDefinitions.kt index 2b242c66657..51df406ebd6 100644 --- a/compiler/tests-common/org/jetbrains/kotlin/scripts/TestScriptDefinitions.kt +++ b/compiler/tests-common/org/jetbrains/kotlin/scripts/TestScriptDefinitions.kt @@ -16,7 +16,7 @@ package org.jetbrains.kotlin.scripts -import com.intellij.psi.PsiFile +import com.intellij.openapi.vfs.VirtualFile import org.jetbrains.kotlin.descriptors.ScriptDescriptor import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtScript @@ -26,7 +26,7 @@ import kotlin.reflect.KClass abstract class BaseScriptDefinition (val extension: String) : KotlinScriptDefinition { override val name = "Test Kotlin Script" - override fun isScript(file: PsiFile): Boolean = file.name.endsWith(extension) + override fun isScript(file: VirtualFile): Boolean = file.name.endsWith(extension) override fun getScriptName(script: KtScript): Name = ScriptNameUtil.fileNameWithExtensionStripped(script, extension) } 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 8648ee190dc..c6c0c04ae81 100644 --- a/idea/idea-repl/src/org/jetbrains/kotlin/console/KotlinConsoleRunner.kt +++ b/idea/idea-repl/src/org/jetbrains/kotlin/console/KotlinConsoleRunner.kt @@ -43,7 +43,7 @@ import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project import com.intellij.openapi.util.Disposer import com.intellij.openapi.vfs.CharsetToolkit -import com.intellij.psi.PsiFile +import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiFileFactory import com.intellij.psi.PsiManager import com.intellij.psi.impl.PsiFileFactoryImpl @@ -123,7 +123,7 @@ class KotlinConsoleRunner( private val consoleScriptDefinition = object : KotlinScriptDefinition { override val name = "Kotlin REPL" - override fun isScript(file: PsiFile) = file.originalFile.virtualFile == consoleView.virtualFile + override fun isScript(file: VirtualFile) = file == consoleView.virtualFile override fun getScriptParameters(scriptDescriptor: ScriptDescriptor) = emptyList() override fun getScriptName(script: KtScript) = Name.identifier("REPL") }