diff --git a/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java b/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java index 87f768fa57ae..dc27d8dfc916 100644 --- a/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java +++ b/java/java-impl/src/com/intellij/openapi/projectRoots/impl/JavaSdkImpl.java @@ -148,6 +148,14 @@ public final class JavaSdkImpl extends JavaSdk { }; } + @NotNull + @Override + public Comparator versionStringComparator() { + return (sdk1, sdk2) -> { + return Comparing.compare(getJavaVersion(sdk1), getJavaVersion(sdk2)); + }; + } + @Override public String getBinPath(@NotNull Sdk sdk) { return getConvertedHomePath(sdk) + "bin"; @@ -341,9 +349,17 @@ public final class JavaSdkImpl extends JavaSdk { return version != null ? JavaSdkVersion.fromJavaVersion(version) : null; } - private JavaVersion getJavaVersion(Sdk sdk) { + @Nullable + private JavaVersion getJavaVersion(@NotNull Sdk sdk) { String versionString = sdk.getVersionString(); - return versionString != null ? myCachedVersionStringToJdkVersion.computeIfAbsent(versionString, JavaVersion::tryParse) : null; + return getJavaVersion(versionString); + } + + @Nullable + private JavaVersion getJavaVersion(@Nullable String versionString) { + return versionString != null + ? myCachedVersionStringToJdkVersion.computeIfAbsent(versionString, JavaVersion::tryParse) + : null; } @Override diff --git a/platform/projectModel-api/src/com/intellij/openapi/projectRoots/SdkTypeId.java b/platform/projectModel-api/src/com/intellij/openapi/projectRoots/SdkTypeId.java index 7ef4e3f5c92f..dd1dbe61800e 100644 --- a/platform/projectModel-api/src/com/intellij/openapi/projectRoots/SdkTypeId.java +++ b/platform/projectModel-api/src/com/intellij/openapi/projectRoots/SdkTypeId.java @@ -35,10 +35,22 @@ public interface SdkTypeId { */ @NotNull default Comparator versionComparator() { + Comparator versionStringComparator = versionStringComparator(); return (sdk1, sdk2) -> { assert sdk1.getSdkType() == this : sdk1; assert sdk2.getSdkType() == this : sdk2; - return StringUtil.compareVersionNumbers(sdk1.getVersionString(), sdk2.getVersionString()); + return versionStringComparator.compare(sdk1.getVersionString(), sdk2.getVersionString()); }; } -} \ No newline at end of file + + /** + * A comparator to compare versions of SDKs of that SdkType, e.g. versions from + * {@link Sdk#getVersionString()} or {@link SdkType#getVersionString} + *
+ * The implementation has to be synchronized with {@link #versionComparator()} + */ + @NotNull + default Comparator versionStringComparator() { + return (v1, v2) -> StringUtil.compareVersionNumbers(v1, v2); + } +} diff --git a/python/testSrc/com/jetbrains/python/PythonMockSdk.java b/python/testSrc/com/jetbrains/python/PythonMockSdk.java index 6c151b9ef15d..df59537ecd4f 100644 --- a/python/testSrc/com/jetbrains/python/PythonMockSdk.java +++ b/python/testSrc/com/jetbrains/python/PythonMockSdk.java @@ -99,11 +99,5 @@ public class PythonMockSdk { public boolean isLocalSdk(@NotNull Sdk sdk) { return false; } - - @NotNull - @Override - public Comparator versionComparator() { - return null; - } } }