[java] improves JDK version detection (IDEA-172477)

This commit is contained in:
Roman Shevchenko
2017-05-10 18:29:26 +02:00
parent b1816e9fb2
commit c82a647af1
2 changed files with 47 additions and 14 deletions

View File

@@ -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;
}
}