KotlinDslScriptsModel: save script models right after getting model
Remove redundant DataService
This commit is contained in:
-13
@@ -5,19 +5,6 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.scripting.gradle.importing
|
package org.jetbrains.kotlin.idea.scripting.gradle.importing
|
||||||
|
|
||||||
import com.intellij.openapi.externalSystem.model.DataNode
|
|
||||||
import com.intellij.openapi.externalSystem.model.project.ProjectData
|
|
||||||
import com.intellij.openapi.util.Key
|
|
||||||
import org.jetbrains.kotlin.idea.util.NotNullableCopyableDataNodeUserDataProperty
|
|
||||||
|
|
||||||
var DataNode<out ProjectData>.KOTLIN_DSL_SCRIPT_MODELS: MutableList<KotlinDslScriptModel>
|
|
||||||
by NotNullableCopyableDataNodeUserDataProperty(
|
|
||||||
Key.create<MutableList<KotlinDslScriptModel>>(
|
|
||||||
"GRADLE_KOTLIN_BUILD_SCRIPTS"
|
|
||||||
),
|
|
||||||
mutableListOf()
|
|
||||||
)
|
|
||||||
|
|
||||||
data class KotlinDslScriptModel(
|
data class KotlinDslScriptModel(
|
||||||
val file: String,
|
val file: String,
|
||||||
val inputsTimeStamp: Long,
|
val inputsTimeStamp: Long,
|
||||||
|
|||||||
-160
@@ -1,160 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
|
||||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package org.jetbrains.kotlin.idea.scripting.gradle.importing
|
|
||||||
|
|
||||||
import com.intellij.openapi.components.service
|
|
||||||
import com.intellij.openapi.externalSystem.model.DataNode
|
|
||||||
import com.intellij.openapi.externalSystem.model.Key
|
|
||||||
import com.intellij.openapi.externalSystem.model.ProjectKeys
|
|
||||||
import com.intellij.openapi.externalSystem.model.project.ProjectData
|
|
||||||
import com.intellij.openapi.externalSystem.service.notification.ExternalSystemNotificationManager
|
|
||||||
import com.intellij.openapi.externalSystem.service.notification.NotificationCategory
|
|
||||||
import com.intellij.openapi.externalSystem.service.notification.NotificationData
|
|
||||||
import com.intellij.openapi.externalSystem.service.notification.NotificationSource
|
|
||||||
import com.intellij.openapi.externalSystem.service.project.IdeModelsProvider
|
|
||||||
import com.intellij.openapi.externalSystem.service.project.manage.AbstractProjectDataService
|
|
||||||
import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
|
|
||||||
import com.intellij.openapi.fileEditor.OpenFileDescriptor
|
|
||||||
import com.intellij.openapi.project.Project
|
|
||||||
import com.intellij.openapi.vfs.VfsUtil
|
|
||||||
import com.intellij.openapi.vfs.VirtualFile
|
|
||||||
import com.intellij.pom.Navigatable
|
|
||||||
import org.jetbrains.kotlin.idea.KotlinIdeaGradleBundle
|
|
||||||
import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager
|
|
||||||
import org.jetbrains.kotlin.idea.core.script.configuration.cache.CachedConfigurationInputs
|
|
||||||
import org.jetbrains.kotlin.idea.core.script.configuration.cache.ScriptConfigurationSnapshot
|
|
||||||
import org.jetbrains.kotlin.idea.scripting.gradle.GradleScriptInputsWatcher
|
|
||||||
import org.jetbrains.kotlin.idea.scripting.gradle.getGradleScriptInputsStamp
|
|
||||||
import org.jetbrains.kotlin.idea.scripting.gradle.saveGradleProjectRootsAfterImport
|
|
||||||
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.plugins.gradle.settings.GradleExecutionSettings
|
|
||||||
import org.jetbrains.plugins.gradle.util.GradleConstants
|
|
||||||
import java.io.File
|
|
||||||
import kotlin.script.experimental.api.*
|
|
||||||
import kotlin.script.experimental.jvm.JvmDependency
|
|
||||||
import kotlin.script.experimental.jvm.jdkHome
|
|
||||||
import kotlin.script.experimental.jvm.jvm
|
|
||||||
|
|
||||||
class KotlinDslScriptModelDataService : AbstractProjectDataService<ProjectData, Void>() {
|
|
||||||
override fun getTargetDataKey(): Key<ProjectData> = ProjectKeys.PROJECT
|
|
||||||
|
|
||||||
override fun onSuccessImport(
|
|
||||||
imported: MutableCollection<DataNode<ProjectData>>,
|
|
||||||
projectData: ProjectData?,
|
|
||||||
project: Project,
|
|
||||||
modelsProvider: IdeModelsProvider
|
|
||||||
) {
|
|
||||||
super.onSuccessImport(imported, projectData, project, modelsProvider)
|
|
||||||
|
|
||||||
val projectDataNode = imported.singleOrNull() ?: return
|
|
||||||
val gradleKotlinBuildScripts = projectDataNode.KOTLIN_DSL_SCRIPT_MODELS
|
|
||||||
val buildScripts = gradleKotlinBuildScripts.toList()
|
|
||||||
gradleKotlinBuildScripts.clear()
|
|
||||||
|
|
||||||
val gradleSettings = ExternalSystemApiUtil.getSettings(project, GradleConstants.SYSTEM_ID)
|
|
||||||
val projectRoot = projectData?.linkedExternalProjectPath ?: return
|
|
||||||
val projectSettings = gradleSettings.getLinkedProjectSettings(projectRoot) ?: return
|
|
||||||
|
|
||||||
saveGradleProjectRootsAfterImport(projectSettings.modules.takeIf { it.isNotEmpty() } ?: setOf(projectRoot))
|
|
||||||
|
|
||||||
val gradleExeSettings = ExternalSystemApiUtil.getExecutionSettings<GradleExecutionSettings>(
|
|
||||||
project,
|
|
||||||
projectSettings.externalProjectPath,
|
|
||||||
GradleConstants.SYSTEM_ID
|
|
||||||
)
|
|
||||||
val javaHome = File(gradleExeSettings.javaHome ?: return)
|
|
||||||
|
|
||||||
val scriptConfigurations = mutableListOf<Pair<VirtualFile, ScriptConfigurationSnapshot>>()
|
|
||||||
|
|
||||||
buildScripts.forEach { buildScript ->
|
|
||||||
val scriptFile = File(buildScript.file)
|
|
||||||
val virtualFile = VfsUtil.findFile(scriptFile.toPath(), true)!!
|
|
||||||
|
|
||||||
val inputs = getGradleScriptInputsStamp(project, virtualFile, givenTimeStamp = buildScript.inputsTimeStamp)
|
|
||||||
|
|
||||||
val definition = virtualFile.findScriptDefinition(project) ?: return@forEach
|
|
||||||
|
|
||||||
val configuration =
|
|
||||||
definition.compilationConfiguration.with {
|
|
||||||
jvm.jdkHome(javaHome)
|
|
||||||
defaultImports(buildScript.imports)
|
|
||||||
dependencies(JvmDependency(buildScript.classPath.map { File(it) }))
|
|
||||||
ide.dependenciesSources(JvmDependency(buildScript.sourcePath.map { File(it) }))
|
|
||||||
}.adjustByDefinition(definition)
|
|
||||||
|
|
||||||
scriptConfigurations.add(
|
|
||||||
Pair(
|
|
||||||
virtualFile,
|
|
||||||
ScriptConfigurationSnapshot(
|
|
||||||
inputs ?: CachedConfigurationInputs.OutOfDate,
|
|
||||||
listOf(),
|
|
||||||
ScriptCompilationConfigurationWrapper.FromCompilationConfiguration(
|
|
||||||
VirtualFileScriptSource(virtualFile),
|
|
||||||
configuration
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
buildScript.messages.forEach {
|
|
||||||
addBuildScriptDiagnosticMessage(it, virtualFile, project)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
project.service<ScriptConfigurationManager>().saveCompilationConfigurationAfterImport(scriptConfigurations)
|
|
||||||
project.service<GradleScriptInputsWatcher>().clearState()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun addBuildScriptDiagnosticMessage(
|
|
||||||
message: KotlinDslScriptModel.Message,
|
|
||||||
virtualFile: VirtualFile,
|
|
||||||
project: Project
|
|
||||||
) {
|
|
||||||
val notification = NotificationData(
|
|
||||||
KotlinIdeaGradleBundle.message("title.kotlin.build.script"),
|
|
||||||
message.text,
|
|
||||||
when (message.severity) {
|
|
||||||
KotlinDslScriptModel.Severity.WARNING -> NotificationCategory.WARNING
|
|
||||||
KotlinDslScriptModel.Severity.ERROR -> NotificationCategory.ERROR
|
|
||||||
},
|
|
||||||
NotificationSource.PROJECT_SYNC
|
|
||||||
)
|
|
||||||
|
|
||||||
notification.navigatable =
|
|
||||||
LazyNavigatable(
|
|
||||||
virtualFile,
|
|
||||||
project,
|
|
||||||
message.position
|
|
||||||
)
|
|
||||||
|
|
||||||
ExternalSystemNotificationManager.getInstance(project).showNotification(
|
|
||||||
GradleConstants.SYSTEM_ID,
|
|
||||||
notification
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
class LazyNavigatable internal constructor(
|
|
||||||
private val virtualFile: VirtualFile,
|
|
||||||
private val project: Project,
|
|
||||||
val position: KotlinDslScriptModel.Position?
|
|
||||||
) : Navigatable {
|
|
||||||
private val openFileDescriptor: Navigatable by lazy {
|
|
||||||
if (position != null) OpenFileDescriptor(project, virtualFile, position.line, position.column)
|
|
||||||
else OpenFileDescriptor(project, virtualFile, -1)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun navigate(requestFocus: Boolean) {
|
|
||||||
if (openFileDescriptor.canNavigate()) openFileDescriptor.navigate(requestFocus)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun canNavigate(): Boolean = virtualFile.exists()
|
|
||||||
|
|
||||||
override fun canNavigateToSource(): Boolean = canNavigate()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
+5
-1
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.idea.scripting.gradle.importing
|
|||||||
import com.intellij.openapi.diagnostic.Logger
|
import com.intellij.openapi.diagnostic.Logger
|
||||||
import com.intellij.openapi.externalSystem.model.DataNode
|
import com.intellij.openapi.externalSystem.model.DataNode
|
||||||
import com.intellij.openapi.externalSystem.model.project.ProjectData
|
import com.intellij.openapi.externalSystem.model.project.ProjectData
|
||||||
|
import com.intellij.openapi.externalSystem.util.Order
|
||||||
import com.intellij.openapi.util.Pair
|
import com.intellij.openapi.util.Pair
|
||||||
import org.gradle.tooling.model.kotlin.dsl.EditorReportSeverity
|
import org.gradle.tooling.model.kotlin.dsl.EditorReportSeverity
|
||||||
import org.gradle.tooling.model.kotlin.dsl.KotlinDslModelsParameters.*
|
import org.gradle.tooling.model.kotlin.dsl.KotlinDslModelsParameters.*
|
||||||
@@ -16,6 +17,7 @@ import org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExten
|
|||||||
|
|
||||||
internal val LOG = Logger.getInstance(KotlinDslScriptModelResolverCommon::class.java)
|
internal val LOG = Logger.getInstance(KotlinDslScriptModelResolverCommon::class.java)
|
||||||
|
|
||||||
|
@Order(Integer.MIN_VALUE) // to be the first
|
||||||
abstract class KotlinDslScriptModelResolverCommon : AbstractProjectResolverExtension() {
|
abstract class KotlinDslScriptModelResolverCommon : AbstractProjectResolverExtension() {
|
||||||
override fun getExtraProjectModelClasses(): Set<Class<out Any>> {
|
override fun getExtraProjectModelClasses(): Set<Class<out Any>> {
|
||||||
return setOf(KotlinDslScriptsModel::class.java)
|
return setOf(KotlinDslScriptsModel::class.java)
|
||||||
@@ -83,7 +85,9 @@ abstract class KotlinDslScriptModelResolverCommon : AbstractProjectResolverExten
|
|||||||
"Couldn't get KotlinDslScriptsModel for $projectName:\n${model.message}\n${model.stackTrace}"
|
"Couldn't get KotlinDslScriptsModel for $projectName:\n${model.message}\n${model.stackTrace}"
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
ideProject.KOTLIN_DSL_SCRIPT_MODELS.addAll(model.toListOfScriptModels())
|
val models = model.toListOfScriptModels()
|
||||||
|
|
||||||
|
saveScriptModels(resolverCtx, models)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+157
@@ -0,0 +1,157 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||||
|
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.jetbrains.kotlin.idea.scripting.gradle.importing
|
||||||
|
|
||||||
|
import com.intellij.build.SyncViewManager
|
||||||
|
import com.intellij.openapi.components.service
|
||||||
|
import com.intellij.openapi.externalSystem.service.execution.ExternalSystemEventDispatcher
|
||||||
|
import com.intellij.openapi.externalSystem.service.notification.ExternalSystemNotificationManager
|
||||||
|
import com.intellij.openapi.externalSystem.service.notification.NotificationCategory
|
||||||
|
import com.intellij.openapi.externalSystem.service.notification.NotificationData
|
||||||
|
import com.intellij.openapi.externalSystem.service.notification.NotificationSource
|
||||||
|
import com.intellij.openapi.fileEditor.OpenFileDescriptor
|
||||||
|
import com.intellij.openapi.project.Project
|
||||||
|
import com.intellij.openapi.vfs.VfsUtil
|
||||||
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
|
import com.intellij.pom.Navigatable
|
||||||
|
import org.jetbrains.kotlin.idea.KotlinIdeaGradleBundle
|
||||||
|
import org.jetbrains.kotlin.idea.core.script.ScriptConfigurationManager
|
||||||
|
import org.jetbrains.kotlin.idea.core.script.configuration.cache.CachedConfigurationInputs
|
||||||
|
import org.jetbrains.kotlin.idea.core.script.configuration.cache.ScriptConfigurationSnapshot
|
||||||
|
import org.jetbrains.kotlin.idea.scripting.gradle.GradleScriptInputsWatcher
|
||||||
|
import org.jetbrains.kotlin.idea.scripting.gradle.getGradleScriptInputsStamp
|
||||||
|
import org.jetbrains.kotlin.idea.scripting.gradle.saveGradleProjectRootsAfterImport
|
||||||
|
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.plugins.gradle.service.project.ProjectResolverContext
|
||||||
|
import org.jetbrains.plugins.gradle.util.GradleConstants
|
||||||
|
import java.io.File
|
||||||
|
import kotlin.script.experimental.api.*
|
||||||
|
import kotlin.script.experimental.jvm.JvmDependency
|
||||||
|
import kotlin.script.experimental.jvm.jdkHome
|
||||||
|
import kotlin.script.experimental.jvm.jvm
|
||||||
|
|
||||||
|
fun saveScriptModels(
|
||||||
|
resolverContext: ProjectResolverContext,
|
||||||
|
models: List<KotlinDslScriptModel>
|
||||||
|
) {
|
||||||
|
val task = resolverContext.externalSystemTaskId
|
||||||
|
val project = task.findProject() ?: return
|
||||||
|
val settings = resolverContext.settings ?: return
|
||||||
|
|
||||||
|
val scriptConfigurations = mutableListOf<Pair<VirtualFile, ScriptConfigurationSnapshot>>()
|
||||||
|
|
||||||
|
val syncViewManager = project.service<SyncViewManager>()
|
||||||
|
val buildEventDispatcher =
|
||||||
|
ExternalSystemEventDispatcher(task, syncViewManager)
|
||||||
|
|
||||||
|
val javaHome = settings.javaHome?.let { File(it) }
|
||||||
|
models.forEach { buildScript ->
|
||||||
|
val scriptFile = File(buildScript.file)
|
||||||
|
val virtualFile = VfsUtil.findFile(scriptFile.toPath(), true)!!
|
||||||
|
|
||||||
|
val inputs = getGradleScriptInputsStamp(
|
||||||
|
project,
|
||||||
|
virtualFile,
|
||||||
|
givenTimeStamp = buildScript.inputsTimeStamp
|
||||||
|
)
|
||||||
|
|
||||||
|
val definition = virtualFile.findScriptDefinition(project) ?: return@forEach
|
||||||
|
|
||||||
|
val configuration =
|
||||||
|
definition.compilationConfiguration.with {
|
||||||
|
if (javaHome != null) {
|
||||||
|
jvm.jdkHome(javaHome)
|
||||||
|
}
|
||||||
|
defaultImports(buildScript.imports)
|
||||||
|
dependencies(JvmDependency(buildScript.classPath.map {
|
||||||
|
File(
|
||||||
|
it
|
||||||
|
)
|
||||||
|
}))
|
||||||
|
ide.dependenciesSources(JvmDependency(buildScript.sourcePath.map {
|
||||||
|
File(
|
||||||
|
it
|
||||||
|
)
|
||||||
|
}))
|
||||||
|
}.adjustByDefinition(definition)
|
||||||
|
|
||||||
|
scriptConfigurations.add(
|
||||||
|
Pair(
|
||||||
|
virtualFile,
|
||||||
|
ScriptConfigurationSnapshot(
|
||||||
|
inputs
|
||||||
|
?: CachedConfigurationInputs.OutOfDate,
|
||||||
|
listOf(),
|
||||||
|
ScriptCompilationConfigurationWrapper.FromCompilationConfiguration(
|
||||||
|
VirtualFileScriptSource(virtualFile),
|
||||||
|
configuration,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
buildScript.messages.forEach {
|
||||||
|
addBuildScriptDiagnosticMessage(it, virtualFile, project)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
saveGradleProjectRootsAfterImport(
|
||||||
|
scriptConfigurations.map { it.first.parent.path }.toSet()
|
||||||
|
)
|
||||||
|
|
||||||
|
project.service<ScriptConfigurationManager>().saveCompilationConfigurationAfterImport(scriptConfigurations)
|
||||||
|
project.service<GradleScriptInputsWatcher>().clearState()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun addBuildScriptDiagnosticMessage(
|
||||||
|
message: KotlinDslScriptModel.Message,
|
||||||
|
virtualFile: VirtualFile,
|
||||||
|
project: Project
|
||||||
|
) {
|
||||||
|
val notification = NotificationData(
|
||||||
|
KotlinIdeaGradleBundle.message("title.kotlin.build.script"),
|
||||||
|
message.text,
|
||||||
|
when (message.severity) {
|
||||||
|
KotlinDslScriptModel.Severity.WARNING -> NotificationCategory.WARNING
|
||||||
|
KotlinDslScriptModel.Severity.ERROR -> NotificationCategory.ERROR
|
||||||
|
},
|
||||||
|
NotificationSource.PROJECT_SYNC
|
||||||
|
)
|
||||||
|
|
||||||
|
notification.navigatable =
|
||||||
|
LazyNavigatable(
|
||||||
|
virtualFile,
|
||||||
|
project,
|
||||||
|
message.position
|
||||||
|
)
|
||||||
|
|
||||||
|
ExternalSystemNotificationManager.getInstance(project).showNotification(
|
||||||
|
GradleConstants.SYSTEM_ID,
|
||||||
|
notification
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
class LazyNavigatable internal constructor(
|
||||||
|
private val virtualFile: VirtualFile,
|
||||||
|
private val project: Project,
|
||||||
|
val position: KotlinDslScriptModel.Position?
|
||||||
|
) : Navigatable {
|
||||||
|
private val openFileDescriptor: Navigatable by lazy {
|
||||||
|
if (position != null) OpenFileDescriptor(project, virtualFile, position.line, position.column)
|
||||||
|
else OpenFileDescriptor(project, virtualFile, -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun navigate(requestFocus: Boolean) {
|
||||||
|
if (openFileDescriptor.canNavigate()) openFileDescriptor.navigate(requestFocus)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun canNavigate(): Boolean = virtualFile.exists()
|
||||||
|
|
||||||
|
override fun canNavigateToSource(): Boolean = canNavigate()
|
||||||
|
}
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
<projectTaskRunner implementation="org.jetbrains.kotlin.idea.gradle.execution.KotlinMPPGradleProjectTaskRunner" order="first, before gradle"/>
|
<projectTaskRunner implementation="org.jetbrains.kotlin.idea.gradle.execution.KotlinMPPGradleProjectTaskRunner" order="first, before gradle"/>
|
||||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService"/>
|
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinSourceSetDataService"/>
|
||||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleProjectSettingsDataService"/>
|
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.configuration.KotlinGradleProjectSettingsDataService"/>
|
||||||
<externalProjectDataService implementation="org.jetbrains.kotlin.idea.scripting.gradle.importing.KotlinDslScriptModelDataService"/>
|
|
||||||
<registryKey key="kotlin.mpp.tests.force.gradle"
|
<registryKey key="kotlin.mpp.tests.force.gradle"
|
||||||
description="Run multi-platform tests with Gradle runner even if the platform runner is used by default.
|
description="Run multi-platform tests with Gradle runner even if the platform runner is used by default.
|
||||||
This setting currently affects only HMPP projects. You may need to delete existing test configurations for the change to take place."
|
This setting currently affects only HMPP projects. You may need to delete existing test configurations for the change to take place."
|
||||||
|
|||||||
Reference in New Issue
Block a user