From 7f5715f5da51cafc27e8bfd80c9c9aaaf401f00b Mon Sep 17 00:00:00 2001 From: Natalia Selezneva Date: Tue, 17 Mar 2020 13:24:04 +0300 Subject: [PATCH] 201: KotlinDslScriptsModel: use ProjectModelContributor to process models Instead of populateProjectExtraModels in Resolver --- .../importing/KotlinDslScriptModelResolver.kt | 2 +- .../KotlinDslScriptModelResolver.kt.192 | 2 +- .../KotlinDslScriptModelResolver.kt.201 | 49 ++++++++++++ .../KotlinDslScriptModelResolverCommon.kt | 73 ------------------ .../KotlinDslScrtiptModelProcessor.kt | 75 +++++++++++++++++++ idea/resources/META-INF/gradle.xml.201 | 48 ++++++++++++ 6 files changed, 174 insertions(+), 75 deletions(-) create mode 100644 idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt.201 create mode 100644 idea/resources/META-INF/gradle.xml.201 diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt index 1d8c81d6472..d083635a37d 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt @@ -45,7 +45,7 @@ class KotlinDslScriptModelResolver : KotlinDslScriptModelResolverCommon() { root.projects.forEach { if (it.projectIdentifier.projectPath == ":") { resolverCtx.models.getModel(it, KotlinDslScriptsModel::class.java)?.let { model -> - processScriptModel(ideProject, model, it.projectIdentifier.projectPath) + processScriptModel(resolverCtx, model, it.projectIdentifier.projectPath) } } } diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt.192 b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt.192 index c6471d684f1..d776201c002 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt.192 +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt.192 @@ -43,7 +43,7 @@ class KotlinDslScriptModelResolver : KotlinDslScriptModelResolverCommon() { root.modules.forEach { if (it.gradleProject.parent == null) { resolverCtx.getExtraProject(it, KotlinDslScriptsModel::class.java)?.let { model -> - processScriptModel(ideProject, model, it.name) + processScriptModel(resolverCtx, model, it.name) } } } diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt.201 b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt.201 new file mode 100644 index 00000000000..6451fb2f3ed --- /dev/null +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt.201 @@ -0,0 +1,49 @@ +/* + * 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 org.jetbrains.plugins.gradle.model.ClassSetImportModelProvider +import org.jetbrains.plugins.gradle.model.ProjectImportModelProvider +import org.gradle.tooling.model.kotlin.dsl.KotlinDslScriptsModel +import org.jetbrains.kotlin.idea.scripting.gradle.kotlinDslScriptsModelImportSupported +import org.jetbrains.plugins.gradle.service.project.ModifiableGradleProjectModel +import org.jetbrains.plugins.gradle.service.project.ProjectModelContributor +import org.jetbrains.plugins.gradle.service.project.ProjectResolverContext +import org.jetbrains.plugins.gradle.service.project.ToolingModelsProvider + +class KotlinDslScriptModelResolver : KotlinDslScriptModelResolverCommon() { + override fun requiresTaskRunning() = true + + override fun getModelProvider() = KotlinDslScriptModelProvider() + + override fun getProjectsLoadedModelProvider(): ProjectImportModelProvider? { + return ClassSetImportModelProvider( + emptySet(), + setOf(KotlinDslScriptAdditionalTask::class.java) + ) + } +} + +@Suppress("UnstableApiUsage") +class KotlinDslScriptModelContributor : ProjectModelContributor { + override fun accept( + projectModelBuilder: ModifiableGradleProjectModel, + toolingModelsProvider: ToolingModelsProvider, + resolverContext: ProjectResolverContext + ) { + if (!kotlinDslScriptsModelImportSupported(resolverContext.projectGradleVersion)) return + + toolingModelsProvider.projects().forEach { + val projectIdentifier = it.projectIdentifier.projectPath + if (projectIdentifier == ":") { + val model = toolingModelsProvider.getProjectModel(it, KotlinDslScriptsModel::class.java) + if (model != null) { + processScriptModel(resolverContext, model, projectIdentifier) + } + } + } + } +} \ No newline at end of file diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolverCommon.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolverCommon.kt index 30afda644da..e67050f60a4 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolverCommon.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolverCommon.kt @@ -6,14 +6,10 @@ package org.jetbrains.kotlin.idea.scripting.gradle.importing import com.intellij.openapi.diagnostic.Logger -import com.intellij.openapi.externalSystem.model.DataNode -import com.intellij.openapi.externalSystem.model.project.ProjectData import com.intellij.openapi.externalSystem.util.Order import com.intellij.openapi.util.Pair -import org.gradle.tooling.model.kotlin.dsl.EditorReportSeverity import org.gradle.tooling.model.kotlin.dsl.KotlinDslModelsParameters.* import org.gradle.tooling.model.kotlin.dsl.KotlinDslScriptsModel -import org.jetbrains.kotlin.idea.KotlinIdeaGradleBundle import org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension internal val LOG = Logger.getInstance(KotlinDslScriptModelResolverCommon::class.java) @@ -36,73 +32,4 @@ abstract class KotlinDslScriptModelResolverCommon : AbstractProjectResolverExten override fun getExtraCommandLineArgs(): List { return listOf("-P$CORRELATION_ID_GRADLE_PROPERTY_NAME=${System.nanoTime()}") } - - @Suppress("unused") - protected fun KotlinDslScriptsModel.toListOfScriptModels(): List = - scriptModels.map { (file, model) -> - val messages = mutableListOf() - - model.exceptions.forEach { - val fromException = parsePositionFromException(it) - if (fromException != null) { - val (filePath, _) = fromException - if (filePath != file.path) return@forEach - } - messages.add( - KotlinDslScriptModel.Message( - KotlinDslScriptModel.Severity.ERROR, - it.substringBefore(System.lineSeparator()), - it, - fromException?.second - ) - ) - } - - model.editorReports.forEach { - messages.add( - KotlinDslScriptModel.Message( - when (it.severity) { - EditorReportSeverity.WARNING -> KotlinDslScriptModel.Severity.WARNING - else -> KotlinDslScriptModel.Severity.ERROR - }, - it.message, - position = KotlinDslScriptModel.Position(it.position?.line ?: 0, it.position?.column ?: 0) - ) - ) - } - - // todo(KT-34440): take inputs snapshot before starting import - KotlinDslScriptModel( - file.absolutePath, - System.currentTimeMillis(), - model.classPath.map { it.absolutePath }, - model.sourcePath.map { it.absolutePath }, - model.implicitImports, - messages - ) - } - - protected fun processScriptModel( - ideProject: DataNode, - model: KotlinDslScriptsModel, - projectName: String - ) { - if (model is BrokenKotlinDslScriptsModel) { - LOG.error( - "Couldn't get KotlinDslScriptsModel for $projectName:\n${model.message}\n${model.stackTrace}" - ) - } else { - val models = model.toListOfScriptModels() - resolverCtx.externalSystemTaskId.findProject()?.kotlinDslModels?.addAll( - models - ) - if (models.containsErrors()) { - throw IllegalStateException(KotlinIdeaGradleBundle.message("title.kotlin.build.script")) - } - } - } - - private fun Collection.containsErrors(): Boolean { - return any { it.messages.any { it.severity == KotlinDslScriptModel.Severity.ERROR } } - } } \ No newline at end of file diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScrtiptModelProcessor.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScrtiptModelProcessor.kt index 7042a81f2de..bffdedcd50c 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScrtiptModelProcessor.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScrtiptModelProcessor.kt @@ -10,6 +10,9 @@ import com.intellij.openapi.externalSystem.model.task.ExternalSystemTaskId import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.VirtualFile +import org.gradle.tooling.model.kotlin.dsl.EditorReportSeverity +import org.gradle.tooling.model.kotlin.dsl.KotlinDslScriptsModel +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 @@ -27,6 +30,78 @@ import kotlin.script.experimental.jvm.JvmDependency import kotlin.script.experimental.jvm.jdkHome import kotlin.script.experimental.jvm.jvm +fun processScriptModel( + resolverCtx: ProjectResolverContext, + model: KotlinDslScriptsModel, + projectName: String +) { + if (model is BrokenKotlinDslScriptsModel) { + LOG.error( + "Couldn't get KotlinDslScriptsModel for $projectName:\n${model.message}\n${model.stackTrace}" + ) + } else { + val models = model.toListOfScriptModels() + resolverCtx.externalSystemTaskId.findProject()?.kotlinDslModels?.addAll( + models + ) + if (models.containsErrors()) { + throw IllegalStateException(KotlinIdeaGradleBundle.message("title.kotlin.build.script")) + } + + if (models.containsErrors()) { + throw IllegalStateException(KotlinIdeaGradleBundle.message("title.kotlin.build.script")) + } + } +} + +private fun Collection.containsErrors(): Boolean { + return any { it.messages.any { it.severity == KotlinDslScriptModel.Severity.ERROR } } +} + +private fun KotlinDslScriptsModel.toListOfScriptModels(): List = + scriptModels.map { (file, model) -> + val messages = mutableListOf() + + model.exceptions.forEach { + val fromException = parsePositionFromException(it) + if (fromException != null) { + val (filePath, _) = fromException + if (filePath != file.path) return@forEach + } + messages.add( + KotlinDslScriptModel.Message( + KotlinDslScriptModel.Severity.ERROR, + it.substringBefore(System.lineSeparator()), + it, + fromException?.second + ) + ) + } + + model.editorReports.forEach { + messages.add( + KotlinDslScriptModel.Message( + when (it.severity) { + EditorReportSeverity.WARNING -> KotlinDslScriptModel.Severity.WARNING + else -> KotlinDslScriptModel.Severity.ERROR + }, + it.message, + position = KotlinDslScriptModel.Position(it.position?.line ?: 0, it.position?.column ?: 0) + ) + ) + } + + // todo(KT-34440): take inputs snapshot before starting import + KotlinDslScriptModel( + file.absolutePath, + System.currentTimeMillis(), + model.classPath.map { it.absolutePath }, + model.sourcePath.map { it.absolutePath }, + model.implicitImports, + messages + ) + } + fun saveScriptModels( project: Project, task: ExternalSystemTaskId, diff --git a/idea/resources/META-INF/gradle.xml.201 b/idea/resources/META-INF/gradle.xml.201 new file mode 100644 index 00000000000..5fabc060799 --- /dev/null +++ b/idea/resources/META-INF/gradle.xml.201 @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +