[kotlin] scripting: remove deprecated ScriptDefinitionContributor.kt and ScriptDefinitionSourceAsContributor.kt

* remove deprecated ScriptDefinitionSourceFromContributor
* remove deprecated ScriptTemplatesProvider

^KTIJ-31294

GitOrigin-RevId: 96d64b637847cf65213f100535ca8ecf4f434ddd
This commit is contained in:
Vlad Koshkin
2024-09-12 16:40:06 +00:00
committed by intellij-monorepo-bot
parent 5c335c80c6
commit c5bc4de51f
27 changed files with 105 additions and 279 deletions
@@ -192,6 +192,7 @@ private val K2_ALLOWED_PLUGIN_IDS = Java11Shim.INSTANCE.copyOf(KNOWN_KOTLIN_PLUG
"org.jetbrains.plugins.kotlin.jupyter",
"com.intellij.kmm",
"com.jetbrains.kotlin.ocswift",
"kotlin.gradle.gradle-java"
))
private fun readRootElementChild(
@@ -1,34 +0,0 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.idea.core.script
import com.intellij.openapi.extensions.ProjectExtensionPointName
import com.intellij.openapi.project.Project
import org.jetbrains.annotations.ApiStatus
import org.jetbrains.kotlin.scripting.definitions.KotlinScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsSource
@Deprecated("migrating to new configuration refinement: use ScriptDefinitionsSource internally and kotlin.script.experimental.intellij.ScriptDefinitionsProvider as a providing extension point")
interface ScriptDefinitionContributor {
@Deprecated("migrating to new configuration refinement: drop usages")
val id: String
@Deprecated("migrating to new configuration refinement: use ScriptDefinitionsSource instead")
fun getDefinitions(): List<KotlinScriptDefinition>
@ApiStatus.ScheduledForRemoval
@Deprecated("migrating to new configuration refinement: drop usages")
fun isReady() = true
companion object {
val EP_NAME: ProjectExtensionPointName<ScriptDefinitionContributor> =
ProjectExtensionPointName("org.jetbrains.kotlin.scriptDefinitionContributor")
inline fun <reified T> find(project: Project) =
EP_NAME.getPoint(project).extensionList.filterIsInstance<T>().firstOrNull()
}
}
fun ScriptDefinitionContributor.asSource(): ScriptDefinitionsSource =
if (this is ScriptDefinitionsSource) this
else ScriptDefinitionSourceFromContributor(this)
@@ -1,13 +0,0 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.idea.core.script
import org.jetbrains.kotlin.scripting.definitions.KotlinScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsSource
@Deprecated("migrating to new configuration refinement: use ScriptDefinitionsSource directly instead")
interface ScriptDefinitionSourceAsContributor : ScriptDefinitionContributor, ScriptDefinitionsSource {
@Suppress("DeprecatedCallableAddReplaceWith")
@Deprecated("migrating to new configuration refinement: use ScriptDefinitionsSource instead")
override fun getDefinitions(): List<KotlinScriptDefinition> = definitions.map { it.legacyDefinition }.toList()
}
@@ -1,26 +0,0 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.idea.core.script
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsSource
import kotlin.script.experimental.host.ScriptingHostConfiguration
import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
@Deprecated("migrating to new configuration refinement: convert all contributors to ScriptDefinitionsSource/ScriptDefinitionsProvider")
class ScriptDefinitionSourceFromContributor(
val contributor: ScriptDefinitionContributor,
private val hostConfiguration: ScriptingHostConfiguration = defaultJvmScriptingHostConfiguration
) : ScriptDefinitionsSource {
override val definitions: Sequence<ScriptDefinition>
get() =
if (contributor is ScriptDefinitionsSource) contributor.definitions
else contributor.getDefinitions().asSequence().map { ScriptDefinition.FromLegacy(hostConfiguration, it) }
override fun equals(other: Any?): Boolean {
return contributor.id == (other as? ScriptDefinitionSourceFromContributor)?.contributor?.id
}
override fun hashCode(): Int {
return contributor.id.hashCode()
}
}
@@ -15,7 +15,6 @@ import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFileManager
import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.idea.core.script.settings.KotlinScriptingSettings
import org.jetbrains.kotlin.script.ScriptTemplatesProvider
import org.jetbrains.kotlin.scripting.definitions.*
import org.jetbrains.kotlin.scripting.resolve.VirtualFileScriptSource
import org.jetbrains.kotlin.utils.addToStdlib.flattenTo
@@ -38,7 +37,6 @@ import kotlin.script.experimental.host.toScriptSource
* provides its own definitions list, the resulting one is partitioned. Partitions in their turn are sorted.
* E.g. if definition sources are ordered as (A, B, C), their definitions might look as ((A-def-1, A-def-2), (B-def), (C-def)).
*
* [ScriptDefinitionsSource]s are registered via extension points either as [ScriptTemplatesProviderAdapter] or [ScriptDefinitionContributor].
* Their order is crucial because it affects definition search algo.
*
* In rare exceptional cases, the resulting definitions' order might be inaccurate and doesn't accommodate the user's needs.
@@ -171,7 +169,7 @@ open class ScriptDefinitionsManager(private val project: Project) : LazyScriptDe
override fun getDefaultDefinition(): ScriptDefinition {
val bundledScriptDefinitionContributor = getBundledScriptDefinitionContributor()
?: error("BundledScriptDefinitionContributor must be registered in plugin.xml")
return ScriptDefinition.FromLegacy(getScriptingHostConfiguration(), bundledScriptDefinitionContributor.getDefinitions().last())
return bundledScriptDefinitionContributor.definitions.last()
}
// This function is aimed to fix locks acquisition order.
@@ -287,12 +285,8 @@ open class ScriptDefinitionsManager(private val project: Project) : LazyScriptDe
// FOR TESTS ONLY: we introduce a possibility to cut dependencies over inheritance
protected open fun getSources(): List<ScriptDefinitionsSource> {
@Suppress("DEPRECATION")
val fromDeprecatedEP = project.extensionArea.getExtensionPoint(ScriptTemplatesProvider.EP_NAME).extensionList
.map { ScriptTemplatesProviderAdapter(it).asSource() }
val fromNewEp = ScriptDefinitionContributor.EP_NAME.getPoint(project).extensionList
.map { it.asSource() }
return fromNewEp.dropLast(1) + fromDeprecatedEP + fromNewEp.last()
val fromNewEp = SCRIPT_DEFINITIONS_SOURCES.getExtensions(project)
return fromNewEp.dropLast(1) + fromNewEp.last()
}
protected open fun getKotlinScriptingSettings(): KotlinScriptingSettings = KotlinScriptingSettings.getInstance(project)
@@ -315,7 +309,7 @@ open class ScriptDefinitionsManager(private val project: Project) : LazyScriptDe
}
protected open fun getBundledScriptDefinitionContributor() =
ScriptDefinitionContributor.find<BundledScriptDefinitionContributor>(project)
SCRIPT_DEFINITIONS_SOURCES.findExtension(BundledScriptDefinitionSource::class.java, project)
protected open fun executeUnderReadLock(block: () -> Unit) = runReadAction { block() }
@@ -1,49 +0,0 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
@file:Suppress("PackageDirectoryMismatch")
package org.jetbrains.kotlin.script
import com.intellij.openapi.extensions.ExtensionPointName
import org.jetbrains.annotations.ApiStatus
import java.io.File
import kotlin.script.experimental.dependencies.DependenciesResolver
@ApiStatus.ScheduledForRemoval
@Deprecated("Use ScriptDefinitionContributor EP and loadDefinitionsFromTemplates top level function")
internal interface ScriptTemplatesProvider {
// for resolving ambiguities
val id: String
@Deprecated("Parameter isn't used for resolving priorities anymore. " +
"com.intellij.openapi.extensions.LoadingOrder constants can be used to order providers when registered from Intellij plugin.",
ReplaceWith("0"))
val version: Int
get() = 0
val isValid: Boolean
val templateClassNames: Iterable<String>
val resolver: DependenciesResolver? get() = null
val filePattern: String? get() = null
val templateClasspath: List<File>
// TODO: need to provide a way to specify this in compiler/repl .. etc
/*
* Allows to specify additional jars needed for DependenciesResolver (and not script template).
* Script template dependencies naturally become (part of) dependencies of the script which is not always desired for resolver dependencies.
* i.e. gradle resolver may depend on some jars that 'built.gradle.kts' files should not depend on.
*/
val additionalResolverClasspath: List<File> get() = emptyList()
val environment: Map<String, Any?>?
companion object {
val EP_NAME: ExtensionPointName<ScriptTemplatesProvider> =
ExtensionPointName.create("org.jetbrains.kotlin.scriptTemplatesProvider")
}
}
@@ -1,27 +0,0 @@
// Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package org.jetbrains.kotlin.idea.core.script
import org.jetbrains.kotlin.script.ScriptTemplatesProvider
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.getEnvironment
import kotlin.script.experimental.host.ScriptingHostConfiguration
import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
internal class ScriptTemplatesProviderAdapter(private val templatesProvider: ScriptTemplatesProvider) : ScriptDefinitionSourceAsContributor {
override val id: String
get() = templatesProvider.id
override val definitions: Sequence<ScriptDefinition>
get() {
return loadDefinitionsFromTemplates(
templatesProvider.templateClassNames.toList(), templatesProvider.templateClasspath,
ScriptingHostConfiguration(defaultJvmScriptingHostConfiguration) {
getEnvironment {
templatesProvider.environment
}
},
templatesProvider.additionalResolverClasspath
).asSequence()
}
}
@@ -28,15 +28,11 @@ import kotlin.script.experimental.jvm.util.scriptCompilationClasspathFromContext
import kotlin.script.templates.standard.ScriptTemplateWithArgs
class BundledScriptDefinitionContributor(val project: Project) : ScriptDefinitionContributor {
class BundledScriptDefinitionSource(val project: Project) : ScriptDefinitionsSource {
private val myLegacyBundledIdeScriptDefinition = LegacyBundledIdeScriptDefinition(project)
@Deprecated("migrating to new configuration refinement: use ScriptDefinitionsSource instead")
override fun getDefinitions() = listOf(myLegacyBundledIdeScriptDefinition)
@Deprecated("migrating to new configuration refinement: drop usages")
override val id: String
get() = "StandardKotlinScript"
override val definitions: Sequence<ScriptDefinition>
get() = sequenceOf(myLegacyBundledIdeScriptDefinition).map { ScriptDefinition.FromLegacy(defaultJvmScriptingHostConfiguration, it) }
}
class LegacyBundledIdeScriptDefinition internal constructor(project: Project) : KotlinScriptDefinition(ScriptTemplateWithArgs::class) {
@@ -13,6 +13,7 @@ import com.intellij.util.ExceptionUtil
import com.intellij.util.PathUtil
import com.intellij.util.lang.UrlClassLoader
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsSource
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
import java.io.File
import java.nio.file.Files
@@ -62,7 +63,7 @@ fun loadDefinitionsFromTemplatesByPaths(
val classpath = adjustClasspath(templateClasspath + additionalResolverClasspath)
scriptingInfoLog("Loading script definitions: classes = $templateClassNames, classpath = ${classpath}")
val baseLoader = ScriptDefinitionContributor::class.java.classLoader
val baseLoader = ScriptDefinitionsSource::class.java.classLoader
val loader = if (classpath.isEmpty())
baseLoader
else
@@ -324,8 +324,8 @@ private class ScriptDefinitionsManagerUnderTest(val project: Project) : ScriptDe
override fun isScratchFile(script: SourceCode): Boolean = false
override fun getBundledScriptDefinitionContributor(): BundledScriptDefinitionContributor =
BundledScriptDefinitionContributor(project)
override fun getBundledScriptDefinitionContributor(): BundledScriptDefinitionSource =
BundledScriptDefinitionSource(project)
override fun executeUnderReadLock(block: () -> Unit) = block()
}
@@ -0,0 +1,5 @@
<idea-plugin>
<extensions defaultExtensionNs="org.jetbrains.kotlin">
<scriptDefinitionsSource implementation="org.jetbrains.kotlin.idea.gradleJava.scripting.GradleScriptDefinitionsContributor"/>
</extensions>
</idea-plugin>
@@ -0,0 +1,5 @@
<idea-plugin>
<extensions defaultExtensionNs="org.jetbrains.kotlin">
<scriptDefinitionsSource implementation="org.jetbrains.kotlin.idea.gradleJava.scripting.GradleScriptDefinitionsSource"/>
</extensions>
</idea-plugin>
@@ -1,4 +1,7 @@
<idea-plugin package="org.jetbrains.kotlin.idea.gradleJava">
<idea-plugin package="org.jetbrains.kotlin.idea.gradleJava" xmlns:xi="http://www.w3.org/2001/XInclude">
<id>kotlin.gradle.gradle-java</id>
<vendor>JetBrains</vendor>
<dependencies>
<plugin id="org.jetbrains.plugins.gradle"/>
<module name="kotlin.gradle.gradle-tooling"/>
@@ -8,13 +11,15 @@
<module name="kotlin.base.external-build-system"/>
</dependencies>
<xi:include href="kotlin.gradle.gradle-java.k1.xml" includeUnless="idea.kotlin.plugin.use.k2"/>
<xi:include href="kotlin.gradle.gradle-java.k2.xml" includeIf="idea.kotlin.plugin.use.k2"/>
<projectListeners>
<listener
class="org.jetbrains.kotlin.idea.gradleJava.scripting.ProjectGradleSettingsListener"
topic="org.jetbrains.plugins.gradle.settings.GradleSettingsListener"/>
</projectListeners>
<extensionPoints>
<extensionPoint
qualifiedName="org.jetbrains.kotlin.gradleProjectImportHandler" area="IDEA_PROJECT"
@@ -121,9 +126,6 @@
<gradleModelFacade implementation="org.jetbrains.kotlin.idea.gradleJava.inspections.DefaultGradleModelFacade"/>
<scriptDefinitionContributor implementation="org.jetbrains.kotlin.idea.gradleJava.scripting.GradleScriptDefinitionsContributor" order="first"/>
<scriptDefinitionsSource implementation="org.jetbrains.kotlin.idea.gradleJava.scripting.GradleScriptDefinitionsSource"/>
<scriptDependenciesSource implementation="org.jetbrains.kotlin.idea.gradleJava.scripting.GradleScriptDependenciesSource"/>
<scriptReloadActionAvailability implementation="org.jetbrains.kotlin.idea.gradleJava.scripting.GradleScriptReloadActionAvailability"/>
@@ -4,36 +4,36 @@ package org.jetbrains.kotlin.idea.gradleJava.scripting
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionContributor
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionSourceAsContributor
import org.jetbrains.kotlin.idea.core.script.SCRIPT_DEFINITIONS_SOURCES
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionsManager
import org.jetbrains.kotlin.idea.core.script.scriptingInfoLog
import org.jetbrains.kotlin.idea.gradle.KotlinIdeaGradleBundle
import org.jetbrains.kotlin.idea.gradleJava.ErrorGradleScriptDefinition
import org.jetbrains.kotlin.idea.gradleJava.getFullDefinitionsClasspath
import org.jetbrains.kotlin.idea.gradleJava.loadGradleDefinitions
import org.jetbrains.kotlin.idea.gradleJava.scripting.roots.GradleBuildRoot
import org.jetbrains.kotlin.idea.gradleJava.scripting.roots.GradleBuildRootsManager
import org.jetbrains.kotlin.idea.gradleJava.scripting.roots.Imported
import org.jetbrains.kotlin.idea.gradleJava.scripting.roots.WithoutScriptModels
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsSource
import org.jetbrains.plugins.gradle.settings.DistributionType
import org.jetbrains.plugins.gradle.settings.GradleExecutionSettings
import org.jetbrains.plugins.gradle.settings.GradleSettingsListener
import org.jetbrains.plugins.gradle.util.GradleConstants
import java.util.concurrent.ConcurrentHashMap
import kotlin.io.path.invariantSeparatorsPathString
class GradleScriptDefinitionsContributor(private val project: Project) : ScriptDefinitionSourceAsContributor {
class GradleScriptDefinitionsContributor(private val project: Project) : ScriptDefinitionsSource {
companion object {
fun getDefinitions(project: Project, workingDir: String, gradleHome: String?, javaHome: String?): List<ScriptDefinition>? {
val contributor = ScriptDefinitionContributor.EP_NAME.getExtensions(project)
fun getInstance(project: Project): GradleScriptDefinitionsContributor? =
SCRIPT_DEFINITIONS_SOURCES.getExtensions(project)
.filterIsInstance<GradleScriptDefinitionsContributor>()
.singleOrNull()
fun getDefinitions(project: Project, workingDir: String, gradleHome: String?, javaHome: String?): List<ScriptDefinition>? {
val contributor = getInstance(project)
if (contributor == null) {
scriptingInfoLog(
"cannot find gradle script definitions contributor in ScriptDefinitionContributor.EP_NAME list: " +
"cannot find gradle script definitions contributor in SCRIPT_DEFINITIONS_SOURCES list: " +
"workingDir=$workingDir gradleHome=$gradleHome"
)
return null
@@ -67,9 +67,6 @@ class GradleScriptDefinitionsContributor(private val project: Project) : ScriptD
subscribeToGradleSettingChanges()
}
@Deprecated("migrating to new configuration refinement: drop usages")
override val id: String = "Gradle Kotlin DSL"
internal data class LightGradleBuildRoot(val workingDir: String, val gradleHome: String?, val javaHome: String?)
private val definitionsByRoots = ConcurrentHashMap<LightGradleBuildRoot, List<ScriptDefinition>>()
@@ -9,7 +9,6 @@ import com.intellij.openapi.externalSystem.service.execution.ExternalSystemJdkUt
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
import com.intellij.openapi.projectRoots.JdkUtil
import org.jetbrains.kotlin.idea.base.plugin.KotlinPluginModeProvider
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionContributor
import org.jetbrains.kotlin.idea.gradleJava.scripting.GradleScriptDefinitionsContributor
import org.jetbrains.kotlin.idea.gradleJava.scripting.roots.GradleBuildRootsManager
import org.jetbrains.plugins.gradle.service.GradleInstallationManager
@@ -77,7 +76,7 @@ class KotlinDslSyncListener : ExternalSystemTaskNotificationListener {
if (KotlinPluginModeProvider.isK1Mode()) {
@Suppress("DEPRECATION")
ScriptDefinitionContributor.find<GradleScriptDefinitionsContributor>(project)?.reloadIfNeeded(
GradleScriptDefinitionsContributor.getInstance(project)?.reloadIfNeeded(
sync.workingDir, sync.gradleHome, sync.javaHome
)
}
@@ -4,18 +4,16 @@ package org.jetbrains.kotlin.idea.script
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionSourceAsContributor
import org.jetbrains.kotlin.idea.core.script.loadDefinitionsFromTemplates
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsFromClasspathDiscoverySource
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsSource
import kotlin.script.experimental.api.ScriptDiagnostic
import kotlin.script.experimental.api.ScriptEvaluationConfiguration
import kotlin.script.experimental.intellij.ScriptDefinitionsProvider
import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
class BridgeScriptDefinitionsContributor(private val project: Project) : ScriptDefinitionSourceAsContributor {
override val id: String = "BridgeScriptDefinitionsContributor"
class BridgeScriptDefinitionsContributor(private val project: Project) : ScriptDefinitionsSource {
override val definitions: Sequence<ScriptDefinition>
get() = ScriptDefinitionsProvider.EP_NAME.getExtensionList(project).asSequence().flatMap { provider ->
val explicitClasses = provider.getDefinitionClasses().toList()
@@ -12,12 +12,13 @@ import com.intellij.psi.search.FilenameIndex
import com.intellij.util.concurrency.annotations.RequiresBlockingContext
import org.jetbrains.kotlin.idea.base.util.allScope
import org.jetbrains.kotlin.idea.core.KotlinPluginDisposable
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionSourceAsContributor
import org.jetbrains.kotlin.idea.core.script.SCRIPT_DEFINITIONS_SOURCES
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionsManager
import org.jetbrains.kotlin.idea.core.script.loadDefinitionsFromTemplatesByPaths
import org.jetbrains.kotlin.idea.core.script.scriptingDebugLog
import org.jetbrains.kotlin.scripting.definitions.SCRIPT_DEFINITION_MARKERS_EXTENSION_WITH_DOT
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsSource
import org.jetbrains.kotlin.scripting.definitions.getEnvironment
import java.io.File
import java.nio.file.Path
@@ -28,13 +29,13 @@ import kotlin.concurrent.withLock
import kotlin.script.experimental.host.ScriptingHostConfiguration
import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
class ScriptTemplatesFromDependenciesProvider(private val project: Project) : ScriptDefinitionSourceAsContributor {
@Deprecated("migrating to new configuration refinement: drop usages")
override val id = "ScriptTemplatesFromDependenciesProvider"
@Deprecated("migrating to new configuration refinement: drop usages")
override fun isReady(): Boolean = _definitions != null
class ScriptTemplatesFromDependenciesProvider(private val project: Project) : ScriptDefinitionsSource {
companion object {
fun getInstance(project: Project): ScriptTemplatesFromDependenciesProvider? =
SCRIPT_DEFINITIONS_SOURCES.getExtensions(project)
.filterIsInstance<ScriptTemplatesFromDependenciesProvider>()
.singleOrNull()
}
override val definitions: Sequence<ScriptDefinition>
get() {
@@ -7,11 +7,11 @@ import org.jetbrains.kotlin.config.CompilerSettings
import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCompilerSettings
import org.jetbrains.kotlin.idea.compiler.configuration.KotlinCompilerSettingsListener
import org.jetbrains.kotlin.idea.core.KotlinPluginDisposable
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionSourceAsContributor
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionsManager
import org.jetbrains.kotlin.idea.core.script.loadDefinitionsFromTemplatesByPaths
import org.jetbrains.kotlin.idea.util.application.executeOnPooledThread
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsSource
import org.jetbrains.kotlin.scripting.definitions.getEnvironment
import java.io.File
import kotlin.io.path.Path
@@ -20,7 +20,7 @@ import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
class ScriptTemplatesFromCompilerSettingsProvider(
private val project: Project
) : ScriptDefinitionSourceAsContributor {
) : ScriptDefinitionsSource {
init {
project.messageBus.connect(KotlinPluginDisposable.getInstance(project))
@@ -54,7 +54,5 @@ class ScriptTemplatesFromCompilerSettingsProvider(
).asSequence()
}
}
override val id: String = "KotlinCompilerScriptTemplatesSettings"
}
@@ -12,9 +12,9 @@ import com.intellij.openapi.roots.ProjectRootManager
import com.intellij.openapi.vfs.LocalFileSystem
import com.intellij.openapi.vfs.VfsUtil
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.testFramework.HeavyPlatformTestCase
import com.intellij.testFramework.IdeaTestUtil
import com.intellij.testFramework.IndexingTestUtil
import com.intellij.testFramework.HeavyPlatformTestCase
import com.intellij.testFramework.PsiTestUtil
import com.intellij.util.ThrowableRunnable
import com.intellij.util.ui.UIUtil
@@ -23,8 +23,8 @@ import org.jetbrains.kotlin.idea.base.highlighting.shouldHighlightFile
import org.jetbrains.kotlin.idea.base.plugin.artifacts.TestKotlinArtifacts
import org.jetbrains.kotlin.idea.completion.test.KotlinCompletionTestCase
import org.jetbrains.kotlin.idea.core.script.IdeScriptReportSink
import org.jetbrains.kotlin.idea.core.script.SCRIPT_DEFINITIONS_SOURCES
import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager.Companion.updateScriptDependenciesSynchronously
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionContributor
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionsManager
import org.jetbrains.kotlin.idea.core.script.settings.KotlinScriptingSettings
import org.jetbrains.kotlin.idea.script.AbstractScriptConfigurationTest.Companion.useDefaultTemplate
@@ -354,7 +354,7 @@ abstract class AbstractScriptConfigurationTest : KotlinCompletionTestCase() {
}
addExtensionPointInTest(
ScriptDefinitionContributor.EP_NAME,
SCRIPT_DEFINITIONS_SOURCES,
project,
provider,
testRootDisposable
@@ -2,9 +2,9 @@
package org.jetbrains.kotlin.idea.script
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionSourceAsContributor
import org.jetbrains.kotlin.idea.core.script.loadDefinitionsFromTemplates
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsSource
import org.jetbrains.kotlin.scripting.definitions.getEnvironment
import java.io.File
import kotlin.script.dependencies.Environment
@@ -12,9 +12,7 @@ import kotlin.script.experimental.host.ScriptingHostConfiguration
import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
class CustomScriptTemplateProvider(val environment: Environment) : ScriptDefinitionSourceAsContributor {
override val id = "Test"
class CustomScriptTemplateProvider(val environment: Environment) : ScriptDefinitionsSource {
override val definitions: Sequence<ScriptDefinition>
get() = loadDefinitionsFromTemplates(
@@ -27,10 +25,7 @@ class CustomScriptTemplateProvider(val environment: Environment) : ScriptDefinit
}
class FromTextTemplateProvider(val environment: Environment) : ScriptDefinitionSourceAsContributor {
override val id = "Test"
class FromTextTemplateProvider(val environment: Environment) : ScriptDefinitionsSource {
override val definitions: Sequence<ScriptDefinition>
get() = loadDefinitionsFromTemplates(
templateClassNames = listOf("org.jetbrains.kotlin.idea.script.Template"),
@@ -4,7 +4,7 @@ package org.jetbrains.kotlin.idea.script
import com.intellij.openapi.Disposable
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.idea.base.plugin.artifacts.TestKotlinArtifacts
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionContributor
import org.jetbrains.kotlin.idea.core.script.SCRIPT_DEFINITIONS_SOURCES
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionsManager
import org.jetbrains.kotlin.idea.core.script.settings.KotlinScriptingSettings
import org.jetbrains.kotlin.idea.test.KotlinCompilerStandalone
@@ -57,7 +57,7 @@ private fun compileLibToDir(testName: String, srcDir: File): File {
private fun registerScriptDefinitionsProvider(project: Project, testRootDisposable: Disposable, environment: Environment) {
val provider = CustomScriptTemplateProvider(environment)
addExtensionPointInTest(ScriptDefinitionContributor.EP_NAME, project, provider, testRootDisposable)
addExtensionPointInTest(SCRIPT_DEFINITIONS_SOURCES, project, provider, testRootDisposable)
ScriptDefinitionsManager.getInstance(project).reloadDefinitions()
@@ -31,17 +31,6 @@
interface="org.jetbrains.kotlin.idea.core.script.configuration.listener.ScriptChangeListener"
area="IDEA_PROJECT" dynamic="true"/>
<extensionPoint
qualifiedName="org.jetbrains.kotlin.scriptDefinitionContributor"
interface="org.jetbrains.kotlin.idea.core.script.ScriptDefinitionContributor"
area="IDEA_PROJECT"
dynamic="true"/>
<extensionPoint
qualifiedName="org.jetbrains.kotlin.scriptTemplatesProvider"
interface="org.jetbrains.kotlin.script.ScriptTemplatesProvider"
area="IDEA_PROJECT"/>
<extensionPoint
qualifiedName="org.jetbrains.kotlin.ideScriptConfigurationControlFacade"
interface="kotlin.script.experimental.intellij.IdeScriptConfigurationControlFacade"
@@ -113,9 +102,9 @@
<idea.base.projectStructure.moduleInfoProviderExtension implementation="org.jetbrains.kotlin.idea.base.scripting.ScriptingModuleInfoProviderExtension"/>
<scriptDefinitionContributor
<scriptDefinitionsSource
id="StandardScriptDefinitionContributor"
order="last"
implementation="org.jetbrains.kotlin.idea.core.script.BundledScriptDefinitionContributor"/>
implementation="org.jetbrains.kotlin.idea.core.script.BundledScriptDefinitionSource"/>
</extensions>
</idea-plugin>
@@ -1,5 +1,11 @@
<idea-plugin>
<extensionPoints>
<extensionPoint
qualifiedName="org.jetbrains.kotlin.scriptDefinitionsSource"
interface="org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsSource"
area="IDEA_PROJECT"
dynamic="true"/>
<extensionPoint qualifiedName="org.jetbrains.kotlin.scratchFileLanguageProvider" beanClass="com.intellij.lang.LanguageExtensionPoint" dynamic="true">
<with attribute="implementationClass" implements="org.jetbrains.kotlin.idea.scratch.ScratchFileLanguageProvider"/>
</extensionPoint>
@@ -34,22 +40,22 @@
<syntheticResolveExtension implementation="org.jetbrains.kotlin.scripting.extensions.ScriptingResolveExtension"/>
<extraImportsProviderExtension implementation="org.jetbrains.kotlin.scripting.extensions.ScriptExtraImportsProviderExtension"/>
<scriptDefinitionContributor
<scriptDefinitionsSource
id="ScriptTemplatesFromCompilerSettingsProvider"
implementation="org.jetbrains.kotlin.idea.script.ScriptTemplatesFromCompilerSettingsProvider"/>
<scriptDefinitionContributor
<scriptDefinitionsSource
id="BridgeScriptDefinitionsContributor"
implementation="org.jetbrains.kotlin.idea.script.BridgeScriptDefinitionsContributor"/>
<scriptDefinitionContributor
<scriptDefinitionsSource
id="ScriptTemplatesFromDependenciesProvider"
implementation="org.jetbrains.kotlin.idea.script.ScriptTemplatesFromDependenciesProvider"/>
<scriptDefinitionContributor id="ConsoleScriptDefinitionContributor"
implementation="org.jetbrains.kotlin.console.ConsoleScriptDefinitionContributor"/>
<scriptDefinitionsSource id="ConsoleScriptDefinitionContributor"
implementation="org.jetbrains.kotlin.console.ConsoleScriptDefinitionSource"/>
<scriptDefinitionContributor id="ScriptDefinitionForExtensionAndIdeConsoleRootsSource"
<scriptDefinitionsSource id="ScriptDefinitionForExtensionAndIdeConsoleRootsSource"
implementation="org.jetbrains.kotlin.jsr223.ScriptDefinitionForExtensionAndIdeConsoleRootsSource"/>
<scriptDefinitionsProvider id="MainKtsScriptDefinitionProvider"
@@ -50,17 +50,6 @@
interface="org.jetbrains.kotlin.idea.core.script.configuration.listener.ScriptChangeListener"
area="IDEA_PROJECT" dynamic="true"/>
<extensionPoint
qualifiedName="org.jetbrains.kotlin.scriptDefinitionContributor"
interface="org.jetbrains.kotlin.idea.core.script.ScriptDefinitionContributor"
area="IDEA_PROJECT"
dynamic="true"/>
<extensionPoint
qualifiedName="org.jetbrains.kotlin.scriptTemplatesProvider"
interface="org.jetbrains.kotlin.script.ScriptTemplatesProvider"
area="IDEA_PROJECT"/>
<extensionPoint
qualifiedName="org.jetbrains.kotlin.ideScriptConfigurationControlFacade"
interface="kotlin.script.experimental.intellij.IdeScriptConfigurationControlFacade"
@@ -56,24 +56,22 @@ import org.jetbrains.kotlin.idea.base.projectStructure.testSourceInfo
import org.jetbrains.kotlin.idea.base.util.runReadActionInSmartMode
import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor
import org.jetbrains.kotlin.idea.caches.trackers.KOTLIN_CONSOLE_KEY
import org.jetbrains.kotlin.idea.core.script.SCRIPT_DEFINITIONS_SOURCES
import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionContributor
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionSourceAsContributor
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionsManager
import org.jetbrains.kotlin.idea.util.application.isUnitTestMode
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.parsing.KotlinParserDefinition
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.KtScript
import org.jetbrains.kotlin.resolve.lazy.ForceResolveUtil
import org.jetbrains.kotlin.resolve.repl.ReplState
import org.jetbrains.kotlin.scripting.definitions.KotlinScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsSource
import java.awt.Color
import java.awt.Font
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
import kotlin.properties.Delegates
import kotlin.script.experimental.api.*
import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
private const val KOTLIN_SHELL_EXECUTE_ACTION_ID = "KotlinShellExecute"
@@ -94,7 +92,7 @@ class KotlinConsoleRunner(
override fun finishConsole() {
KotlinConsoleKeeper.getInstance(project).removeConsole(consoleView.virtualFile)
val consoleContributor = ScriptDefinitionContributor.find<ConsoleScriptDefinitionContributor>(project)!!
val consoleContributor = ConsoleScriptDefinitionSource.getInstance(project)!!
consoleContributor.unregisterDefinition(consoleScriptDefinition)
ScriptDefinitionsManager.getInstance(project).reloadDefinitionsBy(consoleContributor)
@@ -129,10 +127,16 @@ class KotlinConsoleRunner(
val executor = CommandExecutor(this)
var compilerHelper: ConsoleCompilerHelper by Delegates.notNull()
private val consoleScriptDefinition = object : KotlinScriptDefinition(Any::class) {
override val name get() = KotlinIdeaReplBundle.message("name.kotlin.repl")
override fun isScript(fileName: String): Boolean = fileName.startsWith(consoleView.virtualFile.name)
override fun getScriptName(script: KtScript) = Name.identifier("REPL")
val consoleScriptDefinition = object : ScriptDefinition.FromConfigurations(
defaultJvmScriptingHostConfiguration,
ScriptCompilationConfiguration {
displayName(KotlinIdeaReplBundle.message("name.kotlin.repl"))
},
ScriptEvaluationConfiguration({
hostConfiguration(defaultJvmScriptingHostConfiguration)
})
) {
override fun isScript(script: SourceCode): Boolean = script.name?.startsWith(consoleView.virtualFile.name) == true
}
override fun createProcess(): Process {
@@ -163,7 +167,7 @@ class KotlinConsoleRunner(
val executeAction = KtExecuteCommandAction(consoleView.virtualFile)
executeAction.registerCustomShortcutSet(CommonShortcuts.getCtrlEnter(), consoleView.consoleEditor.component)
val consoleContributor = ScriptDefinitionContributor.find<ConsoleScriptDefinitionContributor>(project)!!
val consoleContributor = ConsoleScriptDefinitionSource.getInstance(project)!!
consoleContributor.registerDefinition(consoleScriptDefinition)
ScriptDefinitionsManager.getInstance(project).reloadDefinitionsBy(consoleContributor)
@@ -320,21 +324,25 @@ class KotlinConsoleRunner(
}
}
class ConsoleScriptDefinitionContributor : ScriptDefinitionSourceAsContributor {
class ConsoleScriptDefinitionSource : ScriptDefinitionsSource {
private val definitionsSet = ConcurrentCollectionFactory.createConcurrentSet<ScriptDefinition>()
override val definitions: Sequence<ScriptDefinition>
get() = definitionsSet.asSequence()
override val id: String = "IDEA Console"
// TODO: rewrite to ScriptDefinition
fun registerDefinition(definition: KotlinScriptDefinition) {
definitionsSet.add(ScriptDefinition.FromLegacy(defaultJvmScriptingHostConfiguration, definition))
fun registerDefinition(definition: ScriptDefinition) {
definitionsSet.add(definition)
}
fun unregisterDefinition(definition: KotlinScriptDefinition) {
definitionsSet.removeIf { it.asLegacyOrNull<KotlinScriptDefinition>() == definition }
fun unregisterDefinition(definition: ScriptDefinition) {
definitionsSet.remove(definition)
}
companion object {
fun getInstance(project: Project): ConsoleScriptDefinitionSource? =
SCRIPT_DEFINITIONS_SOURCES.getExtensions(project)
.filterIsInstance<ConsoleScriptDefinitionSource>()
.singleOrNull()
}
}
@@ -6,8 +6,8 @@ import com.intellij.ide.extensionResources.ExtensionsRootType
import com.intellij.ide.scratch.RootType
import com.intellij.ide.script.IdeConsoleRootType
import com.intellij.openapi.application.PathManager
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionSourceAsContributor
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsSource
import org.jetbrains.kotlin.scripting.resolve.VirtualFileScriptSource
import kotlin.io.path.nameWithoutExtension
import kotlin.script.experimental.api.*
@@ -32,11 +32,7 @@ object ScriptDefinitionForExtensionAndIdeConsoleRoots : ScriptDefinition.FromCon
private const val SCRIPT_DEFINITION_NAME = "Script definition for extension scripts and IDE console"
// Deprecated API is used because actual one doesn't support this way of identifying scripts. Will be fixed eventually.
@Suppress("DEPRECATION")
class ScriptDefinitionForExtensionAndIdeConsoleRootsSource : ScriptDefinitionSourceAsContributor {
override val id: String = SCRIPT_DEFINITION_NAME
class ScriptDefinitionForExtensionAndIdeConsoleRootsSource : ScriptDefinitionsSource {
override val definitions: Sequence<ScriptDefinition>
get() = sequenceOf(ScriptDefinitionForExtensionAndIdeConsoleRoots)
}
@@ -19,12 +19,7 @@ import com.intellij.testFramework.PsiTestUtil
import com.intellij.util.io.ZipUtil
import org.jetbrains.jps.model.java.JavaResourceRootType
import org.jetbrains.kotlin.idea.base.test.InTextDirectivesUtils
import org.jetbrains.kotlin.idea.core.script.ScriptDefinitionContributor
import org.jetbrains.kotlin.idea.test.ExpectedPluginModeProvider
import org.jetbrains.kotlin.idea.test.JUnit3RunnerWithInners
import org.jetbrains.kotlin.idea.test.KotlinTestUtils
import org.jetbrains.kotlin.idea.test.addDependency
import org.jetbrains.kotlin.idea.test.setUpWithKotlinPlugin
import org.jetbrains.kotlin.idea.test.*
import org.jetbrains.kotlin.test.util.jarRoot
import org.jetbrains.kotlin.test.util.projectLibrary
import org.junit.runner.RunWith
@@ -91,7 +86,7 @@ abstract class AbstractScriptTemplatesFromDependenciesTest : HeavyPlatformTestCa
checkRoots(fileText, roots)
val provider = ScriptDefinitionContributor.find<ScriptTemplatesFromDependenciesProvider>(project)
val provider = ScriptTemplatesFromDependenciesProvider.getInstance(project)
?: error("Cannot find ScriptTemplatesFromDependenciesProvider")
val (templates, classpath) = provider.getTemplateClassPath(roots.toList())