From bfb069b0c5c73bf2c65393a8e09fe9bd056d5506 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Wed, 22 Nov 2017 15:24:41 +0300 Subject: [PATCH] Warning and quick fix for using jre-artifacts in Maven (KT-20947) #KT-20947 In Progress --- .../DeprecatedMavenDependencyInspection.kt | 63 ++++++++++++++ .../KotlinMavenInspectionTestGenerated.java | 12 +++ .../deprecatedJre.fixed.1.xml | 83 +++++++++++++++++++ .../maven-inspections/deprecatedJre.xml | 83 +++++++++++++++++++ .../maven-inspections/oldVersionWithJre.xml | 61 ++++++++++++++ .../DeprecatedMavenDependency.html | 5 ++ idea/src/META-INF/maven.xml | 8 ++ 7 files changed, 315 insertions(+) create mode 100644 idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/inspections/DeprecatedMavenDependencyInspection.kt create mode 100644 idea/idea-maven/testData/maven-inspections/deprecatedJre.fixed.1.xml create mode 100644 idea/idea-maven/testData/maven-inspections/deprecatedJre.xml create mode 100644 idea/idea-maven/testData/maven-inspections/oldVersionWithJre.xml create mode 100644 idea/resources/inspectionDescriptions/DeprecatedMavenDependency.html diff --git a/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/inspections/DeprecatedMavenDependencyInspection.kt b/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/inspections/DeprecatedMavenDependencyInspection.kt new file mode 100644 index 00000000000..2153e2b9411 --- /dev/null +++ b/idea/idea-maven/src/org/jetbrains/kotlin/idea/maven/inspections/DeprecatedMavenDependencyInspection.kt @@ -0,0 +1,63 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * 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.jetbrains.kotlin.idea.maven.inspections + +import com.intellij.codeInspection.ProblemHighlightType +import com.intellij.util.text.VersionComparatorUtil +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.idea.maven.project.MavenProjectsManager +import org.jetbrains.kotlin.idea.inspections.ReplaceStringInDocumentFix +import org.jetbrains.kotlin.idea.maven.PomFile +import org.jetbrains.kotlin.idea.versions.DEPRECATED_LIBRARIES_INFORMATION + +class DeprecatedMavenDependencyInspection : DomElementsInspection(MavenDomProjectModel::class.java) { + override fun checkFileElement(domFileElement: DomFileElement?, holder: DomElementAnnotationHolder?) { + if (domFileElement == null || holder == null) return + + val file = domFileElement.file + val module = domFileElement.module ?: return + val manager = MavenProjectsManager.getInstance(module.project) ?: return + val project = manager.findProject(module) ?: return + + val pomFile = PomFile.forFileOrNull(file) ?: return + + for (libInfo in DEPRECATED_LIBRARIES_INFORMATION) { + pomFile.findDependencies(MavenId(libInfo.old.groupId, libInfo.old.name, null)) + .filter { it.version?.stringValue != null } + .filter { + val libVersion = project.findDependencies(libInfo.old.groupId, libInfo.old.name).map { it.version }.distinct().singleOrNull() + libVersion != null && VersionComparatorUtil.COMPARATOR.compare(libVersion, libInfo.outdatedAfterVersion) >= 0 + } + .forEach { dependency -> + val xmlElement = dependency.artifactId.xmlElement + if (xmlElement != null) { + val fix = ReplaceStringInDocumentFix(xmlElement, libInfo.old.name, libInfo.new.name) + + holder.createProblem(dependency.artifactId, + ProblemHighlightType.LIKE_DEPRECATED, + libInfo.message, + null, + fix) + } + } + } + } +} \ 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 42d163d28fc..b440e845a02 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 @@ -48,6 +48,12 @@ public class KotlinMavenInspectionTestGenerated extends AbstractKotlinMavenInspe doTest(fileName); } + @TestMetadata("deprecatedJre.xml") + public void testDeprecatedJre() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-maven/testData/maven-inspections/deprecatedJre.xml"); + doTest(fileName); + } + @TestMetadata("ideAndMavenVersions.xml") public void testIdeAndMavenVersions() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/idea-maven/testData/maven-inspections/ideAndMavenVersions.xml"); @@ -78,6 +84,12 @@ public class KotlinMavenInspectionTestGenerated extends AbstractKotlinMavenInspe doTest(fileName); } + @TestMetadata("oldVersionWithJre.xml") + public void testOldVersionWithJre() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/idea-maven/testData/maven-inspections/oldVersionWithJre.xml"); + doTest(fileName); + } + @TestMetadata("sameVersionPluginLibrary.xml") public void testSameVersionPluginLibrary() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/idea-maven/testData/maven-inspections/sameVersionPluginLibrary.xml"); diff --git a/idea/idea-maven/testData/maven-inspections/deprecatedJre.fixed.1.xml b/idea/idea-maven/testData/maven-inspections/deprecatedJre.fixed.1.xml new file mode 100644 index 00000000000..7734d42d7aa --- /dev/null +++ b/idea/idea-maven/testData/maven-inspections/deprecatedJre.fixed.1.xml @@ -0,0 +1,83 @@ + + + 4.0.0 + + maventest + maventest + 1.0-SNAPSHOT + + + 1.2.0 + + + + + org.jetbrains.kotlin + kotlin-stdlib-jdk7 + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-test + ${kotlin.version} + test + + + + + + + false + + bintray-kotlin-kotlin-eap + bintray + https://dl.bintray.com/kotlin/kotlin-eap + + + + + + 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/idea-maven/testData/maven-inspections/deprecatedJre.xml b/idea/idea-maven/testData/maven-inspections/deprecatedJre.xml new file mode 100644 index 00000000000..2a1ba49b659 --- /dev/null +++ b/idea/idea-maven/testData/maven-inspections/deprecatedJre.xml @@ -0,0 +1,83 @@ + + + 4.0.0 + + maventest + maventest + 1.0-SNAPSHOT + + + 1.2.0 + + + + + org.jetbrains.kotlin + kotlin-stdlib-jre7 + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-test + ${kotlin.version} + test + + + + + + + false + + bintray-kotlin-kotlin-eap + bintray + https://dl.bintray.com/kotlin/kotlin-eap + + + + + + 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/idea-maven/testData/maven-inspections/oldVersionWithJre.xml b/idea/idea-maven/testData/maven-inspections/oldVersionWithJre.xml new file mode 100644 index 00000000000..e92f2982f1e --- /dev/null +++ b/idea/idea-maven/testData/maven-inspections/oldVersionWithJre.xml @@ -0,0 +1,61 @@ + + + 4.0.0 + + maventest + maventest + 1.0-SNAPSHOT + + + 1.1.60 + + + + + org.jetbrains.kotlin + kotlin-stdlib-jre7 + ${kotlin.version} + + + org.jetbrains.kotlin + kotlin-test + ${kotlin.version} + test + + + + + + + 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/DeprecatedMavenDependency.html b/idea/resources/inspectionDescriptions/DeprecatedMavenDependency.html new file mode 100644 index 00000000000..017d9c085f4 --- /dev/null +++ b/idea/resources/inspectionDescriptions/DeprecatedMavenDependency.html @@ -0,0 +1,5 @@ + + +This inspection reports that some deprecated dependency is used in Maven. + + \ No newline at end of file diff --git a/idea/src/META-INF/maven.xml b/idea/src/META-INF/maven.xml index b89ce698b44..06d0408aff5 100644 --- a/idea/src/META-INF/maven.xml +++ b/idea/src/META-INF/maven.xml @@ -69,6 +69,14 @@ hasStaticDescription="true" level="WARNING" /> + + org.jetbrains.kotlin.idea.maven.actions.MavenPluginSourcesMoveToBuild Kotlin