Replace script recognition from by PsiFile to by virtual file, fix custom script name generation
This commit is contained in:
@@ -19,7 +19,7 @@ package org.jetbrains.kotlin.cli.jvm.repl
|
|||||||
import com.google.common.base.Throwables
|
import com.google.common.base.Throwables
|
||||||
import com.intellij.openapi.Disposable
|
import com.intellij.openapi.Disposable
|
||||||
import com.intellij.openapi.vfs.CharsetToolkit
|
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.PsiFileFactory
|
||||||
import com.intellij.psi.impl.PsiFileFactoryImpl
|
import com.intellij.psi.impl.PsiFileFactoryImpl
|
||||||
import com.intellij.testFramework.LightVirtualFile
|
import com.intellij.testFramework.LightVirtualFile
|
||||||
@@ -239,7 +239,7 @@ class ReplInterpreter(
|
|||||||
|
|
||||||
override fun getScriptParameters(scriptDescriptor: ScriptDescriptor): List<ScriptParameter> = emptyList()
|
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)
|
override fun getScriptName(script: KtScript): Name = StandardScriptDefinition.getScriptName(script)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ public class KotlinParser implements PsiParser {
|
|||||||
@NotNull
|
@NotNull
|
||||||
public ASTNode parse(IElementType iElementType, PsiBuilder psiBuilder, PsiFile psiFile) {
|
public ASTNode parse(IElementType iElementType, PsiBuilder psiBuilder, PsiFile psiFile) {
|
||||||
KotlinParsing jetParsing = KotlinParsing.createForTopLevel(new SemanticWhitespaceAwarePsiBuilderImpl(psiBuilder));
|
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)) {
|
|| psiFile.getName().endsWith(KotlinParserDefinition.STD_SCRIPT_EXT)) {
|
||||||
jetParsing.parseScript();
|
jetParsing.parseScript();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,7 +47,7 @@ public class KtScript extends KtNamedDeclarationStub<KotlinScriptStub> implement
|
|||||||
}
|
}
|
||||||
KtFile containingKtFile = getContainingKtFile();
|
KtFile containingKtFile = getContainingKtFile();
|
||||||
KotlinScriptDefinition kotlinScriptDefinition =
|
KotlinScriptDefinition kotlinScriptDefinition =
|
||||||
KotlinScriptDefinitionProvider.getInstance(getProject()).findScriptDefinition(containingKtFile);
|
KotlinScriptDefinitionProvider.getInstance(getProject()).findScriptDefinition(containingKtFile.getOriginalFile().getVirtualFile());
|
||||||
assert kotlinScriptDefinition != null : "Should not parse a script without definition";
|
assert kotlinScriptDefinition != null : "Should not parse a script without definition";
|
||||||
return containingKtFile.getPackageFqName().child(kotlinScriptDefinition.getScriptName(this));
|
return containingKtFile.getPackageFqName().child(kotlinScriptDefinition.getScriptName(this));
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -55,7 +55,7 @@ class LazyScriptClassMemberScope(
|
|||||||
|
|
||||||
private fun createScriptParameters(constructor: ConstructorDescriptorImpl): List<ValueParameterDescriptor> {
|
private fun createScriptParameters(constructor: ConstructorDescriptorImpl): List<ValueParameterDescriptor> {
|
||||||
val file = scriptDescriptor.scriptInfo.script.getContainingKtFile()
|
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")
|
throw RuntimeException("file ${file.name} is not a script")
|
||||||
return scriptDefinition.getScriptParameters(scriptDescriptor).mapIndexed { index, scriptParameter ->
|
return scriptDefinition.getScriptParameters(scriptDescriptor).mapIndexed { index, scriptParameter ->
|
||||||
ValueParameterDescriptorImpl(
|
ValueParameterDescriptorImpl(
|
||||||
|
|||||||
+1
-1
@@ -58,7 +58,7 @@ class LazyScriptDescriptor(
|
|||||||
private val scriptDefinition: KotlinScriptDefinition
|
private val scriptDefinition: KotlinScriptDefinition
|
||||||
by lazy {
|
by lazy {
|
||||||
val file = scriptInfo.script.getContainingKtFile()
|
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")
|
throw RuntimeException("file ${file.name} is not a script")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+5
-9
@@ -20,20 +20,16 @@ import com.intellij.openapi.components.AbstractProjectComponent
|
|||||||
import com.intellij.openapi.diagnostic.Logger
|
import com.intellij.openapi.diagnostic.Logger
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.openapi.util.JDOMUtil
|
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.XmlSerializer
|
||||||
import com.intellij.util.xmlb.annotations.AbstractCollection
|
import com.intellij.util.xmlb.annotations.AbstractCollection
|
||||||
import com.intellij.util.xmlb.annotations.Tag
|
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.descriptors.ScriptDescriptor
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
import org.jetbrains.kotlin.parsing.KotlinParserDefinition
|
||||||
import org.jetbrains.kotlin.psi.KtScript
|
import org.jetbrains.kotlin.psi.KtScript
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.FileWriter
|
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class KotlinScriptConfigurationManager(project: Project, scriptDefinitionProvider: KotlinScriptDefinitionProvider) : AbstractProjectComponent(project) {
|
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> =
|
override fun getScriptParametersToPassToSuperclass(scriptDescriptor: ScriptDescriptor): List<Name> =
|
||||||
config.superclassParamsMapping.map { Name.identifier(it) }
|
config.superclassParamsMapping.map { Name.identifier(it) }
|
||||||
|
|
||||||
override fun isScript(file: PsiFile): Boolean =
|
override fun isScript(file: VirtualFile): Boolean =
|
||||||
Regex(config.fileNameMatch).matches(file.name)
|
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
|
override fun getScriptDependenciesClasspath(): List<String> = config.classpath
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.script
|
package org.jetbrains.kotlin.script
|
||||||
|
|
||||||
import com.intellij.psi.PsiFile
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
import com.intellij.util.PathUtil
|
import com.intellij.util.PathUtil
|
||||||
import org.jetbrains.kotlin.descriptors.ScriptDescriptor
|
import org.jetbrains.kotlin.descriptors.ScriptDescriptor
|
||||||
import org.jetbrains.kotlin.name.ClassId
|
import org.jetbrains.kotlin.name.ClassId
|
||||||
@@ -36,7 +36,7 @@ interface KotlinScriptDefinition {
|
|||||||
fun getScriptParameters(scriptDescriptor: ScriptDescriptor): List<ScriptParameter>
|
fun getScriptParameters(scriptDescriptor: ScriptDescriptor): List<ScriptParameter>
|
||||||
fun getScriptSupertypes(scriptDescriptor: ScriptDescriptor): List<KotlinType> = emptyList()
|
fun getScriptSupertypes(scriptDescriptor: ScriptDescriptor): List<KotlinType> = emptyList()
|
||||||
fun getScriptParametersToPassToSuperclass(scriptDescriptor: ScriptDescriptor): List<Name> = emptyList()
|
fun getScriptParametersToPassToSuperclass(scriptDescriptor: ScriptDescriptor): List<Name> = emptyList()
|
||||||
fun isScript(file: PsiFile): Boolean
|
fun isScript(file: VirtualFile): Boolean
|
||||||
fun getScriptName(script: KtScript): Name
|
fun getScriptName(script: KtScript): Name
|
||||||
fun getScriptDependenciesClasspath(): List<String> = emptyList()
|
fun getScriptDependenciesClasspath(): List<String> = emptyList()
|
||||||
}
|
}
|
||||||
@@ -52,7 +52,7 @@ object StandardScriptDefinition : KotlinScriptDefinition {
|
|||||||
return ScriptNameUtil.fileNameWithExtensionStripped(script, KotlinParserDefinition.STD_SCRIPT_EXT)
|
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
|
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.components.ServiceManager
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
import com.intellij.psi.PsiFile
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
|
|
||||||
class KotlinScriptDefinitionProvider {
|
class KotlinScriptDefinitionProvider {
|
||||||
private val definitions: MutableList<KotlinScriptDefinition> = arrayListOf(StandardScriptDefinition)
|
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) {
|
fun addScriptDefinition(scriptDefinition: KotlinScriptDefinition) {
|
||||||
definitions.add(0, scriptDefinition)
|
definitions.add(0, scriptDefinition)
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.scripts
|
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.descriptors.ScriptDescriptor
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
import org.jetbrains.kotlin.psi.KtScript
|
import org.jetbrains.kotlin.psi.KtScript
|
||||||
@@ -26,7 +26,7 @@ import kotlin.reflect.KClass
|
|||||||
|
|
||||||
abstract class BaseScriptDefinition (val extension: String) : KotlinScriptDefinition {
|
abstract class BaseScriptDefinition (val extension: String) : KotlinScriptDefinition {
|
||||||
override val name = "Test Kotlin Script"
|
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)
|
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.project.Project
|
||||||
import com.intellij.openapi.util.Disposer
|
import com.intellij.openapi.util.Disposer
|
||||||
import com.intellij.openapi.vfs.CharsetToolkit
|
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.PsiFileFactory
|
||||||
import com.intellij.psi.PsiManager
|
import com.intellij.psi.PsiManager
|
||||||
import com.intellij.psi.impl.PsiFileFactoryImpl
|
import com.intellij.psi.impl.PsiFileFactoryImpl
|
||||||
@@ -123,7 +123,7 @@ class KotlinConsoleRunner(
|
|||||||
|
|
||||||
private val consoleScriptDefinition = object : KotlinScriptDefinition {
|
private val consoleScriptDefinition = object : KotlinScriptDefinition {
|
||||||
override val name = "Kotlin REPL"
|
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 getScriptParameters(scriptDescriptor: ScriptDescriptor) = emptyList<ScriptParameter>()
|
||||||
override fun getScriptName(script: KtScript) = Name.identifier("REPL")
|
override fun getScriptName(script: KtScript) = Name.identifier("REPL")
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user