From f5465aa11f92e72a0c3c1dc5cd168dc64a2247b8 Mon Sep 17 00:00:00 2001 From: Louis Vignier Date: Thu, 27 Jun 2024 15:37:42 +0200 Subject: [PATCH] [jdk] Detect JDKs installed by Homebrew #IDEA-327641 Fixed GitOrigin-RevId: 685b6e4280f988d5e5864dd00b9df42534886b7f --- .../projectRoots/impl/JavaHomeFinderMac.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/JavaHomeFinderMac.java b/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/JavaHomeFinderMac.java index 1bf0eb6a31cc..dd789d03d38f 100644 --- a/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/JavaHomeFinderMac.java +++ b/platform/lang-impl/src/com/intellij/openapi/projectRoots/impl/JavaHomeFinderMac.java @@ -7,9 +7,14 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; +import java.io.IOException; +import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; +import java.util.function.Consumer; +import java.util.stream.Collectors; +import java.util.stream.Stream; public class JavaHomeFinderMac extends JavaHomeFinderBasic { public static final String JAVA_HOME_FIND_UTIL = "/usr/libexec/java_home"; @@ -28,6 +33,7 @@ public class JavaHomeFinderMac extends JavaHomeFinderBasic { roots.forEach(root -> { result.addAll(scanAll(root.resolve("System/Library/Java/JavaVirtualMachines"), true)); }); + result.addAll(findJavaInstalledByBrew()); return result; }); @@ -78,4 +84,42 @@ public class JavaHomeFinderMac extends JavaHomeFinderBasic { return result; } + + private static void processSubfolders(@Nullable Path dir, Consumer processor) { + if (dir == null || !Files.isDirectory(dir) || Files.isSymbolicLink(dir)) { return; } + try (Stream files = Files.list(dir)) { + files.forEach(candidate -> { + if (Files.isDirectory(candidate)) { + processor.accept(candidate); + } + }); + } catch (IOException ignore) {} + } + + /** + * Finds directories for JDKs installed by homebrew. + */ + private @NotNull Set findJavaInstalledByBrew() { + var found = new HashSet(); + var paths = List.of("/opt/homebrew/Cellar/", "/usr/homebrew/Cellar/"); + for (String path : paths) { + Path parentFolder = getPathInUserHome(path); + // JDKs installed by Homebrew can be hidden in `libexec` + processSubfolders(parentFolder, formula -> { + processSubfolders(formula, version -> { + processSubfolders(version, subFolder -> { + if (subFolder.getFileName().toString().equals("libexec")) { + found.addAll( + scanAll(subFolder, true).stream() + .filter(jdkPath -> !Files.isSymbolicLink(Path.of(jdkPath))) + .collect(Collectors.toSet()) + ); + } + }); + }); + }); + } + + return found; + } }