diff --git a/.idea/vcs.xml b/.idea/vcs.xml index 8c555bf894d..debcaae5dd3 100644 --- a/.idea/vcs.xml +++ b/.idea/vcs.xml @@ -1,5 +1,10 @@ + + + + + + \ No newline at end of file diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptIdeaModel.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptIdeaModel.kt deleted file mode 100644 index a64f65ac90f..00000000000 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptIdeaModel.kt +++ /dev/null @@ -1,76 +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.externalSystem.model.DataNode -import com.intellij.openapi.externalSystem.model.project.ProjectData -import com.intellij.openapi.util.Key -import org.gradle.tooling.model.kotlin.dsl.EditorReportSeverity -import org.gradle.tooling.model.kotlin.dsl.KotlinDslScriptsModel -import org.jetbrains.kotlin.idea.util.NotNullableCopyableDataNodeUserDataProperty - -var DataNode.KOTLIN_DSL_SCRIPT_IDEA_MODELS: MutableList - by NotNullableCopyableDataNodeUserDataProperty( - Key.create>( - "GRADLE_KOTLIN_BUILD_SCRIPTS" - ), - mutableListOf() - ) - -data class KotlinDslScriptIdeaModel( - val file: String, - val classPath: List, - val sourcePath: List, - val imports: List, - val messages: List -) { - data class Message( - val severity: Severity, - val text: String, - val position: Position? = null - ) - - data class Position(val line: Int, val column: Int) - - enum class Severity { WARNING, ERROR } -} - -@Suppress("unused") -fun KotlinDslScriptModelResolver.copy(model: KotlinDslScriptsModel): List { - return model.scriptModels.map { (file, model) -> - val messages = mutableListOf() - - model.exceptions.forEach { - messages.add( - KotlinDslScriptIdeaModel.Message( - KotlinDslScriptIdeaModel.Severity.ERROR, it - ) - ) - } - - model.editorReports.forEach { - messages.add(KotlinDslScriptIdeaModel.Message( - when (it.severity) { - EditorReportSeverity.WARNING -> KotlinDslScriptIdeaModel.Severity.WARNING - else -> KotlinDslScriptIdeaModel.Severity.ERROR - }, - it.message, - it.position?.let { position -> - KotlinDslScriptIdeaModel - .Position(position.line, position.column) - } - )) - } - - KotlinDslScriptIdeaModel( - file.absolutePath, - model.classPath.map { it.absolutePath }, - model.sourcePath.map { it.absolutePath }, - model.implicitImports, - messages - ) - } -} \ No newline at end of file diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModel.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModel.kt new file mode 100644 index 00000000000..4319bcc0038 --- /dev/null +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModel.kt @@ -0,0 +1,39 @@ +/* + * 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.externalSystem.model.DataNode +import com.intellij.openapi.externalSystem.model.project.ProjectData +import com.intellij.openapi.util.Key +import org.gradle.tooling.model.kotlin.dsl.EditorReportSeverity +import org.gradle.tooling.model.kotlin.dsl.KotlinDslScriptsModel +import org.jetbrains.kotlin.idea.util.NotNullableCopyableDataNodeUserDataProperty + +var DataNode.KOTLIN_DSL_SCRIPT_MODELS: MutableList + by NotNullableCopyableDataNodeUserDataProperty( + Key.create>( + "GRADLE_KOTLIN_BUILD_SCRIPTS" + ), + mutableListOf() + ) + +data class KotlinDslScriptModel( + val file: String, + val classPath: List, + val sourcePath: List, + val imports: List, + val messages: List +) { + data class Message( + val severity: Severity, + val text: String, + val position: Position? = null + ) + + data class Position(val line: Int, val column: Int) + + enum class Severity { WARNING, ERROR } +} \ No newline at end of file diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelDataService.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelDataService.kt index 10c62dbffdf..fdcf7f4912c 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelDataService.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelDataService.kt @@ -50,7 +50,7 @@ class KotlinDslScriptModelDataService : AbstractProjectDataService NotificationCategory.WARNING - KotlinDslScriptIdeaModel.Severity.ERROR -> NotificationCategory.ERROR + KotlinDslScriptModel.Severity.WARNING -> NotificationCategory.WARNING + KotlinDslScriptModel.Severity.ERROR -> NotificationCategory.ERROR }, NotificationSource.PROJECT_SYNC ) @@ -135,7 +135,7 @@ class KotlinDslScriptModelDataService : AbstractProjectDataService + if (module.gradleProject.parent == null) { + val model = controller.findModel(module.gradleProject, kotlinDslScriptModelClass) + if (model != null) { + consumer.consume(module, model, kotlinDslScriptModelClass) + } + } } } diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.as36 b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.as36 deleted file mode 100644 index b197e09d428..00000000000 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.as36 +++ /dev/null @@ -1,56 +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.configuration - -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.idea.IdeaProject -import org.gradle.tooling.model.kotlin.dsl.KotlinDslModelsParameters.* -import org.gradle.tooling.model.kotlin.dsl.KotlinDslScriptsModel -import org.jetbrains.kotlin.idea.scripting.gradle.kotlinDslScriptsModelImportSupported -import org.jetbrains.kotlin.idea.scripting.gradle.minimal_gradle_version_supported -import org.jetbrains.plugins.gradle.model.ProjectImportExtraModelProvider -import org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension - -class KotlinGradleBuildScriptsResolver : AbstractProjectResolverExtension() { - override fun getExtraProjectModelClasses(): Set> { - return setOf(KotlinDslScriptsModel::class.java) - } - - override fun getExtraJvmArgs(): List> { - return listOf( - Pair( - "-D$PROVIDER_MODE_SYSTEM_PROPERTY_NAME", - STRICT_CLASSPATH_MODE_SYSTEM_PROPERTY_VALUE - ) - ) - } - - override fun enhanceTaskProcessing(taskNames: MutableList, jvmParametersSetup: String?, initScriptConsumer: Consumer) { - initScriptConsumer.consume( - "if (org.gradle.util.GradleVersion.current() >= org.gradle.util.GradleVersion.version(\"$minimal_gradle_version_supported\")) startParameter.taskNames += [\"${PREPARATION_TASK_NAME}\"]" - ) - } - - override fun getExtraModelProvider(): ProjectImportExtraModelProvider { - return KotlinDslScriptModelProvider() - } - - override fun populateProjectExtraModels(gradleProject: IdeaProject, ideProject: DataNode) { - super.populateProjectExtraModels(gradleProject, ideProject) - - if (kotlinDslScriptsModelImportSupported(resolverCtx.projectGradleVersion)) { - resolverCtx.getExtraProject(null, KotlinDslScriptsModel::class.java)?.let { model -> - // we need a copy to avoid memory leak, as model is java rmi proxy object - ideProject.gradleKotlinBuildScripts = copy(model) - } - } - } - - override fun requiresTaskRunning() = true -} \ No newline at end of file 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 9ba493c350c..0fe429786b3 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 @@ -7,65 +7,36 @@ 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.Pair -import com.intellij.util.Consumer import org.gradle.tooling.model.idea.IdeaProject -import org.gradle.tooling.model.kotlin.dsl.KotlinDslModelsParameters.* import org.gradle.tooling.model.kotlin.dsl.KotlinDslScriptsModel import org.jetbrains.kotlin.idea.scripting.gradle.kotlinDslScriptsModelImportSupported -import org.jetbrains.kotlin.idea.scripting.gradle.minimal_gradle_version_supported -import org.jetbrains.plugins.gradle.model.ProjectImportModelProvider -import org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension -class KotlinDslScriptModelResolver : AbstractProjectResolverExtension() { - override fun getExtraProjectModelClasses(): Set> { - return setOf(KotlinDslScriptsModel::class.java) - } - - override fun getExtraJvmArgs(): List> { - return listOf( - Pair( - "-D$PROVIDER_MODE_SYSTEM_PROPERTY_NAME", - STRICT_CLASSPATH_MODE_SYSTEM_PROPERTY_VALUE - ) - ) - } - - override fun enhanceTaskProcessing(taskNames: MutableList, jvmParametersSetup: String?, initScriptConsumer: Consumer) { - initScriptConsumer.consume( - "if (org.gradle.util.GradleVersion.current() >= org.gradle.util.GradleVersion.version(\"$minimal_gradle_version_supported\")) startParameter.taskNames += [\"${PREPARATION_TASK_NAME}\"]" - ) - } - - override fun getModelProvider(): ProjectImportModelProvider { - return KotlinDslScriptModelProvider() - } +class KotlinDslScriptModelResolver : KotlinDslScriptModelResolverCommon() { + override fun getModelProvider() = KotlinDslScriptModelProvider() + override fun requiresTaskRunning() = true override fun populateProjectExtraModels(gradleProject: IdeaProject, ideProject: DataNode) { super.populateProjectExtraModels(gradleProject, ideProject) if (kotlinDslScriptsModelImportSupported(resolverCtx.projectGradleVersion)) { - pupulateBuildModels(gradleProject, ideProject) + populateBuildModels(gradleProject, ideProject) resolverCtx.models.includedBuilds.forEach { includedRoot -> - pupulateBuildModels(includedRoot, ideProject) + populateBuildModels(includedRoot, ideProject) } } } - private fun pupulateBuildModels( + private fun populateBuildModels( root: IdeaProject, ideProject: DataNode ) { root.modules.forEach { if (it.gradleProject.parent == null) { resolverCtx.getExtraProject(it, KotlinDslScriptsModel::class.java)?.let { model -> - // we need a copy to avoid memory leak, as model is java rmi proxy object - ideProject.KOTLIN_DSL_SCRIPT_IDEA_MODELS.addAll(copy(model)) + ideProject.KOTLIN_DSL_SCRIPT_MODELS.addAll(model.toListOfScriptModels()) } } } } - - override fun requiresTaskRunning() = true } \ No newline at end of file diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.191 b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt.191 similarity index 81% rename from idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.191 rename to idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt.191 index 964be1fd91f..f5df22edccc 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.191 +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt.191 @@ -3,6 +3,6 @@ * 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.configuration +package org.jetbrains.kotlin.idea.configuration.importing class KotlinGradleBuildScriptsResolver \ No newline at end of file diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt.193 b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt.193 new file mode 100644 index 00000000000..bf3e89c476a --- /dev/null +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt.193 @@ -0,0 +1,44 @@ +/* + * 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.externalSystem.model.DataNode +import com.intellij.openapi.externalSystem.model.project.ProjectData +import org.gradle.tooling.model.GradleProject +import org.gradle.tooling.model.idea.IdeaProject +import org.gradle.tooling.model.kotlin.dsl.KotlinDslScriptsModel +import org.jetbrains.kotlin.idea.scripting.gradle.kotlinDslScriptsModelImportSupported +import org.jetbrains.plugins.gradle.model.Build + +class KotlinDslScriptModelResolver : KotlinDslScriptModelResolverCommon() { + override fun getModelProvider() = KotlinDslScriptModelProvider() + override fun requiresTaskRunning() = true + + override fun populateProjectExtraModels(gradleProject: IdeaProject, ideProject: DataNode) { + super.populateProjectExtraModels(gradleProject, ideProject) + + if (kotlinDslScriptsModelImportSupported(resolverCtx.projectGradleVersion)) { + populateBuildModels(resolverCtx.models.mainBuild, ideProject) + + resolverCtx.models.includedBuilds.forEach { includedRoot -> + populateBuildModels(includedRoot, ideProject) + } + } + } + + private fun populateBuildModels( + root: Build, + ideProject: DataNode + ) { + root.projects.forEach { + if ((it as? GradleProject)?.parent == null) { + resolverCtx.models.getModel(it, KotlinDslScriptsModel::class.java)?.let { model -> + ideProject.KOTLIN_DSL_SCRIPT_MODELS.addAll(model.toListOfScriptModels()) + } + } + } + } +} \ No newline at end of file diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt.as36 b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt.as36 new file mode 100644 index 00000000000..5f422832a17 --- /dev/null +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolver.kt.as36 @@ -0,0 +1,43 @@ +/* + * 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.configuration.importing + +import org.jetbrains.kotlin.idea.scripting.gradle.importing.KotlinDslScriptModelProvider +import com.intellij.openapi.externalSystem.model.DataNode +import com.intellij.openapi.externalSystem.model.project.ProjectData +import org.gradle.tooling.model.idea.IdeaProject +import org.gradle.tooling.model.kotlin.dsl.KotlinDslScriptsModel +import org.jetbrains.kotlin.idea.scripting.gradle.kotlinDslScriptsModelImportSupported + +class KotlinDslScriptModelResolver : KotlinDslScriptModelResolverCommon() { + override fun getModelProvider() = KotlinDslScriptModelProvider() + override fun requiresTaskRunning() = true + + override fun populateProjectExtraModels(gradleProject: IdeaProject, ideProject: DataNode) { + super.populateProjectExtraModels(gradleProject, ideProject) + + if (kotlinDslScriptsModelImportSupported(resolverCtx.projectGradleVersion)) { + populateBuildModels(gradleProject, ideProject) + + resolverCtx.models.includedBuilds.forEach { includedRoot -> + populateBuildModels(includedRoot, ideProject) + } + } + } + + private fun populateBuildModels( + root: IdeaProject, + ideProject: DataNode + ) { + root.modules.forEach { + if (it.gradleProject.parent == null) { + resolverCtx.getExtraProject(it, KotlinDslScriptsModel::class.java)?.let { model -> + ideProject.KOTLIN_DSL_SCRIPT_MODELS.addAll(model.toListOfScriptModels()) + } + } + } + } +} \ 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 new file mode 100644 index 00000000000..86ed8605119 --- /dev/null +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/scripting/gradle/importing/KotlinDslScriptModelResolverCommon.kt @@ -0,0 +1,72 @@ +/* + * 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.util.Pair +import com.intellij.util.Consumer +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.scripting.gradle.minimal_gradle_version_supported +import org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension + +abstract class KotlinDslScriptModelResolverCommon : AbstractProjectResolverExtension() { + override fun getExtraProjectModelClasses(): Set> { + return setOf(KotlinDslScriptsModel::class.java) + } + + override fun getExtraJvmArgs(): List> { + return listOf( + Pair( + "-D$PROVIDER_MODE_SYSTEM_PROPERTY_NAME", + STRICT_CLASSPATH_MODE_SYSTEM_PROPERTY_VALUE + ) + ) + } + + override fun enhanceTaskProcessing(taskNames: MutableList, jvmParametersSetup: String?, initScriptConsumer: Consumer) { + initScriptConsumer.consume( + "if (org.gradle.util.GradleVersion.current() >= org.gradle.util.GradleVersion.version(\"$minimal_gradle_version_supported\")) startParameter.taskNames += [\"${PREPARATION_TASK_NAME}\"]" + ) + } + + @Suppress("unused") + protected fun KotlinDslScriptsModel.toListOfScriptModels(): List = + scriptModels.map { (file, model) -> + val messages = mutableListOf() + + model.exceptions.forEach { + messages.add( + KotlinDslScriptModel.Message( + KotlinDslScriptModel.Severity.ERROR, it + ) + ) + } + + model.editorReports.forEach { + messages.add( + KotlinDslScriptModel.Message( + when (it.severity) { + EditorReportSeverity.WARNING -> KotlinDslScriptModel.Severity.WARNING + else -> KotlinDslScriptModel.Severity.ERROR + }, + it.message, + it.position?.let { position -> + KotlinDslScriptModel + .Position(position.line, position.column) + } + )) + } + + KotlinDslScriptModel( + file.absolutePath, + model.classPath.map { it.absolutePath }, + model.sourcePath.map { it.absolutePath }, + model.implicitImports, + messages + ) + } +} \ No newline at end of file