From c82a647af1db84df514d92753af82d10d6680b7d Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Wed, 10 May 2017 18:29:26 +0200 Subject: [PATCH] [java] improves JDK version detection (IDEA-172477) --- .../openapi/projectRoots/JavaSdkVersion.java | 44 ++++++++++++++----- .../projectRoots/JavaSdkVersionTest.java | 17 ++++++- 2 files changed, 47 insertions(+), 14 deletions(-) diff --git a/java/java-psi-api/src/com/intellij/openapi/projectRoots/JavaSdkVersion.java b/java/java-psi-api/src/com/intellij/openapi/projectRoots/JavaSdkVersion.java index 1bb0e76ed7d6..57f50ce4d114 100644 --- a/java/java-psi-api/src/com/intellij/openapi/projectRoots/JavaSdkVersion.java +++ b/java/java-psi-api/src/com/intellij/openapi/projectRoots/JavaSdkVersion.java @@ -15,11 +15,15 @@ */ package com.intellij.openapi.projectRoots; +import com.intellij.openapi.util.Version; import com.intellij.pom.java.LanguageLevel; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Arrays; +import java.util.regex.Matcher; +import java.util.regex.Pattern; /** * Represents version of Java SDK. Use {@code JavaSdk#getVersion(Sdk)} method to obtain version of an {@code Sdk}. @@ -28,25 +32,29 @@ import java.util.Arrays; * @see LanguageLevel */ public enum JavaSdkVersion { - JDK_1_0(LanguageLevel.JDK_1_3, new String[]{"1.0"}), - JDK_1_1(LanguageLevel.JDK_1_3, new String[]{"1.1"}), - JDK_1_2(LanguageLevel.JDK_1_3, new String[]{"1.2"}), - JDK_1_3(LanguageLevel.JDK_1_3, new String[]{"1.3"}), - JDK_1_4(LanguageLevel.JDK_1_4, new String[]{"1.4"}), - JDK_1_5(LanguageLevel.JDK_1_5, new String[]{"1.5", "5.0"}), - JDK_1_6(LanguageLevel.JDK_1_6, new String[]{"1.6", "6.0"}), - JDK_1_7(LanguageLevel.JDK_1_7, new String[]{"1.7", "7.0"}), - JDK_1_8(LanguageLevel.JDK_1_8, new String[]{"1.8", "8.0"}), - JDK_1_9(LanguageLevel.JDK_1_9, new String[]{"1.9", "9.0", "9-ea"}), - JDK_10(LanguageLevel.JDK_1_9, new String[]{"10.0", "10-ea"}); + JDK_1_0(LanguageLevel.JDK_1_3, 0, new String[]{"1.0"}), + JDK_1_1(LanguageLevel.JDK_1_3, 1, new String[]{"1.1"}), + JDK_1_2(LanguageLevel.JDK_1_3, 2, new String[]{"1.2"}), + JDK_1_3(LanguageLevel.JDK_1_3, 3, new String[]{"1.3"}), + JDK_1_4(LanguageLevel.JDK_1_4, 4, new String[]{"1.4"}), + JDK_1_5(LanguageLevel.JDK_1_5, 5, new String[]{"1.5", "5.0"}), + JDK_1_6(LanguageLevel.JDK_1_6, 6, new String[]{"1.6", "6.0"}), + JDK_1_7(LanguageLevel.JDK_1_7, 7, new String[]{"1.7", "7.0"}), + JDK_1_8(LanguageLevel.JDK_1_8, 8, new String[]{"1.8", "8.0"}), + JDK_1_9(LanguageLevel.JDK_1_9, 9, new String[]{"1.9", "9.0", "9-ea"}), + JDK_10(LanguageLevel.JDK_1_9, 10, new String[]{"10.0", "10-ea"}); private static final JavaSdkVersion MAX_JDK = JDK_1_9; + private static final Pattern JAVA_VERSION = Pattern.compile("java version \"(\\d.*)\""); + private final LanguageLevel myMaxLanguageLevel; + private final int myRelease; private final String[] myVersionStrings; - JavaSdkVersion(@NotNull LanguageLevel maxLanguageLevel, @NotNull String[] description) { + JavaSdkVersion(@NotNull LanguageLevel maxLanguageLevel, int release, @NotNull String[] description) { myMaxLanguageLevel = maxLanguageLevel; + myRelease = release; myVersionStrings = description; } @@ -87,6 +95,17 @@ public enum JavaSdkVersion { @Nullable public static JavaSdkVersion fromVersionString(@NotNull String versionString) { + Matcher matcher = JAVA_VERSION.matcher(versionString.trim()); + if (matcher.matches()) { + versionString = matcher.group(1); + } + + Version parsed = Version.parseVersion(versionString); + if (parsed != null && parsed.major > 0) { + int release = parsed.major == 1 ? parsed.minor : parsed.major; + return ContainerUtil.find(values(), v -> v.myRelease == release); + } + for (JavaSdkVersion version : values()) { for (String pattern : version.myVersionStrings) { if (versionString.contains(pattern)) { @@ -94,6 +113,7 @@ public enum JavaSdkVersion { } } } + return null; } } \ No newline at end of file diff --git a/java/java-tests/testSrc/com/intellij/openapi/projectRoots/JavaSdkVersionTest.java b/java/java-tests/testSrc/com/intellij/openapi/projectRoots/JavaSdkVersionTest.java index 198a7f6571b2..a31d89f93a11 100644 --- a/java/java-tests/testSrc/com/intellij/openapi/projectRoots/JavaSdkVersionTest.java +++ b/java/java-tests/testSrc/com/intellij/openapi/projectRoots/JavaSdkVersionTest.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2015 JetBrains s.r.o. + * Copyright 2000-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. @@ -27,4 +27,17 @@ public class JavaSdkVersionTest { assertEquals(JavaSdkVersion.JDK_1_6, JavaSdkVersion.fromLanguageLevel(LanguageLevel.JDK_1_6)); assertEquals(JavaSdkVersion.JDK_1_8, JavaSdkVersion.fromLanguageLevel(LanguageLevel.JDK_1_8)); } -} + + @Test + public void sdkVersionFromVersionString() { + assertEquals(JavaSdkVersion.JDK_1_8, JavaSdkVersion.fromVersionString("1.8.0_131")); + assertEquals(JavaSdkVersion.JDK_1_9, JavaSdkVersion.fromVersionString("9")); + assertEquals(JavaSdkVersion.JDK_1_9, JavaSdkVersion.fromVersionString("9-ea")); + assertEquals(JavaSdkVersion.JDK_1_9, JavaSdkVersion.fromVersionString("9.1.2")); + + assertEquals(JavaSdkVersion.JDK_1_8, JavaSdkVersion.fromVersionString("java version \"1.8.0_131\"")); + assertEquals(JavaSdkVersion.JDK_1_9, JavaSdkVersion.fromVersionString("java version \"9\"")); + assertEquals(JavaSdkVersion.JDK_1_9, JavaSdkVersion.fromVersionString("java version \"9-ea\"")); + assertEquals(JavaSdkVersion.JDK_1_9, JavaSdkVersion.fromVersionString("java version \"9.1.2\"")); + } +} \ No newline at end of file