Replace script recognition from by PsiFile to by virtual file, fix custom script name generation

This commit is contained in:
Ilya Chernikov
2016-06-01 12:15:51 +02:00
parent ad7fcc92d2
commit 770ef16ef7
10 changed files with 21 additions and 25 deletions
@@ -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<ScriptParameter> = 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)
}
@@ -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();
}
@@ -47,7 +47,7 @@ public class KtScript extends KtNamedDeclarationStub<KotlinScriptStub> 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));
}
@@ -55,7 +55,7 @@ class LazyScriptClassMemberScope(
private fun createScriptParameters(constructor: ConstructorDescriptorImpl): List<ValueParameterDescriptor> {
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(
@@ -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")
}
@@ -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<Name> =
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<String> = config.classpath
}
@@ -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<ScriptParameter>
fun getScriptSupertypes(scriptDescriptor: ScriptDescriptor): List<KotlinType> = emptyList()
fun getScriptParametersToPassToSuperclass(scriptDescriptor: ScriptDescriptor): List<Name> = emptyList()
fun isScript(file: PsiFile): Boolean
fun isScript(file: VirtualFile): Boolean
fun getScriptName(script: KtScript): Name
fun getScriptDependenciesClasspath(): List<String> = 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
}
@@ -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<KotlinScriptDefinition> = 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)
@@ -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)
}
@@ -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<ScriptParameter>()
override fun getScriptName(script: KtScript) = Name.identifier("REPL")
}