From 9f3c2d029298c1bb1b24a8b8da1b1025a9550dac Mon Sep 17 00:00:00 2001 From: Sergey Rostov Date: Fri, 9 Aug 2019 18:33:28 +0300 Subject: [PATCH] build.gradle.kts: import script dependencies on Gradle Project sync --- idea/idea-gradle-tooling-api/build.gradle.kts | 13 + .../model/kotlin/dsl/EditorPosition.java | 33 + .../model/kotlin/dsl/EditorReport.java | 34 + .../kotlin/dsl/EditorReportSeverity.java | 31 + .../kotlin/dsl/KotlinDslModelsParameters.java | 43 + .../kotlin/dsl/KotlinDslScriptModel.java | 42 + .../kotlin/dsl/KotlinDslScriptsModel.java | 64 ++ idea/idea-gradle/build.gradle.kts | 1 + .../KotlinDslScriptModelProvider.kt | 33 + .../KotlinGradleBuildScriptsDataService.kt | 138 +++ .../KotlinGradleBuildScriptsResolver.kt | 104 ++ idea/resources/META-INF/gradle-java.xml | 1 + idea/resources/META-INF/gradle.xml | 1 + license/README.md | 8 +- license/third_party/gradle_license.txt | 420 ++++++++ .../third_party/testdata/gradle_license.txt | 964 ------------------ prepare/idea-plugin/build.gradle.kts | 1 + settings.gradle | 1 + 18 files changed, 966 insertions(+), 966 deletions(-) create mode 100644 idea/idea-gradle-tooling-api/build.gradle.kts create mode 100644 idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/EditorPosition.java create mode 100644 idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/EditorReport.java create mode 100644 idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/EditorReportSeverity.java create mode 100644 idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/KotlinDslModelsParameters.java create mode 100644 idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/KotlinDslScriptModel.java create mode 100644 idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/KotlinDslScriptsModel.java create mode 100644 idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinDslScriptModelProvider.kt create mode 100644 idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleBuildScriptsDataService.kt create mode 100644 idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleBuildScriptsResolver.kt create mode 100644 license/third_party/gradle_license.txt delete mode 100644 license/third_party/testdata/gradle_license.txt diff --git a/idea/idea-gradle-tooling-api/build.gradle.kts b/idea/idea-gradle-tooling-api/build.gradle.kts new file mode 100644 index 00000000000..95187e8f889 --- /dev/null +++ b/idea/idea-gradle-tooling-api/build.gradle.kts @@ -0,0 +1,13 @@ +plugins { + kotlin("jvm") + id("jps-compatible") +} + +dependencies { + compileOnly(intellijPluginDep("gradle")) +} + +sourceSets { + "main" { projectDefault() } + "test" { projectDefault() } +} \ No newline at end of file diff --git a/idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/EditorPosition.java b/idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/EditorPosition.java new file mode 100644 index 00000000000..d94fed03bd7 --- /dev/null +++ b/idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/EditorPosition.java @@ -0,0 +1,33 @@ +/* + * Copyright 2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.gradle.tooling.model.kotlin.dsl; + +import org.gradle.api.Incubating; + + +/** + * Position in the editor. + * + * @since 6.0 + */ +@Incubating +public interface EditorPosition { + + int getLine(); + + int getColumn(); +} diff --git a/idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/EditorReport.java b/idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/EditorReport.java new file mode 100644 index 00000000000..b531d2a8646 --- /dev/null +++ b/idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/EditorReport.java @@ -0,0 +1,34 @@ +/* + * Copyright 2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.gradle.tooling.model.kotlin.dsl; + +import org.gradle.api.Incubating; + +/** + * Report to the editor. + * + * @since 6.0 + */ +@Incubating +public interface EditorReport { + + EditorReportSeverity getSeverity(); + + String getMessage(); + + EditorPosition getPosition(); +} diff --git a/idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/EditorReportSeverity.java b/idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/EditorReportSeverity.java new file mode 100644 index 00000000000..0e0997a14e6 --- /dev/null +++ b/idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/EditorReportSeverity.java @@ -0,0 +1,31 @@ +/* + * Copyright 2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.gradle.tooling.model.kotlin.dsl; + + +import org.gradle.api.Incubating; + +/** + * Severity of an editor report. + * + * @since 6.0 + */ +@Incubating +public enum EditorReportSeverity { + WARNING, + ERROR +} diff --git a/idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/KotlinDslModelsParameters.java b/idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/KotlinDslModelsParameters.java new file mode 100644 index 00000000000..460f3b344ac --- /dev/null +++ b/idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/KotlinDslModelsParameters.java @@ -0,0 +1,43 @@ +/* + * Copyright 2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.gradle.tooling.model.kotlin.dsl; + +import org.gradle.api.Incubating; + + +/** + * Parameters for Kotlin DSL models. + * + * @since 6.0 + */ +@Incubating +public final class KotlinDslModelsParameters { + + public static final String PREPARATION_TASK_NAME = "prepareKotlinBuildScriptModel"; + + public static final String CORRELATION_ID_GRADLE_PROPERTY_NAME = "org.gradle.kotlin.dsl.provider.cid"; + + public static final String PROVIDER_MODE_SYSTEM_PROPERTY_NAME = "org.gradle.kotlin.dsl.provider.mode"; + + public static final String CLASSPATH_MODE_SYSTEM_PROPERTY_VALUE = "classpath"; + + public static final String STRICT_CLASSPATH_MODE_SYSTEM_PROPERTY_VALUE = "strict-classpath"; + + public static final String CLASSPATH_MODE_SYSTEM_PROPERTY_DECLARATION = "-D" + PROVIDER_MODE_SYSTEM_PROPERTY_NAME + "=" + CLASSPATH_MODE_SYSTEM_PROPERTY_VALUE; + + public static final String STRICT_CLASSPATH_MODE_SYSTEM_PROPERTY_DECLARATION = "-D" + PROVIDER_MODE_SYSTEM_PROPERTY_NAME + "=" + STRICT_CLASSPATH_MODE_SYSTEM_PROPERTY_VALUE; +} diff --git a/idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/KotlinDslScriptModel.java b/idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/KotlinDslScriptModel.java new file mode 100644 index 00000000000..17e1abfee9b --- /dev/null +++ b/idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/KotlinDslScriptModel.java @@ -0,0 +1,42 @@ +/* + * Copyright 2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.gradle.tooling.model.kotlin.dsl; + +import org.gradle.api.Incubating; + +import java.io.File; +import java.util.List; + + +/** + * Model for a Kotlin DSL script. + * + * @since 6.0 + */ +@Incubating +public interface KotlinDslScriptModel { + + List getClassPath(); + + List getSourcePath(); + + List getImplicitImports(); + + List getEditorReports(); + + List getExceptions(); +} diff --git a/idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/KotlinDslScriptsModel.java b/idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/KotlinDslScriptsModel.java new file mode 100644 index 00000000000..f444988ddb4 --- /dev/null +++ b/idea/idea-gradle-tooling-api/src/org/gradle/tooling/model/kotlin/dsl/KotlinDslScriptsModel.java @@ -0,0 +1,64 @@ +/* + * Copyright 2019 the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.gradle.tooling.model.kotlin.dsl; + +import org.gradle.api.Incubating; + +import java.io.File; +import java.util.Map; + + +/** + * Editor model for a set of Kotlin DSL scripts. + * + * Can only be requested on the root project, the builder will throw otherwise. + * + * Requires the prepareKotlinBuildScriptModel task to be executed before building the model. + * See {@link KotlinDslModelsParameters#PREPARATION_TASK_NAME} + * + * The set of scripts can be provided as a Gradle property named org.gradle.kotlin.dsl.provider.scripts, + * as a list of absolute paths separated by |. + * If none are provided, then the model is built for all the Kotlin DSL scripts known to belong to this build. + * See {@link KotlinDslScriptsModel#SCRIPTS_GRADLE_PROPERTY_NAME}. + * + * The Gradle Kotlin DSL script provider must be running in "classpath" mode. + * This is done by providing the system property -Dorg.gradle.kotlin.dsl.provider.mode=classpath. + * See {@link KotlinDslModelsParameters#CLASSPATH_MODE_SYSTEM_PROPERTY_DECLARATION}. + * In this mode, Gradle Kotlin DSL scripts compilation or evaluation failures will be ignored, collected and + * exceptions will be returned in the built model. + * Optionally, it can also be set in a strict mode by providing the system property value -Dorg.gradle.kotlin.dsl.provider.mode=strict-classpath. + * See {@link KotlinDslModelsParameters#STRICT_CLASSPATH_MODE_SYSTEM_PROPERTY_DECLARATION}. + * + * Optionally, an identifier can be provided as a Gradle property named org.gradle.kotlin.dsl.provider.cid, + * it can then be used to correlate Gradle and TAPI client log statements. + * See {@link KotlinDslModelsParameters#CORRELATION_ID_GRADLE_PROPERTY_NAME}. + * + * @since 6.0 + */ +@Incubating +public interface KotlinDslScriptsModel { + + /** + * Gradle property name for the set of scripts to be queried for. + */ + String SCRIPTS_GRADLE_PROPERTY_NAME = "org.gradle.tooling.model.kotlin.dsl.scripts"; + + /** + * Script models by file. + */ + Map getScriptModels(); +} diff --git a/idea/idea-gradle/build.gradle.kts b/idea/idea-gradle/build.gradle.kts index da36a506231..77eeaab9964 100644 --- a/idea/idea-gradle/build.gradle.kts +++ b/idea/idea-gradle/build.gradle.kts @@ -10,6 +10,7 @@ dependencies { compileOnly(project(":idea:idea-jvm")) compileOnly(project(":idea:idea-native")) { isTransitive = false } compile(project(":idea:kotlin-gradle-tooling")) + compile(project(":idea:idea-gradle-tooling-api")) compile(project(":compiler:frontend")) compile(project(":compiler:frontend.java")) diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinDslScriptModelProvider.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinDslScriptModelProvider.kt new file mode 100644 index 00000000000..f0334f74583 --- /dev/null +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinDslScriptModelProvider.kt @@ -0,0 +1,33 @@ +/* + * 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 org.gradle.tooling.BuildController +import org.gradle.tooling.model.idea.IdeaModule +import org.gradle.tooling.model.idea.IdeaProject +import org.gradle.tooling.model.kotlin.dsl.KotlinDslScriptsModel +import org.jetbrains.plugins.gradle.model.ProjectImportExtraModelProvider + +class KotlinDslScriptModelProvider : ProjectImportExtraModelProvider { + private val kotlinDslScriptModelClass: Class<*> = KotlinDslScriptsModel::class.java + + override fun populateBuildModels( + controller: BuildController, + project: IdeaProject, + consumer: ProjectImportExtraModelProvider.BuildModelConsumer + ) { + val model = controller.findModel(kotlinDslScriptModelClass) + if (model != null) { + consumer.consume(null, model, kotlinDslScriptModelClass) + } + } + + override fun populateProjectModels( + controller: BuildController, + module: IdeaModule?, + modelConsumer: ProjectImportExtraModelProvider.ProjectModelConsumer + ) = Unit +} \ No newline at end of file diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleBuildScriptsDataService.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleBuildScriptsDataService.kt new file mode 100644 index 00000000000..cfb1a6da6f3 --- /dev/null +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleBuildScriptsDataService.kt @@ -0,0 +1,138 @@ +/* + * 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.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.core.script.ScriptConfigurationManager +import org.jetbrains.kotlin.scripting.definitions.findScriptDefinition +import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationResult +import org.jetbrains.kotlin.scripting.resolve.ScriptCompilationConfigurationWrapper +import org.jetbrains.kotlin.scripting.resolve.VirtualFileScriptSource +import org.jetbrains.kotlin.utils.addToStdlib.firstNotNullResult +import org.jetbrains.plugins.gradle.model.data.GradleSourceSetData +import org.jetbrains.plugins.gradle.settings.GradleExecutionSettings +import org.jetbrains.plugins.gradle.util.GradleConstants +import java.io.File +import kotlin.script.experimental.api.ResultWithDiagnostics +import kotlin.script.experimental.dependencies.ScriptDependencies + +class KotlinGradleBuildScriptsDataService : AbstractProjectDataService() { + override fun getTargetDataKey(): Key = GradleSourceSetData.KEY + + override fun onSuccessImport( + imported: MutableCollection>, + projectData: ProjectData?, + project: Project, + modelsProvider: IdeModelsProvider + ) { + super.onSuccessImport(imported, projectData, project, modelsProvider) + + val projectDataNode = imported.firstNotNullResult { ExternalSystemApiUtil.findParent(it, ProjectKeys.PROJECT) } ?: return + + val gradleSettings = ExternalSystemApiUtil.getSettings(project, GradleConstants.SYSTEM_ID) + val projectSettings = gradleSettings.getLinkedProjectSettings(projectData?.linkedExternalProjectPath ?: return) ?: return + val gradleExeSettings = ExternalSystemApiUtil.getExecutionSettings( + project, + projectSettings.externalProjectPath, + GradleConstants.SYSTEM_ID + ) + val javaHome = File(gradleExeSettings.javaHome ?: return) + + val files = mutableListOf>() + + projectDataNode.gradleKotlinBuildScripts?.forEach { buildScript -> + val scriptFile = File(buildScript.file) + val virtualFile = VfsUtil.findFile(scriptFile.toPath(), true)!! + + files.add( + Pair( + virtualFile, + ResultWithDiagnostics.Success( + ScriptCompilationConfigurationWrapper.FromLegacy( + VirtualFileScriptSource(virtualFile), + ScriptDependencies( + javaHome = javaHome, + classpath = buildScript.classPath.map { File(it) }, + sources = buildScript.sourcePath.map { File(it) }, + imports = buildScript.imports + ), + virtualFile.findScriptDefinition(project) + ) + ) + ) + ) + + buildScript.messages.forEach { + addBuildScriptDiagnosticMessage(it, virtualFile, project) + } + } + + project.service().saveCompilationConfigurationAfterImport(files) + } + + private fun addBuildScriptDiagnosticMessage( + it: GradleKotlinBuildScriptData.Message, + virtualFile: VirtualFile, + project: Project + ) { + val notification = + NotificationData( + "Kotlin Build Script", + it.text, + when (it.severity) { + GradleKotlinBuildScriptData.Severity.WARNING -> NotificationCategory.WARNING + GradleKotlinBuildScriptData.Severity.ERROR -> NotificationCategory.ERROR + }, + NotificationSource.PROJECT_SYNC + ) + + notification.navigatable = LazyNavigatable( + virtualFile, + project, + it.position + ) + + ExternalSystemNotificationManager.getInstance(project).showNotification( + GradleConstants.SYSTEM_ID, + notification + ) + } + + class LazyNavigatable internal constructor( + private val virtualFile: VirtualFile, + private val project: Project, + val position: GradleKotlinBuildScriptData.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() + } +} \ No newline at end of file diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleBuildScriptsResolver.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleBuildScriptsResolver.kt new file mode 100644 index 00000000000..4c4cefb75bf --- /dev/null +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/configuration/KotlinGradleBuildScriptsResolver.kt @@ -0,0 +1,104 @@ +/* + * 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.Key +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.EditorReportSeverity +import org.gradle.tooling.model.kotlin.dsl.KotlinDslScriptsModel +import org.jetbrains.kotlin.idea.util.NotNullableCopyableDataNodeUserDataProperty +import org.jetbrains.plugins.gradle.model.ProjectImportExtraModelProvider +import org.jetbrains.plugins.gradle.service.project.AbstractProjectResolverExtension + +data class GradleKotlinBuildScriptData( + 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 } +} + +var DataNode.gradleKotlinBuildScripts + by NotNullableCopyableDataNodeUserDataProperty( + Key.create>("GRADLE_KOTLIN_BUILD_SCRIPTS"), + emptyList() + ) + +class KotlinGradleBuildScriptsResolver : AbstractProjectResolverExtension() { + override fun getExtraProjectModelClasses(): Set> { + return setOf(KotlinDslScriptsModel::class.java) + } + + override fun getExtraJvmArgs(): List> { + return listOf(Pair("-Dorg.gradle.kotlin.dsl.provider.mode", "strict-classpath")) + } + + override fun enhanceTaskProcessing(taskNames: MutableList, jvmParametersSetup: String?, initScriptConsumer: Consumer) { + initScriptConsumer.consume("startParameter.taskNames += [\"prepareKotlinBuildScriptModel\"]") + } + + override fun getExtraModelProvider(): ProjectImportExtraModelProvider { + return KotlinDslScriptModelProvider() + } + + override fun populateProjectExtraModels(gradleProject: IdeaProject, ideProject: DataNode) { + super.populateProjectExtraModels(gradleProject, ideProject) + + 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 + + fun copy(model: KotlinDslScriptsModel): List { + return model.scriptModels.map { (file, model) -> + val messages = mutableListOf() + + model.exceptions.forEach { + messages.add( + GradleKotlinBuildScriptData.Message(GradleKotlinBuildScriptData.Severity.ERROR, it) + ) + } + + model.editorReports.forEach { + messages.add(GradleKotlinBuildScriptData.Message( + when (it.severity) { + EditorReportSeverity.WARNING -> GradleKotlinBuildScriptData.Severity.WARNING + else -> GradleKotlinBuildScriptData.Severity.ERROR + }, + it.message, + it.position?.let { position -> + GradleKotlinBuildScriptData.Position(position.line, position.column) + } + )) + } + + GradleKotlinBuildScriptData( + 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/resources/META-INF/gradle-java.xml b/idea/resources/META-INF/gradle-java.xml index d41fdd9ad2f..c704fac765b 100644 --- a/idea/resources/META-INF/gradle-java.xml +++ b/idea/resources/META-INF/gradle-java.xml @@ -9,6 +9,7 @@ + diff --git a/idea/resources/META-INF/gradle.xml b/idea/resources/META-INF/gradle.xml index 025b6755fbd..51ec0075aa3 100644 --- a/idea/resources/META-INF/gradle.xml +++ b/idea/resources/META-INF/gradle.xml @@ -23,6 +23,7 @@ + - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! diff --git a/prepare/idea-plugin/build.gradle.kts b/prepare/idea-plugin/build.gradle.kts index bae961ca6cb..4056a020ceb 100644 --- a/prepare/idea-plugin/build.gradle.kts +++ b/prepare/idea-plugin/build.gradle.kts @@ -151,6 +151,7 @@ dependencies { gradleToolingModel(project(":plugins:android-extensions-ide")) { isTransitive = false } gradleToolingModel(project(":noarg-ide-plugin")) { isTransitive = false } gradleToolingModel(project(":allopen-ide-plugin")) { isTransitive = false } + gradleToolingModel(project(":idea:idea-gradle-tooling-api")) { isTransitive = false } jpsPlugin(project(":kotlin-jps-plugin")) { isTransitive = false } diff --git a/settings.gradle b/settings.gradle index b636f6ccbf8..1d9804ccf30 100644 --- a/settings.gradle +++ b/settings.gradle @@ -102,6 +102,7 @@ include ":kotlin-build-common", ":idea:idea-jvm", ":idea:idea-maven", ":idea:idea-gradle", + ":idea:idea-gradle-tooling-api", ":idea:idea-git", ":idea:idea-jps-common", ":idea:formatter",