From adfa469b2112eacda6bf7a992008e8cf7c80e69c Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Tue, 17 Jul 2018 16:25:43 +0300 Subject: [PATCH] Maven inspection for incompatible coroutines libraries (KT-25251) #KT-25251 In Progress --- ...eKotlinxCoroutinesDeprecationInspection.kt | 37 +------- .../MavenCoroutinesDeprecationInspection.kt | 67 ++++++++++++++ .../KotlinMavenInspectionTestGenerated.java | 5 ++ .../deprecatedKotlinxCoroutines.xml | 89 +++++++++++++++++++ .../MavenCoroutinesDeprecation.html | 5 ++ idea/src/META-INF/maven.xml | 9 ++ .../migration/coroutinesObsoleteLibraries.kt | 44 +++++++++ 7 files changed, 221 insertions(+), 35 deletions(-) create mode 100644 idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/inspections/MavenCoroutinesDeprecationInspection.kt create mode 100644 idea/idea-maven/testData/maven-inspections/deprecatedKotlinxCoroutines.xml create mode 100644 idea/resources/inspectionDescriptions/MavenCoroutinesDeprecation.html create mode 100644 idea/src/org/jetbrains/kotlin/idea/inspections/migration/coroutinesObsoleteLibraries.kt diff --git a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/inspections/gradle/GradleKotlinxCoroutinesDeprecationInspection.kt b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/inspections/gradle/GradleKotlinxCoroutinesDeprecationInspection.kt index 007376bbbfd..7501090d456 100644 --- a/idea/idea-gradle/src/org/jetbrains/kotlin/idea/inspections/gradle/GradleKotlinxCoroutinesDeprecationInspection.kt +++ b/idea/idea-gradle/src/org/jetbrains/kotlin/idea/inspections/gradle/GradleKotlinxCoroutinesDeprecationInspection.kt @@ -13,6 +13,8 @@ import com.intellij.psi.PsiFile import org.jetbrains.kotlin.config.LanguageVersion import org.jetbrains.kotlin.idea.configuration.getWholeModuleGroup import org.jetbrains.kotlin.idea.inspections.gradle.GradleHeuristicHelper.PRODUCTION_DEPENDENCY_STATEMENTS +import org.jetbrains.kotlin.idea.inspections.migration.DEPRECATED_COROUTINES_LIBRARIES_INFORMATION +import org.jetbrains.kotlin.idea.inspections.migration.DeprecatedForKotlinLibInfo import org.jetbrains.kotlin.idea.project.languageVersionSettings import org.jetbrains.kotlin.idea.versions.LibInfo import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType @@ -24,41 +26,6 @@ import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.path.GrC private val LibInfo.gradleMarker get() = "$groupId:$name:" -private data class DeprecatedForKotlinLibInfo( - val lib: LibInfo, - val sinceKotlinLanguageVersion: LanguageVersion, - val message: String -) - -@Suppress("SpellCheckingInspection") -private fun kotlinxCoroutinesDeprecation(name: String): org.jetbrains.kotlin.idea.inspections.gradle.DeprecatedForKotlinLibInfo { - return DeprecatedForKotlinLibInfo( - lib = LibInfo("org.jetbrains.kotlinx", name), - sinceKotlinLanguageVersion = LanguageVersion.KOTLIN_1_3, - message = "Library should be updated to be compatible with Kotlin 1.3" - ) -} - -@Suppress("SpellCheckingInspection") -private val DEPRECATED_COROUTINES_LIBRARIES_INFORMATION = listOf( - kotlinxCoroutinesDeprecation("kotlinx-coroutines"), - kotlinxCoroutinesDeprecation("kotlinx-coroutines-android"), - kotlinxCoroutinesDeprecation("kotlinx-coroutines-core"), - kotlinxCoroutinesDeprecation("kotlinx-coroutines-core-common"), - kotlinxCoroutinesDeprecation("kotlinx-coroutines-core-js"), - kotlinxCoroutinesDeprecation("kotlinx-coroutines-guava"), - kotlinxCoroutinesDeprecation("kotlinx-coroutines-io"), - kotlinxCoroutinesDeprecation("kotlinx-coroutines-javafx"), - kotlinxCoroutinesDeprecation("kotlinx-coroutines-jdk8"), - kotlinxCoroutinesDeprecation("kotlinx-coroutines-nio"), - kotlinxCoroutinesDeprecation("kotlinx-coroutines-quasar"), - kotlinxCoroutinesDeprecation("kotlinx-coroutines-reactive"), - kotlinxCoroutinesDeprecation("kotlinx-coroutines-reactor"), - kotlinxCoroutinesDeprecation("kotlinx-coroutines-rx1"), - kotlinxCoroutinesDeprecation("kotlinx-coroutines-rx2"), - kotlinxCoroutinesDeprecation("kotlinx-coroutines-swing") -) - @Suppress("SpellCheckingInspection") class GradleKotlinxCoroutinesDeprecationInspection : GradleBaseInspection(), CleanupLocalInspectionTool { override fun buildVisitor(): BaseInspectionVisitor = DependencyFinder() diff --git a/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/inspections/MavenCoroutinesDeprecationInspection.kt b/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/inspections/MavenCoroutinesDeprecationInspection.kt new file mode 100644 index 00000000000..3f6bc90d671 --- /dev/null +++ b/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/inspections/MavenCoroutinesDeprecationInspection.kt @@ -0,0 +1,67 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. 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.maven.inspections + +import com.intellij.codeInspection.CleanupLocalInspectionTool +import com.intellij.codeInspection.ProblemHighlightType +import com.intellij.openapi.module.Module +import com.intellij.util.xml.DomFileElement +import com.intellij.util.xml.highlighting.DomElementAnnotationHolder +import com.intellij.util.xml.highlighting.DomElementsInspection +import org.jetbrains.idea.maven.dom.model.MavenDomProjectModel +import org.jetbrains.idea.maven.model.MavenId +import org.jetbrains.kotlin.config.LanguageVersion +import org.jetbrains.kotlin.idea.configuration.getWholeModuleGroup +import org.jetbrains.kotlin.idea.inspections.migration.DEPRECATED_COROUTINES_LIBRARIES_INFORMATION +import org.jetbrains.kotlin.idea.maven.PomFile +import org.jetbrains.kotlin.idea.maven.findDependencies +import org.jetbrains.kotlin.idea.project.languageVersionSettings + +class MavenCoroutinesDeprecationInspection : + DomElementsInspection(MavenDomProjectModel::class.java), CleanupLocalInspectionTool { + + override fun checkFileElement(domFileElement: DomFileElement?, holder: DomElementAnnotationHolder?) { + if (domFileElement == null || holder == null) return + + val file = domFileElement.file + val module = domFileElement.module ?: return + + val pomFile = PomFile.forFileOrNull(file) ?: return + + for (libInfo in DEPRECATED_COROUTINES_LIBRARIES_INFORMATION) { + if (!checkKotlinVersion(module, libInfo.sinceKotlinLanguageVersion)) { + // Same result will be for all invocations in this file, so exit + return + } + + val libMavenId = MavenId(libInfo.lib.groupId, libInfo.lib.name, null) + + val moduleDependencies = pomFile.findDependencies(libMavenId) + val dependencyManagementDependencies = pomFile.domModel.dependencyManagement.dependencies.findDependencies(libMavenId) + + for (dependency in moduleDependencies + dependencyManagementDependencies) { + val xmlElement = dependency.version.xmlElement + if (xmlElement != null) { + holder.createProblem( + dependency.version, + ProblemHighlightType.GENERIC_ERROR_OR_WARNING, + libInfo.message, + null + ) + } + } + } + } + + companion object { + private fun checkKotlinVersion(module: Module, languageVersion: LanguageVersion): Boolean { + val moduleGroup = module.getWholeModuleGroup() + return moduleGroup.sourceRootModules.any { moduleInGroup -> + moduleInGroup.languageVersionSettings.languageVersion >= languageVersion + } + } + } +} \ No newline at end of file diff --git a/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/KotlinMavenInspectionTestGenerated.java b/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/KotlinMavenInspectionTestGenerated.java index 675abd1c237..9f3f54ebfff 100644 --- a/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/KotlinMavenInspectionTestGenerated.java +++ b/idea/idea-maven/test/org/jetbrains/kotlin/idea/maven/KotlinMavenInspectionTestGenerated.java @@ -49,6 +49,11 @@ public class KotlinMavenInspectionTestGenerated extends AbstractKotlinMavenInspe runTest("idea/idea-maven/testData/maven-inspections/deprecatedJreWithDependencyManagement.xml"); } + @TestMetadata("deprecatedKotlinxCoroutines.xml") + public void testDeprecatedKotlinxCoroutines() throws Exception { + runTest("idea/idea-maven/testData/maven-inspections/deprecatedKotlinxCoroutines.xml"); + } + @TestMetadata("ideAndMavenVersions.xml") public void testIdeAndMavenVersions() throws Exception { runTest("idea/idea-maven/testData/maven-inspections/ideAndMavenVersions.xml"); diff --git a/idea/idea-maven/testData/maven-inspections/deprecatedKotlinxCoroutines.xml b/idea/idea-maven/testData/maven-inspections/deprecatedKotlinxCoroutines.xml new file mode 100644 index 00000000000..0155d5e07d8 --- /dev/null +++ b/idea/idea-maven/testData/maven-inspections/deprecatedKotlinxCoroutines.xml @@ -0,0 +1,89 @@ + + + 4.0.0 + + maventest + maventest + 1.0-SNAPSHOT + + + 1.2.0 + 1.3 + + + + + org.jetbrains.kotlin + kotlin-stdlib-jdk7 + ${kotlin.version} + + + org.jetbrains.kotlinx + kotlinx-coroutines-android + 0.23.4 + + + + + + + false + + bintray-kotlin-kotlin-eap + bintray + https://dl.bintray.com/kotlin/kotlin-eap + + + + false + + bintray-kotlin-kotlinx + bintray + https://kotlin.bintray.com/kotlinx + + + + + + false + + bintray-kotlin-kotlin-eap + bintray-plugins + https://dl.bintray.com/kotlin/kotlin-eap + + + + + + + org.jetbrains.kotlin + kotlin-maven-plugin + ${kotlin.version} + + + compile + compile + + compile + + + + test-compile + test-compile + + test-compile + + + + + 1.8 + + + + + + + + \ No newline at end of file diff --git a/idea/resources/inspectionDescriptions/MavenCoroutinesDeprecation.html b/idea/resources/inspectionDescriptions/MavenCoroutinesDeprecation.html new file mode 100644 index 00000000000..3928553fc04 --- /dev/null +++ b/idea/resources/inspectionDescriptions/MavenCoroutinesDeprecation.html @@ -0,0 +1,5 @@ + + +This inspection reports libraries dependencies in Maven that should be updated in order to be compatible with Kotlin 1.3+. + + \ No newline at end of file diff --git a/idea/src/META-INF/maven.xml b/idea/src/META-INF/maven.xml index c691675b64b..e35a48f21d8 100644 --- a/idea/src/META-INF/maven.xml +++ b/idea/src/META-INF/maven.xml @@ -78,6 +78,15 @@ hasStaticDescription="true" level="WARNING" /> + + org.jetbrains.kotlin.idea.maven.actions.MavenPluginSourcesMoveToBuild Kotlin diff --git a/idea/src/org/jetbrains/kotlin/idea/inspections/migration/coroutinesObsoleteLibraries.kt b/idea/src/org/jetbrains/kotlin/idea/inspections/migration/coroutinesObsoleteLibraries.kt new file mode 100644 index 00000000000..d424b6d3110 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/inspections/migration/coroutinesObsoleteLibraries.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2010-2018 JetBrains s.r.o. 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.inspections.migration + +import org.jetbrains.kotlin.config.LanguageVersion +import org.jetbrains.kotlin.idea.versions.LibInfo + +data class DeprecatedForKotlinLibInfo( + val lib: LibInfo, + val sinceKotlinLanguageVersion: LanguageVersion, + val message: String +) + +@Suppress("SpellCheckingInspection") +private fun kotlinxCoroutinesDeprecation(name: String): DeprecatedForKotlinLibInfo { + return DeprecatedForKotlinLibInfo( + lib = LibInfo("org.jetbrains.kotlinx", name), + sinceKotlinLanguageVersion = LanguageVersion.KOTLIN_1_3, + message = "Library should be updated to be compatible with Kotlin 1.3" + ) +} + +@Suppress("SpellCheckingInspection") +val DEPRECATED_COROUTINES_LIBRARIES_INFORMATION = listOf( + kotlinxCoroutinesDeprecation("kotlinx-coroutines"), + kotlinxCoroutinesDeprecation("kotlinx-coroutines-android"), + kotlinxCoroutinesDeprecation("kotlinx-coroutines-core"), + kotlinxCoroutinesDeprecation("kotlinx-coroutines-core-common"), + kotlinxCoroutinesDeprecation("kotlinx-coroutines-core-js"), + kotlinxCoroutinesDeprecation("kotlinx-coroutines-guava"), + kotlinxCoroutinesDeprecation("kotlinx-coroutines-io"), + kotlinxCoroutinesDeprecation("kotlinx-coroutines-javafx"), + kotlinxCoroutinesDeprecation("kotlinx-coroutines-jdk8"), + kotlinxCoroutinesDeprecation("kotlinx-coroutines-nio"), + kotlinxCoroutinesDeprecation("kotlinx-coroutines-quasar"), + kotlinxCoroutinesDeprecation("kotlinx-coroutines-reactive"), + kotlinxCoroutinesDeprecation("kotlinx-coroutines-reactor"), + kotlinxCoroutinesDeprecation("kotlinx-coroutines-rx1"), + kotlinxCoroutinesDeprecation("kotlinx-coroutines-rx2"), + kotlinxCoroutinesDeprecation("kotlinx-coroutines-swing") +) \ No newline at end of file