diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/BrokenKotlinDslScriptsModel.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/BrokenKotlinDslScriptsModel.kt new file mode 100644 index 00000000000..d57dd0c2e73 --- /dev/null +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/BrokenKotlinDslScriptsModel.kt @@ -0,0 +1,20 @@ +/* + * 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 org.gradle.tooling.model.kotlin.dsl.KotlinDslScriptModel +import org.gradle.tooling.model.kotlin.dsl.KotlinDslScriptsModel +import java.io.File +import java.io.PrintWriter +import java.io.Serializable +import java.io.StringWriter + +class BrokenKotlinDslScriptsModel(exception: Throwable) : KotlinDslScriptsModel, Serializable { + val message = exception.message + val stackTrace = StringWriter().also { exception.printStackTrace(PrintWriter(it)) }.toString() + + override fun getScriptModels(): Map = mapOf() +} \ No newline at end of file diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelProvider.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelProvider.kt index e8cb44ab625..d7847a3ea55 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelProvider.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelProvider.kt @@ -21,9 +21,13 @@ class KotlinDslScriptModelProvider : ProjectImportModelProvider { ) { buildModel.projects.forEach { if (it.parent == null) { - val model = controller.findModel(it, kotlinDslScriptModelClass) - if (model != null) { - consumer.consumeProjectModel(it, model, kotlinDslScriptModelClass) + try { + val model = controller.findModel(it, kotlinDslScriptModelClass) + if (model != null) { + consumer.consumeProjectModel(it, model, kotlinDslScriptModelClass) + } + } catch (e: Throwable) { + consumer.consumeProjectModel(it, BrokenKotlinDslScriptsModel(e), kotlinDslScriptModelClass) } } } 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 bf3e89c476a..8f7f9573342 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 @@ -34,9 +34,10 @@ class KotlinDslScriptModelResolver : KotlinDslScriptModelResolverCommon() { ideProject: DataNode ) { root.projects.forEach { - if ((it as? GradleProject)?.parent == null) { + val gradleProject = it as? GradleProject ?: return@forEach + if (gradleProject.parent == null) { resolverCtx.models.getModel(it, KotlinDslScriptsModel::class.java)?.let { model -> - ideProject.KOTLIN_DSL_SCRIPT_MODELS.addAll(model.toListOfScriptModels()) + processScriptModel(ideProject, model, gradleProject.name) } } } 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 0fe429786b3..1b65b660092 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 @@ -34,7 +34,7 @@ class KotlinDslScriptModelResolver : KotlinDslScriptModelResolverCommon() { root.modules.forEach { if (it.gradleProject.parent == null) { resolverCtx.getExtraProject(it, KotlinDslScriptsModel::class.java)?.let { model -> - ideProject.KOTLIN_DSL_SCRIPT_MODELS.addAll(model.toListOfScriptModels()) + processScriptModel(ideProject, model, it.name) } } } 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 4746b5f1c35..85f0a37f8fb 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 @@ -5,6 +5,9 @@ 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.util.Pair import com.intellij.util.Consumer import org.gradle.tooling.model.kotlin.dsl.EditorReportSeverity @@ -13,6 +16,8 @@ import org.gradle.tooling.model.kotlin.dsl.KotlinDslScriptsModel import org.jetbrains.kotlin.idea.scripting.gradle.minimal_gradle_version_supported import org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension +internal val LOG = Logger.getInstance(KotlinDslScriptModelResolverCommon::class.java) + abstract class KotlinDslScriptModelResolverCommon : AbstractProjectResolverExtension() { override fun getExtraProjectModelClasses(): Set> { return setOf(KotlinDslScriptsModel::class.java) @@ -71,4 +76,18 @@ abstract class KotlinDslScriptModelResolverCommon : AbstractProjectResolverExten 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 { + ideProject.KOTLIN_DSL_SCRIPT_MODELS.addAll(model.toListOfScriptModels()) + } + } } \ No newline at end of file