[kotlin] KTIJ-35725 move gradle script definitions to workspaceModel

Merge-request: IJ-MR-177453
Merged-by: Vlad Koshkin <Vladislav.Koshkin@jetbrains.com>

GitOrigin-RevId: 791502e89142a7fc9e183253279d3650df021ce8
This commit is contained in:
Vlad Koshkin
2025-10-16 19:08:50 +00:00
committed by intellij-monorepo-bot
parent 4de0782dda
commit 6da59dacf8
40 changed files with 1203 additions and 765 deletions
@@ -7,6 +7,6 @@ import org.jetbrains.kotlin.scripting.definitions.ScriptConfigurationsProvider
class
ScriptHighlightingExtension : AbstractKotlinScriptHighlightingExtension {
override fun calculateShouldHighlightScript(file: KtFile): Boolean =
override fun shouldHighlight(file: KtFile): Boolean =
ScriptConfigurationsProvider.getInstance(file.project)?.getScriptConfigurationResult(file) != null
}
@@ -4,7 +4,6 @@ package org.jetbrains.kotlin.idea.core.script.k2.configurations.impl
import com.intellij.platform.workspace.storage.WorkspaceEntityInternalApi
import com.intellij.platform.workspace.storage.metadata.impl.MetadataStorageBase
import com.intellij.platform.workspace.storage.metadata.model.EntityMetadata
import com.intellij.platform.workspace.storage.metadata.model.ExtendableClassMetadata
import com.intellij.platform.workspace.storage.metadata.model.FinalClassMetadata
import com.intellij.platform.workspace.storage.metadata.model.OwnPropertyMetadata
import com.intellij.platform.workspace.storage.metadata.model.StorageTypeMetadata
@@ -15,8 +14,8 @@ internal object MetadataStorageImpl : MetadataStorageBase() {
override fun initializeMetadata() {
val primitiveTypeListNotNullable = ValueTypeMetadata.SimpleType.PrimitiveType(isNullable = false, type = "List")
val primitiveTypeStringNotNullable = ValueTypeMetadata.SimpleType.PrimitiveType(isNullable = false, type = "String")
val primitiveTypeBooleanNotNullable = ValueTypeMetadata.SimpleType.PrimitiveType(isNullable = false, type = "Boolean")
val primitiveTypeIntNotNullable = ValueTypeMetadata.SimpleType.PrimitiveType(isNullable = false, type = "Int")
val primitiveTypeStringNullable = ValueTypeMetadata.SimpleType.PrimitiveType(isNullable = true, type = "String")
var typeMetadata: StorageTypeMetadata
@@ -99,240 +98,64 @@ internal object MetadataStorageImpl : MetadataStorageBase() {
withDefault = false)),
supertypes = listOf("com.intellij.platform.workspace.storage.SymbolicEntityId")))),
primitive = primitiveTypeListNotNullable), withDefault = false),
OwnPropertyMetadata(isComputable = false, isKey = false, isOpen = false, name = "sdk",
valueType = ValueTypeMetadata.SimpleType.CustomType(isNullable = false,
typeMetadata = ExtendableClassMetadata.AbstractClassMetadata(
fqName = "com.intellij.platform.workspace.jps.entities.ModuleDependencyItem",
subclasses = listOf(FinalClassMetadata.ObjectMetadata(
fqName = "com.intellij.platform.workspace.jps.entities.ModuleSourceDependency",
properties = listOf(), supertypes = listOf(
"com.intellij.platform.workspace.jps.entities.ModuleDependencyItem",
"java.io.Serializable")),
FinalClassMetadata.ClassMetadata(
fqName = "com.intellij.platform.workspace.jps.entities.SdkDependency",
properties = listOf(
OwnPropertyMetadata(
isComputable = false,
isKey = false, isOpen = false,
name = "sdk",
valueType = ValueTypeMetadata.SimpleType.CustomType(
isNullable = false,
typeMetadata = FinalClassMetadata.ClassMetadata(
fqName = "com.intellij.platform.workspace.jps.entities.SdkId",
properties = listOf(
OwnPropertyMetadata(
isComputable = false,
isKey = false,
isOpen = false,
name = "name",
valueType = primitiveTypeStringNotNullable,
withDefault = false),
OwnPropertyMetadata(
isComputable = false,
isKey = false,
isOpen = false,
name = "presentableName",
valueType = primitiveTypeStringNotNullable,
withDefault = false),
OwnPropertyMetadata(
isComputable = false,
isKey = false,
isOpen = false,
name = "type",
valueType = primitiveTypeStringNotNullable,
withDefault = false)),
supertypes = listOf(
"com.intellij.platform.workspace.storage.SymbolicEntityId"))),
withDefault = false)),
supertypes = listOf(
"com.intellij.platform.workspace.jps.entities.ModuleDependencyItem",
"java.io.Serializable")),
FinalClassMetadata.ObjectMetadata(
fqName = "com.intellij.platform.workspace.jps.entities.InheritedSdkDependency",
properties = listOf(),
supertypes = listOf(
"com.intellij.platform.workspace.jps.entities.ModuleDependencyItem",
"java.io.Serializable")),
FinalClassMetadata.ClassMetadata(
fqName = "com.intellij.platform.workspace.jps.entities.LibraryDependency",
properties = listOf(
OwnPropertyMetadata(
isComputable = false,
isKey = false, isOpen = false,
name = "exported",
valueType = primitiveTypeBooleanNotNullable,
withDefault = false),
OwnPropertyMetadata(
isComputable = false,
isKey = false, isOpen = false,
name = "library",
valueType = ValueTypeMetadata.SimpleType.CustomType(
isNullable = false,
typeMetadata = FinalClassMetadata.ClassMetadata(
fqName = "com.intellij.platform.workspace.jps.entities.LibraryId",
properties = listOf(
OwnPropertyMetadata(
isComputable = false,
isKey = false,
isOpen = false,
name = "codeCache",
valueType = primitiveTypeIntNotNullable,
withDefault = false),
OwnPropertyMetadata(
isComputable = false,
isKey = false,
isOpen = false,
name = "name",
valueType = primitiveTypeStringNotNullable,
withDefault = false),
OwnPropertyMetadata(
isComputable = false,
isKey = false,
isOpen = false,
name = "presentableName",
valueType = primitiveTypeStringNotNullable,
withDefault = false),
OwnPropertyMetadata(
isComputable = false,
isKey = false,
isOpen = false,
name = "tableId",
valueType = ValueTypeMetadata.SimpleType.CustomType(
isNullable = false,
typeMetadata = ExtendableClassMetadata.AbstractClassMetadata(
fqName = "com.intellij.platform.workspace.jps.entities.LibraryTableId",
subclasses = listOf(
FinalClassMetadata.ObjectMetadata(
fqName = "com.intellij.platform.workspace.jps.entities.LibraryTableId\$ProjectLibraryTableId",
properties = listOf(
OwnPropertyMetadata(
isComputable = false,
isKey = false,
isOpen = false,
name = "level",
valueType = primitiveTypeStringNotNullable,
withDefault = false)),
supertypes = listOf(
"com.intellij.platform.workspace.jps.entities.LibraryTableId",
"java.io.Serializable")),
FinalClassMetadata.ClassMetadata(
fqName = "com.intellij.platform.workspace.jps.entities.LibraryTableId\$GlobalLibraryTableId",
properties = listOf(
OwnPropertyMetadata(
isComputable = false,
isKey = false,
isOpen = false,
name = "level",
valueType = primitiveTypeStringNotNullable,
withDefault = false)),
supertypes = listOf(
"com.intellij.platform.workspace.jps.entities.LibraryTableId",
"java.io.Serializable")),
FinalClassMetadata.ClassMetadata(
fqName = "com.intellij.platform.workspace.jps.entities.LibraryTableId\$ModuleLibraryTableId",
properties = listOf(
OwnPropertyMetadata(
isComputable = false,
isKey = false,
isOpen = false,
name = "level",
valueType = primitiveTypeStringNotNullable,
withDefault = false),
OwnPropertyMetadata(
isComputable = false,
isKey = false,
isOpen = false,
name = "moduleId",
valueType = ValueTypeMetadata.SimpleType.CustomType(
isNullable = false,
typeMetadata = FinalClassMetadata.ClassMetadata(
fqName = "com.intellij.platform.workspace.jps.entities.ModuleId",
properties = listOf(
OwnPropertyMetadata(
isComputable = false,
isKey = false,
isOpen = false,
name = "name",
valueType = primitiveTypeStringNotNullable,
withDefault = false),
OwnPropertyMetadata(
isComputable = false,
isKey = false,
isOpen = false,
name = "presentableName",
valueType = primitiveTypeStringNotNullable,
withDefault = false)),
supertypes = listOf(
"com.intellij.platform.workspace.storage.SymbolicEntityId"))),
withDefault = false)),
supertypes = listOf(
"com.intellij.platform.workspace.jps.entities.LibraryTableId",
"java.io.Serializable"))),
supertypes = listOf(
"java.io.Serializable"))),
withDefault = false)),
supertypes = listOf(
"com.intellij.platform.workspace.storage.SymbolicEntityId"))),
withDefault = false),
OwnPropertyMetadata(
isComputable = false,
isKey = false, isOpen = false,
name = "scope",
valueType = ValueTypeMetadata.SimpleType.CustomType(
isNullable = false,
typeMetadata = FinalClassMetadata.EnumClassMetadata(
fqName = "com.intellij.platform.workspace.jps.entities.DependencyScope",
properties = listOf(),
supertypes = listOf(
"java.io.Serializable",
"kotlin.Comparable",
"kotlin.Enum"),
values = listOf("COMPILE",
"PROVIDED",
"RUNTIME",
"TEST"))),
withDefault = false)),
supertypes = listOf(
"com.intellij.platform.workspace.jps.entities.ModuleDependencyItem",
"java.io.Serializable")),
FinalClassMetadata.ClassMetadata(
fqName = "com.intellij.platform.workspace.jps.entities.ModuleDependency",
properties = listOf(
OwnPropertyMetadata(
isComputable = false,
isKey = false, isOpen = false,
name = "exported",
valueType = primitiveTypeBooleanNotNullable,
withDefault = false),
OwnPropertyMetadata(
isComputable = false,
isKey = false, isOpen = false,
name = "module",
valueType = ValueTypeMetadata.SimpleType.CustomType(
isNullable = false,
typeMetadata = FinalClassMetadata.KnownClass(
fqName = "com.intellij.platform.workspace.jps.entities.ModuleId")),
withDefault = false),
OwnPropertyMetadata(
isComputable = false,
isKey = false, isOpen = false,
name = "productionOnTest",
valueType = primitiveTypeBooleanNotNullable,
withDefault = false),
OwnPropertyMetadata(
isComputable = false,
isKey = false, isOpen = false,
name = "scope",
valueType = ValueTypeMetadata.SimpleType.CustomType(
isNullable = false,
typeMetadata = FinalClassMetadata.KnownClass(
fqName = "com.intellij.platform.workspace.jps.entities.DependencyScope")),
withDefault = false)),
supertypes = listOf(
"com.intellij.platform.workspace.jps.entities.ModuleDependencyItem",
"java.io.Serializable"))),
supertypes = listOf("java.io.Serializable"))),
withDefault = false)), extProperties = listOf(), isAbstract = false)
OwnPropertyMetadata(isComputable = false, isKey = false, isOpen = false, name = "configuration",
valueType = ValueTypeMetadata.SimpleType.CustomType(isNullable = true,
typeMetadata = FinalClassMetadata.ClassMetadata(
fqName = "org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptCompilationConfigurationEntity",
properties = listOf(
OwnPropertyMetadata(isComputable = false, isKey = false,
isOpen = false, name = "data",
valueType = ValueTypeMetadata.SimpleType.CustomType(
isNullable = false,
typeMetadata = FinalClassMetadata.KnownClass(
fqName = "kotlin.ByteArray")),
withDefault = false)),
supertypes = listOf())), withDefault = false),
OwnPropertyMetadata(isComputable = false, isKey = false, isOpen = false, name = "sdkId",
valueType = ValueTypeMetadata.SimpleType.CustomType(isNullable = true,
typeMetadata = FinalClassMetadata.ClassMetadata(
fqName = "com.intellij.platform.workspace.jps.entities.SdkId",
properties = listOf(
OwnPropertyMetadata(isComputable = false, isKey = false,
isOpen = false, name = "name",
valueType = primitiveTypeStringNotNullable,
withDefault = false),
OwnPropertyMetadata(isComputable = false, isKey = false,
isOpen = false,
name = "presentableName",
valueType = primitiveTypeStringNotNullable,
withDefault = false),
OwnPropertyMetadata(isComputable = false, isKey = false,
isOpen = false, name = "type",
valueType = primitiveTypeStringNotNullable,
withDefault = false)),
supertypes = listOf(
"com.intellij.platform.workspace.storage.SymbolicEntityId"))),
withDefault = false),
OwnPropertyMetadata(isComputable = false, isKey = false, isOpen = false, name = "reports",
valueType = ValueTypeMetadata.ParameterizedType(generics = listOf(
ValueTypeMetadata.SimpleType.CustomType(isNullable = false, typeMetadata = FinalClassMetadata.ClassMetadata(
fqName = "org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptDiagnosticData", properties = listOf(
OwnPropertyMetadata(isComputable = false, isKey = false, isOpen = false, name = "code",
valueType = primitiveTypeIntNotNullable, withDefault = false),
OwnPropertyMetadata(isComputable = false, isKey = false, isOpen = false, name = "exceptionMessage",
valueType = primitiveTypeStringNullable, withDefault = false),
OwnPropertyMetadata(isComputable = false, isKey = false, isOpen = false, name = "location",
valueType = ValueTypeMetadata.SimpleType.CustomType(isNullable = true,
typeMetadata = FinalClassMetadata.KnownClass(
fqName = "kotlin.script.experimental.api.SourceCode\$Location")),
withDefault = false),
OwnPropertyMetadata(isComputable = false, isKey = false, isOpen = false, name = "message",
valueType = primitiveTypeStringNotNullable, withDefault = false),
OwnPropertyMetadata(isComputable = false, isKey = false, isOpen = false, name = "severity",
valueType = ValueTypeMetadata.SimpleType.CustomType(isNullable = false,
typeMetadata = FinalClassMetadata.KnownClass(
fqName = "kotlin.script.experimental.api.ScriptDiagnostic\$Severity")),
withDefault = false),
OwnPropertyMetadata(isComputable = false, isKey = false, isOpen = false, name = "sourcePath",
valueType = primitiveTypeStringNullable, withDefault = false)),
supertypes = listOf()))), primitive = primitiveTypeListNotNullable), withDefault = true)),
extProperties = listOf(), isAbstract = false)
addMetadata(typeMetadata)
@@ -406,25 +229,13 @@ internal object MetadataStorageImpl : MetadataStorageBase() {
}
override fun initializeMetadataHash() {
addMetadataHash(typeFqn = "org.jetbrains.kotlin.idea.core.script.k2.modules.KotlinScriptEntity", metadataHash = 56160960)
addMetadataHash(typeFqn = "org.jetbrains.kotlin.idea.core.script.k2.modules.KotlinScriptEntity", metadataHash = -904523740)
addMetadataHash(typeFqn = "org.jetbrains.kotlin.idea.core.script.k2.modules.KotlinScriptLibraryEntity", metadataHash = -366522520)
addMetadataHash(typeFqn = "org.jetbrains.kotlin.idea.core.script.k2.modules.KotlinScriptLibraryEntityId", metadataHash = -1990443645)
addMetadataHash(typeFqn = "com.intellij.platform.workspace.jps.entities.ModuleDependencyItem", metadataHash = -907000292)
addMetadataHash(typeFqn = "com.intellij.platform.workspace.jps.entities.InheritedSdkDependency", metadataHash = -1690206127)
addMetadataHash(typeFqn = "com.intellij.platform.workspace.jps.entities.LibraryDependency", metadataHash = 494611792)
addMetadataHash(typeFqn = "com.intellij.platform.workspace.jps.entities.LibraryId", metadataHash = 1192700660)
addMetadataHash(typeFqn = "com.intellij.platform.workspace.jps.entities.LibraryTableId", metadataHash = -219154451)
addMetadataHash(typeFqn = "com.intellij.platform.workspace.jps.entities.LibraryTableId\$GlobalLibraryTableId",
metadataHash = 1911253865)
addMetadataHash(typeFqn = "com.intellij.platform.workspace.jps.entities.LibraryTableId\$ModuleLibraryTableId", metadataHash = 777479370)
addMetadataHash(typeFqn = "com.intellij.platform.workspace.jps.entities.ModuleId", metadataHash = -575206713)
addMetadataHash(typeFqn = "com.intellij.platform.workspace.jps.entities.LibraryTableId\$ProjectLibraryTableId",
metadataHash = -1574432194)
addMetadataHash(typeFqn = "com.intellij.platform.workspace.jps.entities.DependencyScope", metadataHash = 1284754485)
addMetadataHash(typeFqn = "com.intellij.platform.workspace.jps.entities.ModuleDependency", metadataHash = -409169331)
addMetadataHash(typeFqn = "com.intellij.platform.workspace.jps.entities.ModuleSourceDependency", metadataHash = -1334065142)
addMetadataHash(typeFqn = "com.intellij.platform.workspace.jps.entities.SdkDependency", metadataHash = 1386665092)
addMetadataHash(typeFqn = "org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptCompilationConfigurationEntity",
metadataHash = -1162660984)
addMetadataHash(typeFqn = "com.intellij.platform.workspace.jps.entities.SdkId", metadataHash = 51502100)
addMetadataHash(typeFqn = "org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptDiagnosticData", metadataHash = -579968699)
addMetadataHash(typeFqn = "com.intellij.platform.workspace.storage.EntitySource", metadataHash = -706084288)
addMetadataHash(
typeFqn = "org.jetbrains.kotlin.idea.core.script.k2.configurations.DefaultScriptConfigurationHandler\$DefaultScriptEntitySource",
@@ -1,10 +1,9 @@
// Copyright 2000-2025 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.k2.modules
import com.intellij.platform.workspace.jps.entities.InheritedSdkDependency
import com.intellij.platform.workspace.jps.entities.ModuleDependencyItem
import com.intellij.platform.workspace.jps.entities.SdkDependency
import com.intellij.platform.workspace.jps.entities.SdkId
import com.intellij.platform.workspace.storage.*
import com.intellij.platform.workspace.storage.annotations.Default
import com.intellij.platform.workspace.storage.impl.containers.toMutableWorkspaceList
import com.intellij.platform.workspace.storage.url.VirtualFileUrl
@@ -13,7 +12,9 @@ interface ModifiableKotlinScriptEntity : ModifiableWorkspaceEntity<KotlinScriptE
override var entitySource: EntitySource
var virtualFileUrl: VirtualFileUrl
var dependencies: MutableList<KotlinScriptLibraryEntityId>
var sdk: ModuleDependencyItem
var configuration: ScriptCompilationConfigurationEntity?
var sdkId: SdkId?
var reports: MutableList<ScriptDiagnosticData>
}
internal object KotlinScriptEntityType : EntityType<KotlinScriptEntity, ModifiableKotlinScriptEntity>() {
@@ -21,14 +22,12 @@ internal object KotlinScriptEntityType : EntityType<KotlinScriptEntity, Modifiab
operator fun invoke(
virtualFileUrl: VirtualFileUrl,
dependencies: List<KotlinScriptLibraryEntityId>,
sdk: ModuleDependencyItem,
entitySource: EntitySource,
init: (ModifiableKotlinScriptEntity.() -> Unit)? = null,
): ModifiableKotlinScriptEntity {
val builder = builder()
builder.virtualFileUrl = virtualFileUrl
builder.dependencies = dependencies.toMutableWorkspaceList()
builder.sdk = sdk
builder.entitySource = entitySource
init?.invoke(builder)
return builder
@@ -45,7 +44,6 @@ fun MutableEntityStorage.modifyKotlinScriptEntity(
fun KotlinScriptEntity(
virtualFileUrl: VirtualFileUrl,
dependencies: List<KotlinScriptLibraryEntityId>,
sdk: ModuleDependencyItem,
entitySource: EntitySource,
init: (ModifiableKotlinScriptEntity.() -> Unit)? = null,
): ModifiableKotlinScriptEntity = KotlinScriptEntityType(virtualFileUrl, dependencies, sdk, entitySource, init)
): ModifiableKotlinScriptEntity = KotlinScriptEntityType(virtualFileUrl, dependencies, entitySource, init)
@@ -2,14 +2,7 @@
package org.jetbrains.kotlin.idea.core.script.k2.modules
import com.intellij.openapi.util.NlsSafe
import com.intellij.platform.workspace.storage.EntitySource
import com.intellij.platform.workspace.storage.EntityType
import com.intellij.platform.workspace.storage.GeneratedCodeApiVersion
import com.intellij.platform.workspace.storage.ModifiableWorkspaceEntity
import com.intellij.platform.workspace.storage.MutableEntityStorage
import com.intellij.platform.workspace.storage.SymbolicEntityId
import com.intellij.platform.workspace.storage.WorkspaceEntity
import com.intellij.platform.workspace.storage.WorkspaceEntityWithSymbolicId
import com.intellij.platform.workspace.storage.*
import com.intellij.platform.workspace.storage.impl.containers.toMutableWorkspaceList
import com.intellij.platform.workspace.storage.url.VirtualFileUrl
@@ -1,16 +1,9 @@
// Copyright 2000-2025 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.k2.modules.impl
import com.intellij.platform.workspace.jps.entities.InheritedSdkDependency
import com.intellij.platform.workspace.jps.entities.LibraryDependency
import com.intellij.platform.workspace.jps.entities.LibraryId
import com.intellij.platform.workspace.jps.entities.ModuleDependency
import com.intellij.platform.workspace.jps.entities.ModuleDependencyItem
import com.intellij.platform.workspace.jps.entities.ModuleId
import com.intellij.platform.workspace.jps.entities.ModuleSourceDependency
import com.intellij.platform.workspace.jps.entities.SdkDependency
import com.intellij.platform.workspace.jps.entities.SdkId
import com.intellij.platform.workspace.storage.*
import com.intellij.platform.workspace.storage.annotations.Default
import com.intellij.platform.workspace.storage.impl.ModifiableWorkspaceEntityBase
import com.intellij.platform.workspace.storage.impl.SoftLinkable
import com.intellij.platform.workspace.storage.impl.WorkspaceEntityBase
@@ -25,6 +18,8 @@ import com.intellij.platform.workspace.storage.url.VirtualFileUrl
import org.jetbrains.kotlin.idea.core.script.k2.modules.KotlinScriptEntity
import org.jetbrains.kotlin.idea.core.script.k2.modules.KotlinScriptLibraryEntityId
import org.jetbrains.kotlin.idea.core.script.k2.modules.ModifiableKotlinScriptEntity
import org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptCompilationConfigurationEntity
import org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptDiagnosticData
@GeneratedCodeApiVersion(3)
@GeneratedCodeImplVersion(7)
@@ -52,12 +47,20 @@ internal class KotlinScriptEntityImpl(private val dataSource: KotlinScriptEntity
return dataSource.dependencies
}
override val sdk: ModuleDependencyItem
override val configuration: ScriptCompilationConfigurationEntity?
get() {
readField("sdk")
return dataSource.sdk
readField("configuration")
return dataSource.configuration
}
override val sdkId: SdkId?
get() {
readField("sdkId")
return dataSource.sdkId
}
override var reports: List<ScriptDiagnosticData> = dataSource.reports
override val entitySource: EntitySource
get() {
readField("entitySource")
@@ -108,9 +111,6 @@ internal class KotlinScriptEntityImpl(private val dataSource: KotlinScriptEntity
if (!getEntityData().isDependenciesInitialized()) {
error("Field KotlinScriptEntity#dependencies should be initialized")
}
if (!getEntityData().isSdkInitialized()) {
error("Field KotlinScriptEntity#sdk should be initialized")
}
}
override fun connectionIdList(): List<ConnectionId> {
@@ -122,6 +122,10 @@ internal class KotlinScriptEntityImpl(private val dataSource: KotlinScriptEntity
if (collection_dependencies is MutableWorkspaceList<*>) {
collection_dependencies.cleanModificationUpdateAction()
}
val collection_reports = getEntityData().reports
if (collection_reports is MutableWorkspaceList<*>) {
collection_reports.cleanModificationUpdateAction()
}
}
// Relabeling code, move information from dataSource to this builder
@@ -130,7 +134,9 @@ internal class KotlinScriptEntityImpl(private val dataSource: KotlinScriptEntity
if (this.entitySource != dataSource.entitySource) this.entitySource = dataSource.entitySource
if (this.virtualFileUrl != dataSource.virtualFileUrl) this.virtualFileUrl = dataSource.virtualFileUrl
if (this.dependencies != dataSource.dependencies) this.dependencies = dataSource.dependencies.toMutableList()
if (this.sdk != dataSource.sdk) this.sdk = dataSource.sdk
if (this.configuration != dataSource?.configuration) this.configuration = dataSource.configuration
if (this.sdkId != dataSource?.sdkId) this.sdkId = dataSource.sdkId
if (this.reports != dataSource.reports) this.reports = dataSource.reports.toMutableList()
updateChildToParentReferences(parents)
}
@@ -176,15 +182,46 @@ internal class KotlinScriptEntityImpl(private val dataSource: KotlinScriptEntity
dependenciesUpdater.invoke(value)
}
override var sdk: ModuleDependencyItem
get() = getEntityData().sdk
override var configuration: ScriptCompilationConfigurationEntity?
get() = getEntityData().configuration
set(value) {
checkModificationAllowed()
getEntityData(true).sdk = value
changedProperty.add("sdk")
getEntityData(true).configuration = value
changedProperty.add("configuration")
}
override var sdkId: SdkId?
get() = getEntityData().sdkId
set(value) {
checkModificationAllowed()
getEntityData(true).sdkId = value
changedProperty.add("sdkId")
}
private val reportsUpdater: (value: List<ScriptDiagnosticData>) -> Unit = { value ->
changedProperty.add("reports")
}
override var reports: MutableList<ScriptDiagnosticData>
get() {
val collection_reports = getEntityData().reports
if (collection_reports !is MutableWorkspaceList) return collection_reports
if (diff == null || modifiable.get()) {
collection_reports.setModificationUpdateAction(reportsUpdater)
}
else {
collection_reports.cleanModificationUpdateAction()
}
return collection_reports
}
set(value) {
checkModificationAllowed()
getEntityData(true).reports = value
reportsUpdater.invoke(value)
}
override fun getEntityClass(): Class<KotlinScriptEntity> = KotlinScriptEntity::class.java
}
}
@@ -193,32 +230,23 @@ internal class KotlinScriptEntityImpl(private val dataSource: KotlinScriptEntity
internal class KotlinScriptEntityData : WorkspaceEntityData<KotlinScriptEntity>(), SoftLinkable {
lateinit var virtualFileUrl: VirtualFileUrl
lateinit var dependencies: MutableList<KotlinScriptLibraryEntityId>
lateinit var sdk: ModuleDependencyItem
var configuration: ScriptCompilationConfigurationEntity? = null
var sdkId: SdkId? = null
var reports: MutableList<ScriptDiagnosticData> = listOf<ScriptDiagnosticData>().toMutableWorkspaceList()
internal fun isVirtualFileUrlInitialized(): Boolean = ::virtualFileUrl.isInitialized
internal fun isDependenciesInitialized(): Boolean = ::dependencies.isInitialized
internal fun isSdkInitialized(): Boolean = ::sdk.isInitialized
override fun getLinks(): Set<SymbolicEntityId<*>> {
val result = HashSet<SymbolicEntityId<*>>()
for (item in dependencies) {
result.add(item)
}
val _sdk = sdk
when (_sdk) {
is InheritedSdkDependency -> {
}
is LibraryDependency -> {
result.add(_sdk.library)
}
is ModuleDependency -> {
result.add(_sdk.module)
}
is ModuleSourceDependency -> {
}
is SdkDependency -> {
result.add(_sdk.sdk)
}
val optionalLink_sdkId = sdkId
if (optionalLink_sdkId != null) {
result.add(optionalLink_sdkId)
}
for (item in reports) {
}
return result
}
@@ -227,21 +255,11 @@ internal class KotlinScriptEntityData : WorkspaceEntityData<KotlinScriptEntity>(
for (item in dependencies) {
index.index(this, item)
}
val _sdk = sdk
when (_sdk) {
is InheritedSdkDependency -> {
}
is LibraryDependency -> {
index.index(this, _sdk.library)
}
is ModuleDependency -> {
index.index(this, _sdk.module)
}
is ModuleSourceDependency -> {
}
is SdkDependency -> {
index.index(this, _sdk.sdk)
}
val optionalLink_sdkId = sdkId
if (optionalLink_sdkId != null) {
index.index(this, optionalLink_sdkId)
}
for (item in reports) {
}
}
@@ -254,31 +272,15 @@ internal class KotlinScriptEntityData : WorkspaceEntityData<KotlinScriptEntity>(
index.index(this, item)
}
}
val _sdk = sdk
when (_sdk) {
is InheritedSdkDependency -> {
}
is LibraryDependency -> {
val removedItem__sdk_library = mutablePreviousSet.remove(_sdk.library)
if (!removedItem__sdk_library) {
index.index(this, _sdk.library)
}
}
is ModuleDependency -> {
val removedItem__sdk_module = mutablePreviousSet.remove(_sdk.module)
if (!removedItem__sdk_module) {
index.index(this, _sdk.module)
}
}
is ModuleSourceDependency -> {
}
is SdkDependency -> {
val removedItem__sdk_sdk = mutablePreviousSet.remove(_sdk.sdk)
if (!removedItem__sdk_sdk) {
index.index(this, _sdk.sdk)
}
val optionalLink_sdkId = sdkId
if (optionalLink_sdkId != null) {
val removedItem_optionalLink_sdkId = mutablePreviousSet.remove(optionalLink_sdkId)
if (!removedItem_optionalLink_sdkId) {
index.index(this, optionalLink_sdkId)
}
}
for (item in reports) {
}
for (removed in mutablePreviousSet) {
index.remove(this, removed)
}
@@ -304,59 +306,21 @@ internal class KotlinScriptEntityData : WorkspaceEntityData<KotlinScriptEntity>(
if (dependencies_data != null) {
dependencies = dependencies_data as MutableList<KotlinScriptLibraryEntityId>
}
val _sdk = sdk
val res_sdk = when (_sdk) {
is InheritedSdkDependency -> {
_sdk
var sdkId_data_optional = if (sdkId != null) {
val sdkId___data = if (sdkId!! == oldLink) {
changed = true
newLink as SdkId
}
is LibraryDependency -> {
val _sdk_library_data = if (_sdk.library == oldLink) {
changed = true
newLink as LibraryId
}
else {
null
}
var _sdk_data = _sdk
if (_sdk_library_data != null) {
_sdk_data = _sdk_data.copy(library = _sdk_library_data)
}
_sdk_data
}
is ModuleDependency -> {
val _sdk_module_data = if (_sdk.module == oldLink) {
changed = true
newLink as ModuleId
}
else {
null
}
var _sdk_data = _sdk
if (_sdk_module_data != null) {
_sdk_data = _sdk_data.copy(module = _sdk_module_data)
}
_sdk_data
}
is ModuleSourceDependency -> {
_sdk
}
is SdkDependency -> {
val _sdk_sdk_data = if (_sdk.sdk == oldLink) {
changed = true
newLink as SdkId
}
else {
null
}
var _sdk_data = _sdk
if (_sdk_sdk_data != null) {
_sdk_data = _sdk_data.copy(sdk = _sdk_sdk_data)
}
_sdk_data
else {
null
}
sdkId___data
}
if (res_sdk != null) {
sdk = res_sdk
else {
null
}
if (sdkId_data_optional != null) {
sdkId = sdkId_data_optional
}
return changed
}
@@ -387,6 +351,7 @@ internal class KotlinScriptEntityData : WorkspaceEntityData<KotlinScriptEntity>(
val clonedEntity = super.clone()
clonedEntity as KotlinScriptEntityData
clonedEntity.dependencies = clonedEntity.dependencies.toMutableWorkspaceList()
clonedEntity.reports = clonedEntity.reports.toMutableWorkspaceList()
return clonedEntity
}
@@ -395,7 +360,10 @@ internal class KotlinScriptEntityData : WorkspaceEntityData<KotlinScriptEntity>(
}
override fun createDetachedEntity(parents: List<ModifiableWorkspaceEntity<*>>): ModifiableWorkspaceEntity<*> {
return KotlinScriptEntity(virtualFileUrl, dependencies, sdk, entitySource) {
return KotlinScriptEntity(virtualFileUrl, dependencies, entitySource) {
this.configuration = this@KotlinScriptEntityData.configuration
this.sdkId = this@KotlinScriptEntityData.sdkId
this.reports = this@KotlinScriptEntityData.reports.toMutableWorkspaceList()
}
}
@@ -413,7 +381,9 @@ internal class KotlinScriptEntityData : WorkspaceEntityData<KotlinScriptEntity>(
if (this.entitySource != other.entitySource) return false
if (this.virtualFileUrl != other.virtualFileUrl) return false
if (this.dependencies != other.dependencies) return false
if (this.sdk != other.sdk) return false
if (this.configuration != other.configuration) return false
if (this.sdkId != other.sdkId) return false
if (this.reports != other.reports) return false
return true
}
@@ -425,7 +395,9 @@ internal class KotlinScriptEntityData : WorkspaceEntityData<KotlinScriptEntity>(
if (this.virtualFileUrl != other.virtualFileUrl) return false
if (this.dependencies != other.dependencies) return false
if (this.sdk != other.sdk) return false
if (this.configuration != other.configuration) return false
if (this.sdkId != other.sdkId) return false
if (this.reports != other.reports) return false
return true
}
@@ -433,7 +405,9 @@ internal class KotlinScriptEntityData : WorkspaceEntityData<KotlinScriptEntity>(
var result = entitySource.hashCode()
result = 31 * result + virtualFileUrl.hashCode()
result = 31 * result + dependencies.hashCode()
result = 31 * result + sdk.hashCode()
result = 31 * result + configuration.hashCode()
result = 31 * result + sdkId.hashCode()
result = 31 * result + reports.hashCode()
return result
}
@@ -441,7 +415,9 @@ internal class KotlinScriptEntityData : WorkspaceEntityData<KotlinScriptEntity>(
var result = javaClass.hashCode()
result = 31 * result + virtualFileUrl.hashCode()
result = 31 * result + dependencies.hashCode()
result = 31 * result + sdk.hashCode()
result = 31 * result + configuration.hashCode()
result = 31 * result + sdkId.hashCode()
result = 31 * result + reports.hashCode()
return result
}
}
@@ -2,17 +2,7 @@
package org.jetbrains.kotlin.idea.core.script.k2.modules.impl
import com.intellij.openapi.util.NlsSafe
import com.intellij.platform.workspace.storage.ConnectionId
import com.intellij.platform.workspace.storage.EntitySource
import com.intellij.platform.workspace.storage.EntityType
import com.intellij.platform.workspace.storage.GeneratedCodeApiVersion
import com.intellij.platform.workspace.storage.GeneratedCodeImplVersion
import com.intellij.platform.workspace.storage.ModifiableWorkspaceEntity
import com.intellij.platform.workspace.storage.MutableEntityStorage
import com.intellij.platform.workspace.storage.SymbolicEntityId
import com.intellij.platform.workspace.storage.WorkspaceEntity
import com.intellij.platform.workspace.storage.WorkspaceEntityInternalApi
import com.intellij.platform.workspace.storage.WorkspaceEntityWithSymbolicId
import com.intellij.platform.workspace.storage.*
import com.intellij.platform.workspace.storage.impl.ModifiableWorkspaceEntityBase
import com.intellij.platform.workspace.storage.impl.WorkspaceEntityBase
import com.intellij.platform.workspace.storage.impl.WorkspaceEntityData
@@ -13,11 +13,6 @@
interface="org.jetbrains.kotlin.idea.core.script.k2.modules.K2IdeScriptAdditionalIdeaDependenciesProvider"
dynamic="true"/>
<extensionPoint
qualifiedName="org.jetbrains.kotlin.kotlinScripDeferredResolutionPolicy"
interface="org.jetbrains.kotlin.idea.core.script.k2.highlighting.KotlinScripDeferredResolutionPolicy"
area="IDEA_PROJECT"
dynamic="true"/>
</extensionPoints>
<extensions defaultExtensionNs="com.intellij">
@@ -9,8 +9,6 @@ import com.intellij.openapi.roots.ProjectRootManager
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.platform.backend.workspace.WorkspaceModel
import com.intellij.platform.backend.workspace.toVirtualFileUrl
import com.intellij.platform.workspace.jps.entities.InheritedSdkDependency
import com.intellij.platform.workspace.jps.entities.SdkDependency
import com.intellij.platform.workspace.jps.entities.SdkId
import com.intellij.platform.workspace.storage.EntitySource
import com.intellij.platform.workspace.storage.MutableEntityStorage
@@ -69,7 +67,7 @@ open class DefaultScriptConfigurationHandler(
project.service<ScriptReportSink>().attachReports(virtualFile, result.reports)
return ScriptConfigurationWithSdk(result, sdk)
return ScriptConfigurationWithSdk(result, sdk?.let { SdkId(it.name, it.sdkType.name) })
}
override suspend fun updateWorkspaceModel(configurationPerFile: Map<VirtualFile, ScriptConfigurationWithSdk>) {
@@ -105,12 +103,11 @@ open class DefaultScriptConfigurationHandler(
result addEntity KotlinScriptLibraryEntity(classes, sources, DefaultScriptEntitySource)
}
val sdk = configurationWithSdk.sdk?.let { SdkDependency(SdkId(it.name, it.sdkType.name)) }
result addEntity KotlinScriptEntity(
scriptUrl, libraryIds.toList(),
sdk ?: InheritedSdkDependency, DefaultScriptEntitySource
)
scriptUrl, libraryIds.toList(), DefaultScriptEntitySource
) {
this.sdkId = configurationWithSdk.sdkId
}
}
return result
@@ -4,12 +4,9 @@ package org.jetbrains.kotlin.idea.core.script.k2.configurations
import com.google.common.collect.TreeMultimap
import com.google.common.graph.Traverser
import com.intellij.openapi.application.smartReadAction
import com.intellij.openapi.application.writeAction
import com.intellij.openapi.components.Service
import com.intellij.openapi.components.service
import com.intellij.openapi.project.Project
import com.intellij.openapi.projectRoots.JavaSdk
import com.intellij.openapi.projectRoots.ProjectJdkTable
import com.intellij.openapi.roots.ProjectRootManager
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.platform.backend.workspace.WorkspaceModel
@@ -18,11 +15,10 @@ import com.intellij.platform.backend.workspace.workspaceModel
import com.intellij.platform.ide.progress.withBackgroundProgress
import com.intellij.platform.util.progress.ProgressReporter
import com.intellij.platform.util.progress.reportProgressScope
import com.intellij.platform.workspace.jps.entities.InheritedSdkDependency
import com.intellij.platform.workspace.jps.entities.SdkId
import com.intellij.platform.workspace.storage.EntitySource
import com.intellij.platform.workspace.storage.MutableEntityStorage
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import org.jetbrains.kotlin.idea.core.script.k2.configurations.DefaultScriptConfigurationHandler.DefaultScriptEntitySource
import org.jetbrains.kotlin.idea.core.script.k2.modules.KotlinScriptEntity
import org.jetbrains.kotlin.idea.core.script.k2.modules.KotlinScriptLibraryEntity
@@ -86,13 +82,6 @@ class MainKtsScriptConfigurationProvider(val project: Project, val coroutineScop
private suspend fun resolveMainKtsConfiguration(mainKts: VirtualFile, definition: ScriptDefinition): ScriptConfigurationWithSdk {
val scriptSource = VirtualFileScriptSource(mainKts)
val sdk = ProjectRootManager.getInstance(project).projectSdk
?: ProjectJdkTable.getInstance().findMostRecentSdkOfType(JavaSdk.getInstance())?.also {
coroutineScope.launch {
writeAction {
ProjectRootManager.getInstance(project).projectSdk = it
}
}
}
val providedConfiguration = sdk?.homePath?.let { jdkHome ->
definition.compilationConfiguration.with {
@@ -115,7 +104,7 @@ class MainKtsScriptConfigurationProvider(val project: Project, val coroutineScop
}
}
return ScriptConfigurationWithSdk(result, sdk)
return ScriptConfigurationWithSdk(result, sdk?.let { SdkId(it.name, it.sdkType.name) })
}
override suspend fun updateWorkspaceModel(configurationPerFile: Map<VirtualFile, ScriptConfigurationWithSdk>) {
@@ -162,8 +151,10 @@ class MainKtsScriptConfigurationProvider(val project: Project, val coroutineScop
}
storageToUpdate addEntity KotlinScriptEntity(
virtualFileUrl, libraryIds.toList(), InheritedSdkDependency, MainKtsKotlinScriptEntitySource
)
virtualFileUrl, libraryIds.toList(), MainKtsKotlinScriptEntitySource
) {
this.sdkId = configurationWithSdk.sdkId
}
}
return storageToUpdate
@@ -1,7 +1,7 @@
// Copyright 2000-2024 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.k2.configurations
import com.intellij.openapi.projectRoots.Sdk
import com.intellij.platform.workspace.jps.entities.SdkId
import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrapper
import kotlin.script.experimental.api.ResultWithDiagnostics
@@ -9,7 +9,7 @@ typealias ScriptConfiguration = ResultWithDiagnostics<ScriptCompilationConfigura
data class ScriptConfigurationWithSdk(
val scriptConfiguration: ScriptConfiguration,
val sdk: Sdk?,
val sdkId: SdkId?,
) {
companion object {
val EMPTY: ScriptConfigurationWithSdk = ScriptConfigurationWithSdk(ResultWithDiagnostics.Failure(), null)
@@ -3,22 +3,22 @@ package org.jetbrains.kotlin.idea.core.script.k2.configurations
import com.intellij.openapi.components.service
import com.intellij.openapi.project.Project
import com.intellij.openapi.projectRoots.ProjectJdkTable
import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.roots.OrderRootType
import com.intellij.openapi.roots.ProjectRootManager
import com.intellij.openapi.util.Key
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.platform.backend.workspace.toVirtualFileUrl
import com.intellij.platform.backend.workspace.virtualFile
import com.intellij.platform.backend.workspace.workspaceModel
import com.intellij.platform.workspace.jps.entities.InheritedSdkDependency
import com.intellij.platform.workspace.jps.entities.SdkDependency
import com.intellij.platform.workspace.jps.entities.SdkEntity
import com.intellij.platform.workspace.jps.entities.SdkRootTypeId
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.search.NonClasspathDirectoriesScope.compose
import com.intellij.psi.util.CachedValue
import com.intellij.psi.util.CachedValueProvider
import com.intellij.psi.util.CachedValuesManager
import com.intellij.workspaceModel.ide.impl.legacyBridge.sdk.customName
import com.intellij.workspaceModel.ide.legacyBridge.ModifiableRootModelBridge
import kotlinx.coroutines.CoroutineScope
import org.jetbrains.kotlin.idea.core.script.k2.modules.KotlinScriptEntity
import org.jetbrains.kotlin.idea.core.script.k2.modules.KotlinScriptLibraryEntity
@@ -44,7 +44,7 @@ private class AllScriptsDependencies(
private data class ScriptDependencies(
val classes: Collection<VirtualFile>,
val sources: Collection<VirtualFile>,
val sdk: Sdk?,
val sdk: SdkEntity?,
) {
companion object {
val EMPTY = ScriptDependencies(setOf(), setOf(), null)
@@ -61,10 +61,10 @@ class ScriptConfigurationsProviderImpl(project: Project, val coroutineScope: Cor
val (classes, sources) = snapshot.entities(KotlinScriptLibraryEntity::class.java).toClassesSources()
val (sdkClasses, sdkSources) =
snapshot.entities(KotlinScriptEntity::class.java).mapNotNull { it.jdk }
snapshot.entities(KotlinScriptEntity::class.java).mapNotNull { entity -> entity.sdkId?.let { snapshot.resolve(it) } }
.fold(mutableSetOf<VirtualFile>() to mutableSetOf<VirtualFile>()) { (accClasses, accSources), jdk ->
accClasses += jdk.rootProvider.getFiles(OrderRootType.CLASSES).toList()
accSources += jdk.rootProvider.getFiles(OrderRootType.SOURCES).toList()
accClasses += jdk.roots.filter { it.type == classesTypeId }.mapNotNull { it.url.virtualFile }
accClasses += jdk.roots.filter { it.type == sourcesTypeId }.mapNotNull { it.url.virtualFile }
accClasses to accSources
}
@@ -82,15 +82,16 @@ class ScriptConfigurationsProviderImpl(project: Project, val coroutineScope: Cor
}
override fun getScriptDependenciesClassFilesScope(virtualFile: VirtualFile): GlobalSearchScope {
val (classes, _, sdk) = virtualFile.currentDependencies
val sdkClasses = sdk?.rootProvider?.getFiles(OrderRootType.CLASSES)?.toList() ?: emptyList<VirtualFile>()
return compose(classes + sdkClasses)
val sdk = virtualFile.currentDependencies.sdk
val sdkClasses = sdk?.roots?.filter { it.type == classesTypeId }?.mapNotNull { it.url.virtualFile } ?: emptyList()
return compose(virtualFile.currentDependencies.classes + sdkClasses)
}
override fun getScriptDependenciesClassFiles(virtualFile: VirtualFile): Collection<VirtualFile> =
virtualFile.currentDependencies.classes
override fun getScriptSdk(virtualFile: VirtualFile): Sdk? = virtualFile.currentDependencies.sdk
override fun getScriptSdk(virtualFile: VirtualFile): Sdk? =
virtualFile.currentDependencies.sdk?.let { ModifiableRootModelBridge.findSdk(it.name, it.type) }
private val VirtualFile.currentDependencies: ScriptDependencies
get() {
@@ -106,7 +107,7 @@ class ScriptConfigurationsProviderImpl(project: Project, val coroutineScope: Cor
.toClassesSources()
return ScriptDependencies(
classes, sources, entity.jdk
classes, sources, entity.sdkId?.let { snapshot.resolve(it) }
)
}
@@ -117,13 +118,6 @@ class ScriptConfigurationsProviderImpl(project: Project, val coroutineScope: Cor
accClasses to accSources
}
private val KotlinScriptEntity.jdk: Sdk?
get() = when (val sdkDependency = sdk) {
is SdkDependency -> ProjectJdkTable.getInstance().findJdk(sdkDependency.sdk.name, sdkDependency.sdk.type)
is InheritedSdkDependency -> ProjectRootManager.getInstance(project).projectSdk
else -> null
}
override fun getScriptConfigurationResult(file: KtFile): ScriptCompilationConfigurationResult? {
val definition = file.findScriptDefinition() ?: return null
return getConfigurationSupplier(definition).get(file.alwaysVirtualFile)?.scriptConfiguration
@@ -135,6 +129,9 @@ class ScriptConfigurationsProviderImpl(project: Project, val coroutineScope: Cor
}
companion object {
private val classesTypeId = SdkRootTypeId(OrderRootType.CLASSES.customName)
private val sourcesTypeId = SdkRootTypeId(OrderRootType.SOURCES.customName)
fun getInstance(project: Project): ScriptConfigurationsProviderImpl =
project.service<ScriptConfigurationsProvider>() as ScriptConfigurationsProviderImpl
}
@@ -11,11 +11,7 @@ import com.intellij.util.io.URLUtil
import org.jetbrains.annotations.ApiStatus
import org.jetbrains.kotlin.idea.core.script.k2.modules.KotlinScriptLibraryEntityId
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import kotlin.script.experimental.api.ScriptCompilationConfiguration
import kotlin.script.experimental.api.ScriptDependency
import kotlin.script.experimental.api.dependencies
import kotlin.script.experimental.api.dependenciesSources
import kotlin.script.experimental.api.ide
import kotlin.script.experimental.api.*
import kotlin.script.experimental.jvm.JvmDependency
import kotlin.script.experimental.util.PropertiesCollection
@@ -85,4 +81,4 @@ private fun Iterable<ScriptDependency>.toVirtualFileUrls(urlManager: VirtualFile
.sorted()
.map { it.toVirtualFileUrl(urlManager) }
private fun <T> PropertiesCollection.getOrEmpty(key: PropertiesCollection.Key<List<T>>): List<T> = get(key).orEmpty()
private fun <T> PropertiesCollection.getOrEmpty(key: PropertiesCollection.Key<List<T>>): List<T> = get(key).orEmpty()
@@ -7,7 +7,6 @@ import com.intellij.openapi.application.edtWriteAction
import com.intellij.openapi.application.readAction
import com.intellij.openapi.components.Service
import com.intellij.openapi.components.service
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.fileEditor.FileEditor
import com.intellij.openapi.fileEditor.FileEditorManager
import com.intellij.openapi.project.Project
@@ -18,11 +17,10 @@ import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import org.jetbrains.kotlin.analysis.api.platform.modification.publishGlobalModuleStateModificationEvent
import org.jetbrains.kotlin.analysis.api.platform.modification.publishGlobalScriptModuleStateModificationEvent
import org.jetbrains.kotlin.idea.core.script.k2.configurations.ScriptConfigurationsProviderImpl
import org.jetbrains.kotlin.idea.core.script.k2.configurations.getConfigurationResolver
import org.jetbrains.kotlin.idea.core.script.k2.configurations.getWorkspaceModelManager
import org.jetbrains.kotlin.idea.core.script.v1.alwaysVirtualFile
import org.jetbrains.kotlin.idea.core.script.v1.ScriptDependenciesModificationTracker
import org.jetbrains.kotlin.idea.core.script.v1.alwaysVirtualFile
import org.jetbrains.kotlin.idea.core.script.v1.scriptingDebugLog
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
@@ -52,11 +50,9 @@ class DefaultScriptResolutionStrategy(val project: Project, val coroutineScope:
}
fun execute(vararg ktFiles: KtFile): Job {
val definitionByFile = ktFiles
.filterNot { KotlinScripDeferredResolutionPolicy.shouldDeferResolution(project, it.virtualFile) }
.associateWith {
findScriptDefinition(project, KtFileScriptSource(it))
}
val definitionByFile = ktFiles.associateWith {
findScriptDefinition(project, KtFileScriptSource(it))
}
scriptingDebugLog {
val baseDirPath = project.basePath?.toNioPathOrNull()
@@ -89,6 +85,10 @@ class DefaultScriptResolutionStrategy(val project: Project, val coroutineScope:
projectModelUpdater.updateWorkspaceModel(configurationPerVirtualFile)
restartHighlighting(definitionByFile.keys)
}
suspend fun restartHighlighting(scripts: Iterable<KtFile>) {
edtWriteAction {
project.publishGlobalModuleStateModificationEvent()
project.publishGlobalScriptModuleStateModificationEvent()
@@ -102,7 +102,7 @@ class DefaultScriptResolutionStrategy(val project: Project, val coroutineScope:
}
if (project.isOpen && !project.isDisposed) {
for (ktFile in definitionByFile.keys) {
for (ktFile in scripts) {
if (ktFile.alwaysVirtualFile !in filesInEditors) continue
if (project.isOpen && !project.isDisposed) {
readAction {
@@ -116,8 +116,5 @@ class DefaultScriptResolutionStrategy(val project: Project, val coroutineScope:
companion object {
@JvmStatic
fun getInstance(project: Project): DefaultScriptResolutionStrategy = project.service()
private val logger: Logger
get() = Logger.getInstance(DefaultScriptResolutionStrategy::class.java)
}
}
@@ -1,22 +0,0 @@
// Copyright 2000-2025 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.k2.highlighting
import com.intellij.openapi.extensions.ProjectExtensionPointName
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
/**
* Regular scripts (.kts) do not support external dependencies, so there is no need to postpone resolving.
* However, certain plugins (e.g., Gradle) may apply their own approach to scripting analysis, which occasionally doesn't imply lazy evaluation.
*/
interface KotlinScripDeferredResolutionPolicy {
companion object {
val EP_NAME: ProjectExtensionPointName<KotlinScripDeferredResolutionPolicy> =
ProjectExtensionPointName<KotlinScripDeferredResolutionPolicy>("org.jetbrains.kotlin.kotlinScripDeferredResolutionPolicy")
fun shouldDeferResolution(project: Project, script: VirtualFile): Boolean =
EP_NAME.getExtensions(project).any { it.shouldDeferResolution(script) }
}
fun shouldDeferResolution(script: VirtualFile): Boolean = false
}
@@ -5,7 +5,7 @@ import org.jetbrains.kotlin.idea.core.script.shared.AbstractKotlinScriptHighligh
import org.jetbrains.kotlin.psi.KtFile
class ScriptHighlightingExtension : AbstractKotlinScriptHighlightingExtension {
override fun calculateShouldHighlightScript(file: KtFile): Boolean {
override fun shouldHighlight(file: KtFile): Boolean {
val strategy = DefaultScriptResolutionStrategy.getInstance(file.project)
return strategy.isReadyToHighlight(file).also { isReady -> if (!isReady) strategy.execute(file) }
}
@@ -1,10 +1,9 @@
// Copyright 2000-2025 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.k2.modules
import com.intellij.platform.workspace.jps.entities.InheritedSdkDependency
import com.intellij.platform.workspace.jps.entities.ModuleDependencyItem
import com.intellij.platform.workspace.jps.entities.SdkDependency
import com.intellij.platform.workspace.jps.entities.SdkId
import com.intellij.platform.workspace.storage.*
import com.intellij.platform.workspace.storage.annotations.Default
import com.intellij.platform.workspace.storage.impl.containers.toMutableWorkspaceList
import com.intellij.platform.workspace.storage.url.VirtualFileUrl
@@ -12,5 +11,10 @@ import com.intellij.platform.workspace.storage.url.VirtualFileUrl
interface KotlinScriptEntity : WorkspaceEntity {
val virtualFileUrl: VirtualFileUrl
val dependencies: List<KotlinScriptLibraryEntityId>
val sdk: ModuleDependencyItem
val configuration: ScriptCompilationConfigurationEntity?
val sdkId: SdkId?
@Suppress("RemoveExplicitTypeArguments")
val reports: List<ScriptDiagnosticData>
@Default get() = listOf<ScriptDiagnosticData>()
}
@@ -2,13 +2,7 @@
package org.jetbrains.kotlin.idea.core.script.k2.modules
import com.intellij.openapi.util.NlsSafe
import com.intellij.platform.workspace.storage.EntitySource
import com.intellij.platform.workspace.storage.EntityType
import com.intellij.platform.workspace.storage.GeneratedCodeApiVersion
import com.intellij.platform.workspace.storage.MutableEntityStorage
import com.intellij.platform.workspace.storage.SymbolicEntityId
import com.intellij.platform.workspace.storage.WorkspaceEntity
import com.intellij.platform.workspace.storage.WorkspaceEntityWithSymbolicId
import com.intellij.platform.workspace.storage.*
import com.intellij.platform.workspace.storage.impl.containers.toMutableWorkspaceList
import com.intellij.platform.workspace.storage.url.VirtualFileUrl
@@ -11,6 +11,9 @@ import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
import org.jetbrains.kotlin.idea.core.script.k2.configurations.ScriptConfigurationWithSdk
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import kotlin.script.experimental.api.ScriptDiagnostic
import kotlin.script.experimental.api.ScriptDiagnostic.Severity
import kotlin.script.experimental.api.SourceCode
interface ScriptWorkspaceModelManager {
suspend fun updateWorkspaceModel(configurationPerFile: Map<VirtualFile, ScriptConfigurationWithSdk>)
@@ -51,4 +54,60 @@ class KotlinScriptModuleManager(private val project: Project, private val corout
@JvmStatic
fun getInstance(project: Project): KotlinScriptModuleManager = project.service()
}
}
}
data class ScriptingHostConfigurationEntity(val data: ByteArray) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as ScriptingHostConfigurationEntity
return data.contentEquals(other.data)
}
override fun hashCode(): Int = data.contentHashCode()
}
data class ScriptEvaluationConfigurationEntity(val data: ByteArray) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as ScriptEvaluationConfigurationEntity
return data.contentEquals(other.data)
}
override fun hashCode(): Int = data.contentHashCode()
}
data class ScriptCompilationConfigurationEntity(val data: ByteArray) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (javaClass != other?.javaClass) return false
other as ScriptCompilationConfigurationEntity
return data.contentEquals(other.data)
}
override fun hashCode(): Int = data.contentHashCode()
}
data class ScriptDiagnosticData(
val code: Int,
val message: String,
val severity: Severity = Severity.ERROR,
val sourcePath: String? = null,
val location: SourceCode.Location? = null,
val exceptionMessage: String? = null
) {
fun toScriptDiagnostic(): ScriptDiagnostic = ScriptDiagnostic(
code, message, severity, sourcePath, location, Throwable(exceptionMessage)
)
}
fun ScriptDiagnostic.toData(): ScriptDiagnosticData =
ScriptDiagnosticData(code, message, severity, sourcePath, location, exception?.message)
@@ -14,26 +14,26 @@ import org.jetbrains.kotlin.psi.KtFile
import kotlin.script.experimental.api.ScriptDiagnostic
interface AbstractKotlinScriptHighlightingExtension : KotlinScriptHighlightingExtension {
fun calculateShouldHighlightScript(file: KtFile): Boolean
fun shouldHighlight(file: KtFile): Boolean
override fun shouldHighlightScript(file: KtFile): Boolean {
val project = file.project
return CachedValuesManager.getManager(file.project).getCachedValue(file) {
create(
file.calculateShouldHighlightScript(file),
file.calculateShouldHighlightScript(),
ProjectRootModificationTracker.getInstance(project),
ScriptDependenciesModificationTracker.getInstance(project)
)
}
}
private fun KtFile.calculateShouldHighlightScript(file: KtFile): Boolean {
private fun KtFile.calculateShouldHighlightScript(): Boolean {
if (shouldDefinitelyHighlight()) return true
if (KotlinPlatformUtils.isCidr) return false
if (getScriptReports(file).any { it.severity == ScriptDiagnostic.Severity.FATAL }) return false
if (getScriptReports(this).any { it.severity == ScriptDiagnostic.Severity.FATAL }) return false
return RootKindFilter.projectSources.copy(includeScriptsOutsideSourceRoots = true)
.matches(this) && this@AbstractKotlinScriptHighlightingExtension.calculateShouldHighlightScript(this)
.matches(this) && shouldHighlight(this)
}
}
@@ -29,7 +29,7 @@ jvm_library(
name = "kotlin-gradle-scripting",
module_name = "intellij.kotlin.gradle.scripting",
visibility = ["//visibility:public"],
srcs = glob(["src/**/*.kt", "src/**/*.java", "src/**/*.form"], allow_empty = True),
srcs = glob(["src/**/*.kt", "src/**/*.java", "src/**/*.form", "gen/**/*.kt", "gen/**/*.java"], allow_empty = True),
resources = [
":kotlin-gradle-scripting_resources",
":kotlin-gradle-scripting_resources_1",
@@ -73,6 +73,7 @@ jvm_library(
"//java/openapi:java",
"//platform/platform-impl:ide-impl",
"//plugins/kotlin/gradle/gradle-tooling/impl",
"//plugins/kotlin/highlighting/highlighting-shared:kotlin-highlighting-shared",
]
)
@@ -149,6 +150,7 @@ jvm_library(
"//platform/platform-impl:ide-impl",
"//plugins/kotlin/gradle/gradle-tooling/impl",
"//plugins/kotlin/gradle/gradle-tooling/impl:impl_test_lib",
"//plugins/kotlin/highlighting/highlighting-shared:kotlin-highlighting-shared",
]
)
### auto-generated section `build intellij.kotlin.gradle.scripting` end
@@ -0,0 +1,52 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.gradle.scripting.k2.workspaceModel
import com.intellij.openapi.util.NlsSafe
import com.intellij.platform.workspace.storage.*
import org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptCompilationConfigurationEntity
import org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptEvaluationConfigurationEntity
import org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptingHostConfigurationEntity
@GeneratedCodeApiVersion(3)
interface ModifiableGradleScriptDefinitionEntity : ModifiableWorkspaceEntity<GradleScriptDefinitionEntity> {
override var entitySource: EntitySource
var definitionId: String
var compilationConfiguration: ScriptCompilationConfigurationEntity
var hostConfiguration: ScriptingHostConfigurationEntity
var evaluationConfiguration: ScriptEvaluationConfigurationEntity?
}
internal object GradleScriptDefinitionEntityType : EntityType<GradleScriptDefinitionEntity, ModifiableGradleScriptDefinitionEntity>() {
override val entityClass: Class<GradleScriptDefinitionEntity> get() = GradleScriptDefinitionEntity::class.java
operator fun invoke(
definitionId: String,
compilationConfiguration: ScriptCompilationConfigurationEntity,
hostConfiguration: ScriptingHostConfigurationEntity,
entitySource: EntitySource,
init: (ModifiableGradleScriptDefinitionEntity.() -> Unit)? = null,
): ModifiableGradleScriptDefinitionEntity {
val builder = builder()
builder.definitionId = definitionId
builder.compilationConfiguration = compilationConfiguration
builder.hostConfiguration = hostConfiguration
builder.entitySource = entitySource
init?.invoke(builder)
return builder
}
}
fun MutableEntityStorage.modifyGradleScriptDefinitionEntity(
entity: GradleScriptDefinitionEntity,
modification: ModifiableGradleScriptDefinitionEntity.() -> Unit,
): GradleScriptDefinitionEntity = modifyEntity(ModifiableGradleScriptDefinitionEntity::class.java, entity, modification)
@JvmOverloads
@JvmName("createGradleScriptDefinitionEntity")
fun GradleScriptDefinitionEntity(
definitionId: String,
compilationConfiguration: ScriptCompilationConfigurationEntity,
hostConfiguration: ScriptingHostConfigurationEntity,
entitySource: EntitySource,
init: (ModifiableGradleScriptDefinitionEntity.() -> Unit)? = null,
): ModifiableGradleScriptDefinitionEntity =
GradleScriptDefinitionEntityType(definitionId, compilationConfiguration, hostConfiguration, entitySource, init)
@@ -0,0 +1,270 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.gradle.scripting.k2.workspaceModel.impl
import com.intellij.openapi.util.NlsSafe
import com.intellij.platform.workspace.storage.*
import com.intellij.platform.workspace.storage.impl.ModifiableWorkspaceEntityBase
import com.intellij.platform.workspace.storage.impl.WorkspaceEntityBase
import com.intellij.platform.workspace.storage.impl.WorkspaceEntityData
import com.intellij.platform.workspace.storage.instrumentation.EntityStorageInstrumentation
import com.intellij.platform.workspace.storage.instrumentation.EntityStorageInstrumentationApi
import com.intellij.platform.workspace.storage.metadata.model.EntityMetadata
import org.jetbrains.kotlin.gradle.scripting.k2.workspaceModel.GradleScriptDefinitionEntity
import org.jetbrains.kotlin.gradle.scripting.k2.workspaceModel.GradleScriptDefinitionEntityId
import org.jetbrains.kotlin.gradle.scripting.k2.workspaceModel.ModifiableGradleScriptDefinitionEntity
import org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptCompilationConfigurationEntity
import org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptEvaluationConfigurationEntity
import org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptingHostConfigurationEntity
@GeneratedCodeApiVersion(3)
@GeneratedCodeImplVersion(7)
@OptIn(WorkspaceEntityInternalApi::class)
internal class GradleScriptDefinitionEntityImpl(private val dataSource: GradleScriptDefinitionEntityData) : GradleScriptDefinitionEntity, WorkspaceEntityBase(
dataSource) {
private companion object {
private val connections = listOf<ConnectionId>(
)
}
override val symbolicId: GradleScriptDefinitionEntityId = super.symbolicId
override val definitionId: String
get() {
readField("definitionId")
return dataSource.definitionId
}
override val compilationConfiguration: ScriptCompilationConfigurationEntity
get() {
readField("compilationConfiguration")
return dataSource.compilationConfiguration
}
override val hostConfiguration: ScriptingHostConfigurationEntity
get() {
readField("hostConfiguration")
return dataSource.hostConfiguration
}
override val evaluationConfiguration: ScriptEvaluationConfigurationEntity?
get() {
readField("evaluationConfiguration")
return dataSource.evaluationConfiguration
}
override val entitySource: EntitySource
get() {
readField("entitySource")
return dataSource.entitySource
}
override fun connectionIdList(): List<ConnectionId> {
return connections
}
internal class Builder(result: GradleScriptDefinitionEntityData?) : ModifiableWorkspaceEntityBase<GradleScriptDefinitionEntity, GradleScriptDefinitionEntityData>(
result), ModifiableGradleScriptDefinitionEntity {
internal constructor() : this(GradleScriptDefinitionEntityData())
override fun applyToBuilder(builder: MutableEntityStorage) {
if (this.diff != null) {
if (existsInBuilder(builder)) {
this.diff = builder
return
}
else {
error("Entity GradleScriptDefinitionEntity is already created in a different builder")
}
}
this.diff = builder
addToBuilder()
this.id = getEntityData().createEntityId()
// After adding entity data to the builder, we need to unbind it and move the control over entity data to builder
// Builder may switch to snapshot at any moment and lock entity data to modification
this.currentEntityData = null
// Process linked entities that are connected without a builder
processLinkedEntities(builder)
checkInitialization() // TODO uncomment and check failed tests
}
private fun checkInitialization() {
val _diff = diff
if (!getEntityData().isEntitySourceInitialized()) {
error("Field WorkspaceEntity#entitySource should be initialized")
}
if (!getEntityData().isDefinitionIdInitialized()) {
error("Field GradleScriptDefinitionEntity#definitionId should be initialized")
}
if (!getEntityData().isCompilationConfigurationInitialized()) {
error("Field GradleScriptDefinitionEntity#compilationConfiguration should be initialized")
}
if (!getEntityData().isHostConfigurationInitialized()) {
error("Field GradleScriptDefinitionEntity#hostConfiguration should be initialized")
}
}
override fun connectionIdList(): List<ConnectionId> {
return connections
}
// Relabeling code, move information from dataSource to this builder
override fun relabel(dataSource: WorkspaceEntity, parents: Set<WorkspaceEntity>?) {
dataSource as GradleScriptDefinitionEntity
if (this.entitySource != dataSource.entitySource) this.entitySource = dataSource.entitySource
if (this.definitionId != dataSource.definitionId) this.definitionId = dataSource.definitionId
if (this.compilationConfiguration != dataSource.compilationConfiguration) this.compilationConfiguration = dataSource.compilationConfiguration
if (this.hostConfiguration != dataSource.hostConfiguration) this.hostConfiguration = dataSource.hostConfiguration
if (this.evaluationConfiguration != dataSource?.evaluationConfiguration) this.evaluationConfiguration = dataSource.evaluationConfiguration
updateChildToParentReferences(parents)
}
override var entitySource: EntitySource
get() = getEntityData().entitySource
set(value) {
checkModificationAllowed()
getEntityData(true).entitySource = value
changedProperty.add("entitySource")
}
override var definitionId: String
get() = getEntityData().definitionId
set(value) {
checkModificationAllowed()
getEntityData(true).definitionId = value
changedProperty.add("definitionId")
}
override var compilationConfiguration: ScriptCompilationConfigurationEntity
get() = getEntityData().compilationConfiguration
set(value) {
checkModificationAllowed()
getEntityData(true).compilationConfiguration = value
changedProperty.add("compilationConfiguration")
}
override var hostConfiguration: ScriptingHostConfigurationEntity
get() = getEntityData().hostConfiguration
set(value) {
checkModificationAllowed()
getEntityData(true).hostConfiguration = value
changedProperty.add("hostConfiguration")
}
override var evaluationConfiguration: ScriptEvaluationConfigurationEntity?
get() = getEntityData().evaluationConfiguration
set(value) {
checkModificationAllowed()
getEntityData(true).evaluationConfiguration = value
changedProperty.add("evaluationConfiguration")
}
override fun getEntityClass(): Class<GradleScriptDefinitionEntity> = GradleScriptDefinitionEntity::class.java
}
}
@OptIn(WorkspaceEntityInternalApi::class)
internal class GradleScriptDefinitionEntityData : WorkspaceEntityData<GradleScriptDefinitionEntity>() {
lateinit var definitionId: String
lateinit var compilationConfiguration: ScriptCompilationConfigurationEntity
lateinit var hostConfiguration: ScriptingHostConfigurationEntity
var evaluationConfiguration: ScriptEvaluationConfigurationEntity? = null
internal fun isDefinitionIdInitialized(): Boolean = ::definitionId.isInitialized
internal fun isCompilationConfigurationInitialized(): Boolean = ::compilationConfiguration.isInitialized
internal fun isHostConfigurationInitialized(): Boolean = ::hostConfiguration.isInitialized
override fun wrapAsModifiable(diff: MutableEntityStorage): ModifiableWorkspaceEntity<GradleScriptDefinitionEntity> {
val modifiable = GradleScriptDefinitionEntityImpl.Builder(null)
modifiable.diff = diff
modifiable.id = createEntityId()
return modifiable
}
@OptIn(EntityStorageInstrumentationApi::class)
override fun createEntity(snapshot: EntityStorageInstrumentation): GradleScriptDefinitionEntity {
val entityId = createEntityId()
return snapshot.initializeEntity(entityId) {
val entity = GradleScriptDefinitionEntityImpl(this)
entity.snapshot = snapshot
entity.id = entityId
entity
}
}
override fun getMetadata(): EntityMetadata {
return MetadataStorageImpl.getMetadataByTypeFqn(
"org.jetbrains.kotlin.gradle.scripting.k2.workspaceModel.GradleScriptDefinitionEntity") as EntityMetadata
}
override fun getEntityInterface(): Class<out WorkspaceEntity> {
return GradleScriptDefinitionEntity::class.java
}
override fun createDetachedEntity(parents: List<ModifiableWorkspaceEntity<*>>): ModifiableWorkspaceEntity<*> {
return GradleScriptDefinitionEntity(definitionId, compilationConfiguration, hostConfiguration, entitySource) {
this.evaluationConfiguration = this@GradleScriptDefinitionEntityData.evaluationConfiguration
}
}
override fun getRequiredParents(): List<Class<out WorkspaceEntity>> {
val res = mutableListOf<Class<out WorkspaceEntity>>()
return res
}
override fun equals(other: Any?): Boolean {
if (other == null) return false
if (this.javaClass != other.javaClass) return false
other as GradleScriptDefinitionEntityData
if (this.entitySource != other.entitySource) return false
if (this.definitionId != other.definitionId) return false
if (this.compilationConfiguration != other.compilationConfiguration) return false
if (this.hostConfiguration != other.hostConfiguration) return false
if (this.evaluationConfiguration != other.evaluationConfiguration) return false
return true
}
override fun equalsIgnoringEntitySource(other: Any?): Boolean {
if (other == null) return false
if (this.javaClass != other.javaClass) return false
other as GradleScriptDefinitionEntityData
if (this.definitionId != other.definitionId) return false
if (this.compilationConfiguration != other.compilationConfiguration) return false
if (this.hostConfiguration != other.hostConfiguration) return false
if (this.evaluationConfiguration != other.evaluationConfiguration) return false
return true
}
override fun hashCode(): Int {
var result = entitySource.hashCode()
result = 31 * result + definitionId.hashCode()
result = 31 * result + compilationConfiguration.hashCode()
result = 31 * result + hostConfiguration.hashCode()
result = 31 * result + evaluationConfiguration.hashCode()
return result
}
override fun hashCodeIgnoringEntitySource(): Int {
var result = javaClass.hashCode()
result = 31 * result + definitionId.hashCode()
result = 31 * result + compilationConfiguration.hashCode()
result = 31 * result + hostConfiguration.hashCode()
result = 31 * result + evaluationConfiguration.hashCode()
return result
}
}
@@ -0,0 +1,134 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.gradle.scripting.k2.workspaceModel.impl
import com.intellij.platform.workspace.storage.WorkspaceEntityInternalApi
import com.intellij.platform.workspace.storage.metadata.impl.MetadataStorageBase
import com.intellij.platform.workspace.storage.metadata.model.EntityMetadata
import com.intellij.platform.workspace.storage.metadata.model.FinalClassMetadata
import com.intellij.platform.workspace.storage.metadata.model.OwnPropertyMetadata
import com.intellij.platform.workspace.storage.metadata.model.StorageTypeMetadata
import com.intellij.platform.workspace.storage.metadata.model.ValueTypeMetadata
@OptIn(WorkspaceEntityInternalApi::class)
internal object MetadataStorageImpl : MetadataStorageBase() {
override fun initializeMetadata() {
val primitiveTypeStringNotNullable = ValueTypeMetadata.SimpleType.PrimitiveType(isNullable = false, type = "String")
var typeMetadata: StorageTypeMetadata
typeMetadata = FinalClassMetadata.ClassMetadata(
fqName = "org.jetbrains.kotlin.gradle.scripting.k2.workspaceModel.GradleScriptDefinitionEntityId", properties = listOf(
OwnPropertyMetadata(isComputable = false, isKey = false, isOpen = false, name = "id", valueType = primitiveTypeStringNotNullable,
withDefault = false),
OwnPropertyMetadata(isComputable = false, isKey = false, isOpen = false, name = "presentableName",
valueType = primitiveTypeStringNotNullable, withDefault = false)),
supertypes = listOf("com.intellij.platform.workspace.storage.SymbolicEntityId"))
addMetadata(typeMetadata)
typeMetadata = EntityMetadata(fqName = "org.jetbrains.kotlin.gradle.scripting.k2.workspaceModel.GradleScriptDefinitionEntity",
entityDataFqName = "org.jetbrains.kotlin.gradle.scripting.k2.workspaceModel.impl.GradleScriptDefinitionEntityData",
supertypes = listOf("com.intellij.platform.workspace.storage.WorkspaceEntity",
"com.intellij.platform.workspace.storage.WorkspaceEntityWithSymbolicId"),
properties = listOf(
OwnPropertyMetadata(isComputable = false, isKey = false, isOpen = false, name = "entitySource",
valueType = ValueTypeMetadata.SimpleType.CustomType(isNullable = false,
typeMetadata = FinalClassMetadata.KnownClass(
fqName = "com.intellij.platform.workspace.storage.EntitySource")),
withDefault = false),
OwnPropertyMetadata(isComputable = false, isKey = false, isOpen = false, name = "definitionId",
valueType = primitiveTypeStringNotNullable, withDefault = false),
OwnPropertyMetadata(isComputable = false, isKey = false, isOpen = false,
name = "compilationConfiguration",
valueType = ValueTypeMetadata.SimpleType.CustomType(isNullable = false,
typeMetadata = FinalClassMetadata.ClassMetadata(
fqName = "org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptCompilationConfigurationEntity",
properties = listOf(
OwnPropertyMetadata(
isComputable = false,
isKey = false,
isOpen = false,
name = "data",
valueType = ValueTypeMetadata.SimpleType.CustomType(
isNullable = false,
typeMetadata = FinalClassMetadata.KnownClass(
fqName = "kotlin.ByteArray")),
withDefault = false)),
supertypes = listOf())),
withDefault = false),
OwnPropertyMetadata(isComputable = false, isKey = false, isOpen = false, name = "hostConfiguration",
valueType = ValueTypeMetadata.SimpleType.CustomType(isNullable = false,
typeMetadata = FinalClassMetadata.ClassMetadata(
fqName = "org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptingHostConfigurationEntity",
properties = listOf(
OwnPropertyMetadata(
isComputable = false,
isKey = false,
isOpen = false,
name = "data",
valueType = ValueTypeMetadata.SimpleType.CustomType(
isNullable = false,
typeMetadata = FinalClassMetadata.KnownClass(
fqName = "kotlin.ByteArray")),
withDefault = false)),
supertypes = listOf())),
withDefault = false),
OwnPropertyMetadata(isComputable = false, isKey = false, isOpen = false,
name = "evaluationConfiguration",
valueType = ValueTypeMetadata.SimpleType.CustomType(isNullable = true,
typeMetadata = FinalClassMetadata.ClassMetadata(
fqName = "org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptEvaluationConfigurationEntity",
properties = listOf(
OwnPropertyMetadata(
isComputable = false,
isKey = false,
isOpen = false,
name = "data",
valueType = ValueTypeMetadata.SimpleType.CustomType(
isNullable = false,
typeMetadata = FinalClassMetadata.KnownClass(
fqName = "kotlin.ByteArray")),
withDefault = false)),
supertypes = listOf())),
withDefault = false),
OwnPropertyMetadata(isComputable = true, isKey = false, isOpen = false, name = "symbolicId",
valueType = ValueTypeMetadata.SimpleType.CustomType(isNullable = false,
typeMetadata = FinalClassMetadata.ClassMetadata(
fqName = "org.jetbrains.kotlin.gradle.scripting.k2.workspaceModel.GradleScriptDefinitionEntityId",
properties = listOf(
OwnPropertyMetadata(
isComputable = false,
isKey = false,
isOpen = false,
name = "id",
valueType = primitiveTypeStringNotNullable,
withDefault = false),
OwnPropertyMetadata(
isComputable = false,
isKey = false,
isOpen = false,
name = "presentableName",
valueType = primitiveTypeStringNotNullable,
withDefault = false)),
supertypes = listOf(
"com.intellij.platform.workspace.storage.SymbolicEntityId"))),
withDefault = false)), extProperties = listOf(), isAbstract = false)
addMetadata(typeMetadata)
}
override fun initializeMetadataHash() {
addMetadataHash(typeFqn = "org.jetbrains.kotlin.gradle.scripting.k2.workspaceModel.GradleScriptDefinitionEntity",
metadataHash = 603888767)
addMetadataHash(typeFqn = "org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptCompilationConfigurationEntity",
metadataHash = -1162660984)
addMetadataHash(typeFqn = "org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptingHostConfigurationEntity",
metadataHash = -441841951)
addMetadataHash(typeFqn = "org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptEvaluationConfigurationEntity",
metadataHash = -362496579)
addMetadataHash(typeFqn = "org.jetbrains.kotlin.gradle.scripting.k2.workspaceModel.GradleScriptDefinitionEntityId",
metadataHash = -1956757513)
addMetadataHash(typeFqn = "com.intellij.platform.workspace.storage.SymbolicEntityId", metadataHash = 1136338439)
}
}
@@ -23,6 +23,7 @@
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/resources-en" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/tests" isTestSource="true" />
<sourceFolder url="file://$MODULE_DIR$/gen" isTestSource="false" generated="true" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
@@ -81,5 +82,6 @@
<orderEntry type="module" module-name="intellij.java" />
<orderEntry type="module" module-name="intellij.platform.ide.impl" />
<orderEntry type="module" module-name="intellij.kotlin.gradle.tooling.impl" />
<orderEntry type="module" module-name="kotlin.highlighting.shared" />
</component>
</module>
@@ -38,7 +38,12 @@
</extensions>
<extensions defaultExtensionNs="org.jetbrains.kotlin">
<kotlinScripDeferredResolutionPolicy implementation="org.jetbrains.kotlin.gradle.scripting.k2.GradleScripDeferredResolvePolicy"/>
<scriptDefinitionsSource implementation="org.jetbrains.kotlin.gradle.scripting.k2.GradleScriptDefinitionsSource"/>
<scriptHighlightingExtension implementation="org.jetbrains.kotlin.gradle.scripting.k2.GradleScriptHighlightingExtension"/>
<scriptDefinitionsSource implementation="org.jetbrains.kotlin.gradle.scripting.k2.definition.GradleScriptDefinitionsSource"/>
</extensions>
<projectListeners>
<listener class="org.jetbrains.kotlin.gradle.scripting.k2.GradleKotlinScriptService$GradleWorkspaceModelListener"
topic="com.intellij.platform.backend.workspace.WorkspaceModelChangeListener"/>
</projectListeners>
</idea-plugin>
@@ -1,6 +1,7 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.gradle.scripting.k2
import com.intellij.openapi.application.readAction
import com.intellij.openapi.components.Service
import com.intellij.openapi.components.service
import com.intellij.openapi.externalSystem.service.execution.ExternalSystemJdkUtil
@@ -8,32 +9,46 @@ import com.intellij.openapi.options.advanced.AdvancedSettings
import com.intellij.openapi.project.Project
import com.intellij.openapi.projectRoots.Sdk
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.platform.backend.observation.launchTracked
import com.intellij.platform.backend.workspace.WorkspaceModelChangeListener
import com.intellij.platform.backend.workspace.toVirtualFileUrl
import com.intellij.platform.backend.workspace.virtualFile
import com.intellij.platform.backend.workspace.workspaceModel
import com.intellij.platform.workspace.jps.entities.InheritedSdkDependency
import com.intellij.platform.workspace.jps.entities.SdkDependency
import com.intellij.platform.workspace.jps.entities.SdkId
import com.intellij.platform.workspace.storage.EntityChange
import com.intellij.platform.workspace.storage.MutableEntityStorage
import com.intellij.platform.workspace.storage.VersionedStorageChange
import com.intellij.platform.workspace.storage.toBuilder
import com.intellij.platform.workspace.storage.url.VirtualFileUrl
import com.intellij.util.containers.addIfNotNull
import com.intellij.psi.PsiManager
import kotlinx.coroutines.CoroutineScope
import org.jetbrains.kotlin.gradle.scripting.shared.GradleScriptModel
import org.jetbrains.kotlin.gradle.scripting.shared.GradleScriptModelData
import org.jetbrains.kotlin.gradle.scripting.k2.definition.withIdeKeys
import org.jetbrains.kotlin.gradle.scripting.k2.importing.GradleScriptData
import org.jetbrains.kotlin.gradle.scripting.k2.importing.GradleScriptModel
import org.jetbrains.kotlin.gradle.scripting.k2.workspaceModel.GradleScriptDefinitionEntity
import org.jetbrains.kotlin.gradle.scripting.k2.workspaceModel.asEntity
import org.jetbrains.kotlin.gradle.scripting.k2.workspaceModel.deserialize
import org.jetbrains.kotlin.gradle.scripting.shared.KotlinGradleScriptEntitySource
import org.jetbrains.kotlin.gradle.scripting.shared.definition.GradleScriptDefinition
import org.jetbrains.kotlin.gradle.scripting.shared.loadGradleDefinitions
import org.jetbrains.kotlin.idea.core.script.k2.configurations.ScriptConfigurationWithSdk
import org.jetbrains.kotlin.idea.core.script.k2.configurations.toVirtualFileUrl
import org.jetbrains.kotlin.idea.core.script.k2.definitions.ScriptDefinitionsModificationTracker
import org.jetbrains.kotlin.idea.core.script.k2.highlighting.DefaultScriptResolutionStrategy
import org.jetbrains.kotlin.idea.core.script.k2.modules.*
import org.jetbrains.kotlin.idea.core.script.v1.indexSourceRootsEagerly
import org.jetbrains.kotlin.idea.core.script.v1.scriptingDebugLog
import org.jetbrains.kotlin.idea.core.script.v1.scriptingWarnLog
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition
import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrapper
import org.jetbrains.kotlin.scripting.resolve.VirtualFileScriptSource
import org.jetbrains.kotlin.scripting.resolve.adjustByDefinition
import org.jetbrains.kotlin.scripting.resolve.refineScriptCompilationConfiguration
import org.jetbrains.kotlin.utils.addIfNotNull
import java.io.File
import java.util.concurrent.atomic.AtomicReference
import java.util.concurrent.ConcurrentHashMap
import java.util.function.Predicate
import kotlin.script.experimental.api.*
import kotlin.script.experimental.jvm.JvmDependency
@@ -41,22 +56,48 @@ import kotlin.script.experimental.jvm.jdkHome
import kotlin.script.experimental.jvm.jvm
@Service(Service.Level.PROJECT)
class GradleScriptRefinedConfigurationProvider(
val project: Project, val coroutineScope: CoroutineScope
) : ScriptRefinedConfigurationResolver, ScriptWorkspaceModelManager {
private val data = AtomicReference<Map<VirtualFile, ScriptConfigurationWithSdk>>(emptyMap())
class GradleKotlinScriptService(val project: Project) : ScriptRefinedConfigurationResolver, ScriptWorkspaceModelManager {
private val data = ConcurrentHashMap<VirtualFileUrl, ScriptConfigurationWithSdk>()
override suspend fun create(virtualFile: VirtualFile, definition: ScriptDefinition): ScriptConfigurationWithSdk? = null
override fun get(virtualFile: VirtualFile): ScriptConfigurationWithSdk? = data.get()[virtualFile]
override fun get(virtualFile: VirtualFile): ScriptConfigurationWithSdk? {
val url = virtualFile.toVirtualFileUrl(project.workspaceModel.getVirtualFileUrlManager())
val result = data.computeIfAbsent(url) { url ->
val entity = project.workspaceModel.currentSnapshot.getVirtualFileUrlIndex().findEntitiesByUrl(url)
.firstOrNull {
it.entitySource is KotlinGradleScriptEntitySource && it is KotlinScriptEntity
} as? KotlinScriptEntity
suspend fun processScripts(scriptsData: GradleScriptModelData, storageToUpdate: MutableEntityStorage? = null) {
val sdk = scriptsData.javaHome.resolveSdk()
entity?.toConfigurationWithSdk() ?: ScriptConfigurationWithSdk.EMPTY
}
return if (result == ScriptConfigurationWithSdk.EMPTY) null else result
}
fun processScripts(
scriptData: GradleScriptData,
storageToUpdate: MutableEntityStorage
) {
val updatedStorage = MutableEntityStorage.create()
val definitions = loadGradleDefinitions(scriptData.definitionsParams).map { it.withIdeKeys(project) }
updatedStorage.enrichWithDefinitions(definitions)
updatedStorage.enrichWithConfigurations(scriptData, definitions)
storageToUpdate.applyChangesFrom(updatedStorage)
}
private fun MutableEntityStorage.enrichWithConfigurations(
scriptsData: GradleScriptData,
definitions: List<GradleScriptDefinition>
) {
val sdk = scriptsData.definitionsParams.javaHome.resolveSdk()
val javaHomePath = sdk?.homePath?.let { File(it) }
val configurations = scriptsData.models.associate { gradleScript: GradleScriptModel ->
val sourceCode = VirtualFileScriptSource(gradleScript.virtualFile)
val definition = findScriptDefinition(project, sourceCode)
val definition = definitions.firstOrNull { it.isScript(sourceCode) } ?: findScriptDefinition(project, sourceCode)
val configuration = definition.compilationConfiguration.with {
if (javaHomePath != null) {
@@ -69,22 +110,10 @@ class GradleScriptRefinedConfigurationProvider(
val updatedConfiguration = refineScriptCompilationConfiguration(sourceCode, definition, project, configuration)
gradleScript.virtualFile to ScriptConfigurationWithSdk(updatedConfiguration, sdk)
gradleScript.virtualFile to ScriptConfigurationWithSdk(updatedConfiguration, sdk?.let { SdkId(it.name, it.sdkType.name) })
}
val updatedStorage = MutableEntityStorage.create().apply {
enrichStorage(configurations)
}
if (storageToUpdate == null) {
project.workspaceModel.update("updating .gradle.kts scripts") { storage ->
storage.replaceBySource({ it is KotlinGradleScriptEntitySource }, updatedStorage)
}
} else {
storageToUpdate.replaceBySource({ it is KotlinGradleScriptEntitySource }, updatedStorage)
}
data.set(configurations)
enrichStorage(configurations)
}
private fun String?.resolveSdk(): Sdk? {
@@ -158,9 +187,15 @@ class GradleScriptRefinedConfigurationProvider(
}
}
val sdk = configurationWithSdk.sdk?.let { SdkDependency(SdkId(it.name, it.sdkType.name)) } ?: InheritedSdkDependency
this addEntity KotlinScriptEntity(scriptUrl, dependencies, sdk, KotlinGradleScriptEntitySource)
this addEntity KotlinScriptEntity(
scriptUrl,
dependencies,
KotlinGradleScriptEntitySource
) {
this.configuration = configuration.configuration?.asEntity()
this.reports = configurationWithSdk.scriptConfiguration.reports.map { it.toData() }.toMutableList()
this.sdkId = configurationWithSdk.sdkId
}
}
}
@@ -277,8 +312,76 @@ class GradleScriptRefinedConfigurationProvider(
return removed
}
private fun MutableEntityStorage.enrichWithDefinitions(definitions: List<GradleScriptDefinition>) {
definitions.forEach {
this addEntity GradleScriptDefinitionEntity(
it.definitionId,
it.compilationConfiguration.asEntity(),
it.hostConfiguration.asEntity(),
KotlinGradleScriptEntitySource
) {
evaluationConfiguration = it.evaluationConfiguration?.asEntity()
}
}
}
@Suppress("unused")
private class GradleWorkspaceModelListener(val project: Project, val scope: CoroutineScope) : WorkspaceModelChangeListener {
override fun changed(event: VersionedStorageChange) = scope.launchTracked {
if (event.getChanges(GradleScriptDefinitionEntity::class.java).any()) {
ScriptDefinitionsModificationTracker.getInstance(project).incModificationCount()
}
val updatedData = mutableMapOf<VirtualFileUrl, ScriptConfigurationWithSdk>()
for (entityChange in event.getChanges(KotlinScriptEntity::class.java)) {
if (entityChange is EntityChange.Removed) continue
val entity = entityChange.newEntity ?: continue
if (entity.entitySource !is KotlinGradleScriptEntitySource) continue
val result = entity.toConfigurationWithSdk()
if (result != null) {
updatedData[entity.virtualFileUrl] = result
}
}
if (updatedData.any()) {
val ktFiles = buildSet {
for (url in updatedData.keys) {
val virtualFile = url.virtualFile ?: continue
val ktFile = readAction { PsiManager.getInstance(project).findFile(virtualFile) } as? KtFile
addIfNotNull(ktFile)
}
}
getInstance(project).data.clear()
if (ktFiles.any()) {
DefaultScriptResolutionStrategy.getInstance(project).restartHighlighting(ktFiles)
}
}
}
}
companion object {
@JvmStatic
fun getInstance(project: Project): GradleScriptRefinedConfigurationProvider = project.service()
fun getInstance(project: Project): GradleKotlinScriptService = project.service()
}
}
}
fun KotlinScriptEntity.toConfigurationWithSdk(): ScriptConfigurationWithSdk? {
val virtualFile = virtualFileUrl.virtualFile ?: return null
val result = if (configuration == null) {
ResultWithDiagnostics.Failure(listOf())
} else {
ResultWithDiagnostics.Success<ScriptCompilationConfigurationWrapper>(
ScriptCompilationConfigurationWrapper.FromCompilationConfiguration(
VirtualFileScriptSource(virtualFile),
configuration?.deserialize()
), reports.map { report -> report.toScriptDiagnostic() }
)
}
return ScriptConfigurationWithSdk(result, sdkId)
}
@@ -1,111 +0,0 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.gradle.scripting.k2
import com.intellij.openapi.components.*
import com.intellij.openapi.project.Project
import com.intellij.util.xmlb.annotations.Attribute
import org.jetbrains.kotlin.gradle.scripting.shared.GradleDefinitionsParams
import org.jetbrains.kotlin.gradle.scripting.shared.loadGradleDefinitions
import org.jetbrains.kotlin.idea.core.script.k2.configurations.configurationResolverDelegate
import org.jetbrains.kotlin.idea.core.script.k2.configurations.scriptWorkspaceModelManagerDelegate
import org.jetbrains.kotlin.idea.core.script.k2.definitions.ScriptDefinitionsModificationTracker
import org.jetbrains.kotlin.idea.core.script.v1.NewScriptFileInfo
import org.jetbrains.kotlin.idea.core.script.v1.kotlinScriptTemplateInfo
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsSource
import java.util.concurrent.atomic.AtomicReference
import kotlin.script.experimental.api.ide
class GradleScriptDefinitionsSource(val project: Project) : ScriptDefinitionsSource {
override val definitions: Sequence<ScriptDefinition>
get() = GradleScriptDefinitionsStorage.getInstance(project).getDefinitions()
}
@Service(Service.Level.PROJECT)
@State(name = "GradleScriptDefinitionsStorage", storages = [Storage(StoragePathMacros.WORKSPACE_FILE)])
class GradleScriptDefinitionsStorage(val project: Project) :
SerializablePersistentStateComponent<GradleScriptDefinitionsStorage.State>(State()) {
private val _definitions: AtomicReference<List<ScriptDefinition>> = AtomicReference(listOf())
private val initialized = AtomicReference(false)
fun getDefinitions(): Sequence<ScriptDefinition> {
initializeIfNeeded()
return _definitions.get()?.asSequence() ?: emptySequence()
}
private fun initializeIfNeeded() {
if (initialized.get()) return
synchronized(this) {
if (initialized.get()) return
val params = state.toParams()
if (params != null) {
loadDefinitions(params)
}
initialized.set(true)
}
}
fun loadDefinitions(params: GradleDefinitionsParams) {
val definitions = loadGradleDefinitions(params).map {
it.with {
ide {
kotlinScriptTemplateInfo(NewScriptFileInfo().apply {
id = "gradle-kts"
title = ".gradle.kts"
templateName = "Kotlin Script Gradle"
})
configurationResolverDelegate {
GradleScriptRefinedConfigurationProvider.getInstance(project)
}
scriptWorkspaceModelManagerDelegate {
GradleScriptRefinedConfigurationProvider.getInstance(project)
}
}
}
}
_definitions.set(definitions)
initialized.set(true)
updateState {
it.copyFrom(params)
}
ScriptDefinitionsModificationTracker.getInstance(project).incModificationCount()
}
data class State(
@Attribute @JvmField val workingDir: String? = null,
@Attribute @JvmField val gradleHome: String? = null,
@Attribute @JvmField val javaHome: String? = null,
@Attribute @JvmField val gradleVersion: String? = null,
@JvmField val jvmArguments: List<String> = emptyList(),
@JvmField val environment: Map<String, String> = emptyMap(),
) {
fun copyFrom(params: GradleDefinitionsParams): State {
return copy(
workingDir = params.workingDir,
gradleHome = params.gradleHome,
javaHome = params.javaHome,
gradleVersion = params.gradleVersion,
jvmArguments = params.jvmArguments,
environment = params.environment
)
}
fun toParams(): GradleDefinitionsParams? {
return GradleDefinitionsParams(
workingDir ?: return null,
gradleHome ?: return null,
javaHome ?: return null,
gradleVersion ?: return null,
jvmArguments,
environment
)
}
}
companion object {
fun getInstance(project: Project): GradleScriptDefinitionsStorage = project.service<GradleScriptDefinitionsStorage>()
}
}
@@ -2,18 +2,19 @@
package org.jetbrains.kotlin.gradle.scripting.k2
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFile
import org.jetbrains.kotlin.idea.core.script.k2.highlighting.KotlinScripDeferredResolutionPolicy
import org.jetbrains.kotlin.gradle.scripting.k2.definition.GradleScriptDefinitionsSource
import org.jetbrains.kotlin.idea.base.highlighting.KotlinScriptHighlightingExtension
import org.jetbrains.kotlin.idea.core.script.shared.scriptDefinitionsSourceOfType
import org.jetbrains.kotlin.idea.util.application.isUnitTestMode
import org.jetbrains.kotlin.psi.KtFile
private const val GRADLE_KTS = ".gradle.kts"
class GradleScripDeferredResolvePolicy(val project: Project) : KotlinScripDeferredResolutionPolicy {
override fun shouldDeferResolution(script: VirtualFile): Boolean {
if (!script.name.endsWith(GRADLE_KTS) || isUnitTestMode()) return false
class GradleScriptHighlightingExtension(val project: Project) : KotlinScriptHighlightingExtension {
override fun shouldHighlightScript(file: KtFile): Boolean {
if (!file.name.endsWith(GRADLE_KTS) || isUnitTestMode()) return true
// gradle definitions are empty so project import wasn't finished yet
return project.scriptDefinitionsSourceOfType<GradleScriptDefinitionsSource>()?.definitions.orEmpty().none()
return project.scriptDefinitionsSourceOfType<GradleScriptDefinitionsSource>()?.definitions.orEmpty().any()
}
}
@@ -23,13 +23,11 @@ import org.jetbrains.kotlin.gradle.scripting.shared.roots.GradleBuildRootsLocato
import org.jetbrains.kotlin.gradle.scripting.shared.roots.Imported
import org.jetbrains.kotlin.gradle.scripting.shared.runPartialGradleImport
import org.jetbrains.kotlin.idea.core.script.shared.KotlinBaseScriptingBundle
import org.jetbrains.kotlin.idea.core.script.k2.configurations.ScriptConfigurationsProviderImpl
import org.jetbrains.kotlin.idea.util.isKotlinFileType
import org.jetbrains.plugins.gradle.util.GradleConstants
import java.io.File
import java.util.function.Function
import javax.swing.JComponent
import kotlin.script.experimental.api.valueOrNull
//TODO: KTIJ-30408
internal class GradleScriptNotificationProvider : EditorNotificationProvider {
@@ -160,7 +158,7 @@ internal class GradleScriptNotificationProvider : EditorNotificationProvider {
}
private fun isImported(virtualFile: VirtualFile, project: Project): Boolean =
GradleScriptRefinedConfigurationProvider.getInstance(project).get(virtualFile) != null
GradleKotlinScriptService.getInstance(project).get(virtualFile) != null
private fun linkProject(
project: Project,
@@ -2,22 +2,13 @@
package org.jetbrains.kotlin.gradle.scripting.k2
import com.intellij.openapi.application.edtWriteAction
import com.intellij.openapi.application.readAction
import com.intellij.openapi.externalSystem.service.project.manage.ExternalProjectsManagerImpl
import com.intellij.openapi.project.Project
import com.intellij.openapi.vfs.VirtualFileManager
import com.intellij.platform.backend.observation.launchTracked
import com.intellij.psi.PsiManager
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.suspendCancellableCoroutine
import org.jetbrains.kotlin.gradle.scripting.shared.GradleScriptModel
import org.jetbrains.kotlin.gradle.scripting.shared.GradleScriptModelData
import org.jetbrains.kotlin.gradle.scripting.shared.getGradleVersion
import org.jetbrains.kotlin.gradle.scripting.shared.roots.GradleBuildRootData
import org.jetbrains.kotlin.gradle.scripting.shared.roots.GradleBuildRootsLocator
import org.jetbrains.kotlin.gradle.scripting.shared.roots.Imported
import org.jetbrains.kotlin.idea.core.script.k2.highlighting.DefaultScriptResolutionStrategy
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.plugins.gradle.service.GradleInstallationManager
import org.jetbrains.plugins.gradle.settings.DistributionType
import org.jetbrains.plugins.gradle.settings.GradleProjectSettings
@@ -49,12 +40,9 @@ class ProjectGradleSettingsListener(
awaitExternalSystemInitialization()
settings.forEach {
val gradleVersion = getGradleVersion(project, it)
val newRoot = edtWriteAction {
edtWriteAction {
buildRootsManager.loadLinkedRoot(it, gradleVersion)
}
if (newRoot is Imported) {
loadScriptConfigurations(newRoot.data)
}
}
}
}
@@ -86,26 +74,4 @@ class ProjectGradleSettingsListener(
val buildRootsManager = GradleBuildRootsLocator.getInstance(project)
buildRootsManager.reloadBuildRoot(linkedProjectPath, null)
}
private suspend fun loadScriptConfigurations(data: GradleBuildRootData) {
if (data.models.isEmpty()) return
val scripts = data.models.mapNotNullTo(mutableSetOf()) {
val virtualFile = VirtualFileManager.getInstance().findFileByNioPath(Path.of(it.file)) ?: return@mapNotNullTo null
GradleScriptModel(
virtualFile,
it.classPath,
it.sourcePath,
it.imports,
)
}
GradleScriptRefinedConfigurationProvider.getInstance(project).processScripts(GradleScriptModelData(scripts, data.javaHome))
val ktFiles = scripts.mapNotNull {
readAction { PsiManager.getInstance(project).findFile(it.virtualFile) as? KtFile }
}.toTypedArray()
DefaultScriptResolutionStrategy.getInstance(project).execute(*ktFiles).join()
}
}
@@ -0,0 +1,28 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.gradle.scripting.k2.definition
import com.intellij.openapi.project.Project
import com.intellij.platform.backend.workspace.workspaceModel
import org.jetbrains.kotlin.gradle.scripting.k2.workspaceModel.GradleScriptDefinitionEntity
import org.jetbrains.kotlin.gradle.scripting.k2.workspaceModel.deserialize
import org.jetbrains.kotlin.gradle.scripting.shared.definition.ErrorGradleScriptDefinition
import org.jetbrains.kotlin.gradle.scripting.shared.definition.GradleScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinition
import org.jetbrains.kotlin.scripting.definitions.ScriptDefinitionsSource
class GradleScriptDefinitionsSource(val project: Project) : ScriptDefinitionsSource {
override val definitions: Sequence<ScriptDefinition>
get() = project.workspaceModel.currentSnapshot.entities(GradleScriptDefinitionEntity::class.java).map {
val compilationConfiguration = it.compilationConfiguration.deserialize()
val hostConfiguration = it.hostConfiguration.deserialize()
if (compilationConfiguration == null || hostConfiguration == null) {
ErrorGradleScriptDefinition()
} else {
GradleScriptDefinition(
compilationConfiguration,
hostConfiguration,
it.evaluationConfiguration?.deserialize(),
).withIdeKeys(project)
}
}
}
@@ -0,0 +1,28 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.gradle.scripting.k2.definition
import com.intellij.openapi.project.Project
import org.jetbrains.kotlin.gradle.scripting.k2.GradleKotlinScriptService
import org.jetbrains.kotlin.gradle.scripting.shared.definition.GradleScriptDefinition
import org.jetbrains.kotlin.idea.core.script.k2.configurations.configurationResolverDelegate
import org.jetbrains.kotlin.idea.core.script.k2.configurations.scriptWorkspaceModelManagerDelegate
import org.jetbrains.kotlin.idea.core.script.v1.NewScriptFileInfo
import org.jetbrains.kotlin.idea.core.script.v1.kotlinScriptTemplateInfo
import kotlin.script.experimental.api.ide
fun GradleScriptDefinition.withIdeKeys(project: Project): GradleScriptDefinition = with {
ide {
kotlinScriptTemplateInfo(NewScriptFileInfo().apply {
id = "gradle-kts"
title = ".gradle.kts"
templateName = "Kotlin Script Gradle"
})
configurationResolverDelegate {
GradleKotlinScriptService.getInstance(project)
}
scriptWorkspaceModelManagerDelegate {
GradleKotlinScriptService.getInstance(project)
}
}
}
@@ -1,24 +1,18 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.gradle.scripting.k2.importing
import com.intellij.openapi.application.readAction
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.openapi.vfs.VirtualFileManager
import com.intellij.platform.workspace.storage.ImmutableEntityStorage
import com.intellij.platform.workspace.storage.MutableEntityStorage
import com.intellij.platform.workspace.storage.toBuilder
import com.intellij.psi.PsiManager
import org.jetbrains.kotlin.gradle.scripting.k2.GradleScriptDefinitionsStorage
import org.jetbrains.kotlin.gradle.scripting.k2.GradleScriptRefinedConfigurationProvider
import org.jetbrains.kotlin.gradle.scripting.k2.GradleKotlinScriptService
import org.jetbrains.kotlin.gradle.scripting.shared.GradleDefinitionsParams
import org.jetbrains.kotlin.gradle.scripting.shared.GradleScriptModel
import org.jetbrains.kotlin.gradle.scripting.shared.GradleScriptModelData
import org.jetbrains.kotlin.gradle.scripting.shared.KotlinGradleScriptEntitySource
import org.jetbrains.kotlin.gradle.scripting.shared.importing.collectErrors
import org.jetbrains.kotlin.gradle.scripting.shared.importing.getKotlinDslScripts
import org.jetbrains.kotlin.gradle.scripting.shared.importing.kotlinDslSyncListenerInstance
import org.jetbrains.kotlin.gradle.scripting.shared.importing.saveGradleBuildEnvironment
import org.jetbrains.kotlin.idea.core.script.k2.highlighting.DefaultScriptResolutionStrategy
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.plugins.gradle.model.GradleBuildScriptClasspathModel
import org.jetbrains.plugins.gradle.service.project.ProjectResolverContext
import org.jetbrains.plugins.gradle.service.syncAction.GradleSyncContributor
@@ -68,20 +62,11 @@ internal class KotlinDslScriptSyncContributor : GradleSyncContributor {
val gradleHome = context.allBuilds.asSequence().flatMap { it.projects.asSequence() }
.mapNotNull { context.getProjectModel(it, GradleBuildScriptClasspathModel::class.java) }
.mapNotNull { it.gradleHomeDir?.absolutePath }.firstOrNull() ?: context.settings.gradleHome ?: return storage
.firstNotNullOfOrNull { it.gradleHomeDir?.absolutePath } ?: context.settings.gradleHome ?: return storage
val javaHome = context.buildEnvironment.java.javaHome.absolutePath
GradleScriptDefinitionsStorage.getInstance(project).loadDefinitions(
params = GradleDefinitionsParams(
context.projectPath,
gradleHome,
javaHome,
context.buildEnvironment.gradle.gradleVersion,
context.settings.jvmArguments,
context.settings.env
)
)
val builder = storage.toBuilder()
val gradleScripts = models.mapNotNullTo(mutableSetOf()) {
val virtualFile = VirtualFileManager.getInstance().findFileByNioPath(Path.of(it.file)) ?: return@mapNotNullTo null
@@ -93,17 +78,32 @@ internal class KotlinDslScriptSyncContributor : GradleSyncContributor {
)
}
val builder = storage.toBuilder()
val scriptData = GradleScriptData(
gradleScripts,
GradleDefinitionsParams(
context.projectPath,
gradleHome,
javaHome,
context.buildEnvironment.gradle.gradleVersion,
context.settings.jvmArguments,
context.settings.env
)
)
GradleScriptRefinedConfigurationProvider.getInstance(project)
.processScripts(GradleScriptModelData(gradleScripts, javaHome), builder)
val ktFiles = gradleScripts.mapNotNull {
readAction { PsiManager.getInstance(project).findFile(it.virtualFile) as? KtFile }
}.toTypedArray()
DefaultScriptResolutionStrategy.getInstance(project).execute(*ktFiles).join()
GradleKotlinScriptService.getInstance(project).processScripts(scriptData, builder)
return builder.toSnapshot()
}
}
}
class GradleScriptData(
val models: Collection<GradleScriptModel>,
val definitionsParams: GradleDefinitionsParams
)
class GradleScriptModel(
val virtualFile: VirtualFile,
val classPath: List<String>,
val sourcePath: List<String>,
val imports: List<String>,
)
@@ -0,0 +1,22 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.gradle.scripting.k2.workspaceModel
import com.intellij.openapi.util.NlsSafe
import com.intellij.platform.workspace.storage.*
import org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptCompilationConfigurationEntity
import org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptEvaluationConfigurationEntity
import org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptingHostConfigurationEntity
data class GradleScriptDefinitionEntityId(val id: String) : SymbolicEntityId<GradleScriptDefinitionEntity> {
override val presentableName: @NlsSafe String = id
}
interface GradleScriptDefinitionEntity : WorkspaceEntityWithSymbolicId {
val definitionId: String
val compilationConfiguration: ScriptCompilationConfigurationEntity
val hostConfiguration: ScriptingHostConfigurationEntity
val evaluationConfiguration: ScriptEvaluationConfigurationEntity?
override val symbolicId: GradleScriptDefinitionEntityId
get() = GradleScriptDefinitionEntityId(definitionId)
}
@@ -0,0 +1,72 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.gradle.scripting.k2.workspaceModel
import org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptCompilationConfigurationEntity
import org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptEvaluationConfigurationEntity
import org.jetbrains.kotlin.idea.core.script.k2.modules.ScriptingHostConfigurationEntity
import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream
import java.io.ObjectInputStream
import java.io.ObjectOutputStream
import kotlin.script.experimental.api.ScriptCompilationConfiguration
import kotlin.script.experimental.api.ScriptEvaluationConfiguration
import kotlin.script.experimental.host.ScriptingHostConfiguration
import kotlin.script.experimental.util.PropertiesCollection
import kotlin.script.experimental.util.PropertiesCollection.Key
private fun PropertiesCollection.serialize(): ByteArray = ByteArrayOutputStream().use { bos ->
ObjectOutputStream(bos).use { oos ->
oos.writeObject(notTransientData)
}
bos.toByteArray()
}
fun ScriptEvaluationConfiguration.asEntity() = ScriptEvaluationConfigurationEntity(this.serialize())
fun ScriptEvaluationConfigurationEntity.deserialize(): ScriptEvaluationConfiguration? {
val params = ByteArrayInputStream(data).use { bis ->
ObjectInputStream(bis).use { ois ->
ois.readObject() as? LinkedHashMap<Key<Any>, Any?>
}
} ?: return null
return ScriptEvaluationConfiguration {
params.forEach { (key, any) ->
key.putIfNotNull(any)
}
}
}
fun ScriptCompilationConfiguration.asEntity(): ScriptCompilationConfigurationEntity = ScriptCompilationConfigurationEntity(this.serialize())
fun ScriptCompilationConfigurationEntity.deserialize(): ScriptCompilationConfiguration? {
val params = ByteArrayInputStream(data).use { bis ->
ObjectInputStream(bis).use { ois ->
ois.readObject() as? LinkedHashMap<Key<Any>, Any?>
}
} ?: return null
return ScriptCompilationConfiguration {
params.forEach { (key, any) ->
key.putIfNotNull(any)
}
}
}
fun ScriptingHostConfiguration.asEntity() = ScriptingHostConfigurationEntity(this.serialize())
fun ScriptingHostConfigurationEntity.deserialize(): ScriptingHostConfiguration? {
val params = ByteArrayInputStream(data).use { bis ->
ObjectInputStream(bis).use { ois ->
ois.readObject() as? LinkedHashMap<Key<Any>, Any?>
}
} ?: return null
return ScriptingHostConfiguration {
params.forEach { (key, any) ->
key.putIfNotNull(any)
}
}
}
@@ -0,0 +1,95 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.gradle.scripting.k2.projectStructure
import com.intellij.platform.backend.workspace.workspaceModel
import com.intellij.platform.testFramework.assertion.collectionAssertion.CollectionAssertions.assertEqualsUnordered
import com.intellij.platform.workspace.storage.impl.url.toVirtualFileUrl
import org.gradle.util.GradleVersion
import org.jetbrains.kotlin.gradle.scripting.k2.workspaceModel.GradleScriptDefinitionEntity
import org.jetbrains.kotlin.idea.core.script.k2.modules.KotlinScriptEntity
import org.jetbrains.kotlin.idea.test.AssertKotlinPluginMode
import org.jetbrains.kotlin.idea.test.UseK2PluginMode
import org.jetbrains.kotlin.idea.testFramework.gradle.KotlinGradleProjectTestCase
import org.jetbrains.plugins.gradle.testFramework.annotations.AllGradleVersionsSource
import org.jetbrains.plugins.gradle.testFramework.fixtures.application.GradleProjectTestApplication
import org.jetbrains.plugins.gradle.testFramework.util.assumeThatGradleIsAtLeast
import org.jetbrains.plugins.gradle.testFramework.util.assumeThatGradleIsOlderThan
import org.jetbrains.plugins.gradle.testFramework.util.assumeThatKotlinIsSupported
import org.junit.jupiter.params.ParameterizedTest
import kotlin.io.path.Path
@UseK2PluginMode
@GradleProjectTestApplication
@AssertKotlinPluginMode
class KotlinGradleWorkspaceModelTest : KotlinGradleProjectTestCase() {
private val currentSnapshot
get() = gradleFixture.project.workspaceModel.currentSnapshot
private val virtualFileUrlManager
get() = gradleFixture.project.workspaceModel.getVirtualFileUrlManager()
@ParameterizedTest
@AllGradleVersionsSource
fun `wsm should contain script definition entities after gradle sync`(gradleVersion: GradleVersion) {
assumeThatGradleIsAtLeast(gradleVersion, "6.0") {
"Script definitions were introduced in Gradle 6.0"
}
test(gradleVersion, KOTLIN_PROJECT) {
assertEqualsUnordered(
listOf(
"org.gradle.kotlin.dsl.KotlinSettingsScript",
"org.gradle.kotlin.dsl.KotlinBuildScript",
"org.gradle.kotlin.dsl.KotlinInitScript"
), currentSnapshot.entities(GradleScriptDefinitionEntity::class.java).map { it.definitionId }.toList()
)
}
}
@ParameterizedTest
@AllGradleVersionsSource
fun `wsm should contain script entities after gradle sync`(gradleVersion: GradleVersion) {
assumeThatGradleIsAtLeast(gradleVersion, "6.0") {
"Script definitions were introduced in Gradle 6.0"
}
test(gradleVersion, KOTLIN_PROJECT) {
val projectPath = gradleFixture.project.basePath!!
val expected = listOf("build.gradle.kts", "settings.gradle.kts").mapNotNull {
Path(projectPath).resolve(it)
}.map { it.toVirtualFileUrl(virtualFileUrlManager) }
assertEqualsUnordered(
expected, currentSnapshot.entities(KotlinScriptEntity::class.java).map { it.virtualFileUrl }.toList()
)
}
}
@ParameterizedTest
@AllGradleVersionsSource
fun `wsm should not contain script definition entities after gradle sync`(gradleVersion: GradleVersion) {
assumeThatKotlinIsSupported(gradleVersion)
assumeThatGradleIsOlderThan(gradleVersion, "6.0") {
"Script definitions were introduced in Gradle 6.0"
}
test(gradleVersion, KOTLIN_PROJECT) {
assert(currentSnapshot.entities(GradleScriptDefinitionEntity::class.java).none())
}
}
@ParameterizedTest
@AllGradleVersionsSource
fun `wsm should contain new script definition entities after gradle sync`(gradleVersion: GradleVersion) {
assumeThatGradleIsAtLeast(gradleVersion, "9.1.0") {
"Script definitions classes were changed in Gradle 9.1.0"
}
test(gradleVersion, KOTLIN_PROJECT) {
assertEqualsUnordered(
listOf(
"org.gradle.kotlin.dsl.KotlinGradleScriptTemplate",
"org.gradle.kotlin.dsl.KotlinProjectScriptTemplate",
"org.gradle.kotlin.dsl.KotlinSettingsScriptTemplate"
), currentSnapshot.entities(GradleScriptDefinitionEntity::class.java).map { it.definitionId }.toList()
)
}
}
}
@@ -0,0 +1,9 @@
// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package org.jetbrains.kotlin.gradle.scripting.shared.definition.workspace.impl
import com.intellij.platform.workspace.storage.WorkspaceEntityInternalApi
import com.intellij.platform.workspace.storage.metadata.MetadataStorageBridge
import org.jetbrains.kotlin.gradle.scripting.shared.impl.MetadataStorageImpl
@OptIn(WorkspaceEntityInternalApi::class)
internal object MetadataStorageImpl: MetadataStorageBridge(MetadataStorageImpl)
@@ -12,8 +12,6 @@ import kotlin.script.experimental.host.ScriptingHostConfiguration
import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
import kotlin.script.templates.standard.ScriptTemplateWithArgs
const val DEFINITION_ID: String = "ideGradleScriptDefinitionId"
open class GradleScriptDefinition(
compilationConfiguration: ScriptCompilationConfiguration,
override val hostConfiguration: ScriptingHostConfiguration,
@@ -26,9 +24,6 @@ open class GradleScriptDefinition(
order = Int.MIN_VALUE
}
override val definitionId: String
get() = DEFINITION_ID
override val canDefinitionBeSwitchedOff: Boolean = false
override val compilationConfiguration: ScriptCompilationConfiguration by lazy {
@@ -3,7 +3,6 @@ package org.jetbrains.kotlin.gradle.scripting.shared
import KotlinGradleScriptingBundle
import com.intellij.gradle.toolingExtension.util.GradleVersionUtil.isGradleAtLeast
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.platform.workspace.storage.EntitySource
import org.jetbrains.kotlin.config.LanguageVersion
import org.jetbrains.kotlin.gradle.scripting.shared.definition.ErrorGradleScriptDefinition
@@ -19,7 +18,7 @@ import java.nio.file.DirectoryStream
import java.nio.file.Files
import java.nio.file.Path
import kotlin.io.path.*
import kotlin.script.experimental.api.*
import kotlin.script.experimental.api.ScriptCompilationConfigurationKeys
import kotlin.script.experimental.host.ScriptingHostConfiguration
import kotlin.script.experimental.jvm.defaultJvmScriptingHostConfiguration
import kotlin.script.experimental.util.PropertiesCollection
@@ -55,7 +54,7 @@ fun loadGradleDefinitions(params: GradleDefinitionsParams): List<GradleScriptDef
)
}
val hostConfiguration = createHostConfiguration(params = params)
val hostConfiguration = params.toHostConfiguration()
return loadDefinitionsFromTemplates(
templateClassNames = templateClasses,
templateClasspath = templateClasspath,
@@ -95,16 +94,16 @@ private fun findStdLibLanguageVersion(kotlinLibsClassPath: List<Path>): List<Str
?: emptyList()
}
private fun createHostConfiguration(params: GradleDefinitionsParams): ScriptingHostConfiguration =
private fun GradleDefinitionsParams.toHostConfiguration(): ScriptingHostConfiguration =
ScriptingHostConfiguration(defaultJvmScriptingHostConfiguration) {
getEnvironment {
mapOf(
"gradleHome" to params.gradleHome?.let(::File),
"gradleJavaHome" to params.javaHome,
"projectRoot" to params.workingDir.let(::File),
"gradleHome" to gradleHome.let(::File),
"gradleJavaHome" to javaHome,
"projectRoot" to workingDir.let(::File),
"gradleOptions" to emptyList<String>(), // There is no option in UI to set project wide gradleOptions
"gradleJvmOptions" to params.jvmArguments,
"gradleEnvironmentVariables" to params.environment
"gradleJvmOptions" to jvmArguments,
"gradleEnvironmentVariables" to environment
)
}
}
@@ -157,15 +156,3 @@ val GradleScriptCompilationConfigurationKeys.externalProjectPath: PropertiesColl
object KotlinGradleScriptEntitySource : EntitySource
class GradleScriptModelData(
val models: Collection<GradleScriptModel>,
val javaHome: String? = null,
)
class GradleScriptModel(
val virtualFile: VirtualFile,
val classPath: List<String>,
val sourcePath: List<String>,
val imports: List<String>,
)
@@ -10,10 +10,14 @@ interface KotlinScriptHighlightingExtension {
companion object {
val EP_NAME: ProjectExtensionPointName<KotlinScriptHighlightingExtension> =
ProjectExtensionPointName<KotlinScriptHighlightingExtension>("org.jetbrains.kotlin.scriptHighlightingExtension")
ProjectExtensionPointName("org.jetbrains.kotlin.scriptHighlightingExtension")
/**
* Regular scripts (.kts) do not support external dependencies, so there is no need to postpone resolving.
* However, certain plugins (e.g., Gradle) may apply their own approach to scripting analysis, which occasionally doesn't imply lazy evaluation.
*/
fun shouldHighlightScript(project: Project, file: KtFile): Boolean {
return EP_NAME.getExtensions(project).any { it.shouldHighlightScript(file) }
return EP_NAME.getExtensions(project).all { it.shouldHighlightScript(file) }
}
}
}