From b009b9991d5e42a78e75cd8a3efe5d31395d171e Mon Sep 17 00:00:00 2001 From: Chaz Bailey Date: Tue, 3 Mar 2026 17:16:04 +0000 Subject: [PATCH 1/3] Support Bzlmod (MODULE.bazel) and fix compilation error in tests --- scripts/build.sh | 6 +++--- src/main/java/org/javacs/InferConfig.java | 10 +++++++--- src/main/java/org/javacs/JavaLanguageServer.java | 4 +++- src/test/java/org/javacs/HoverTest.java | 7 ++++++- 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/scripts/build.sh b/scripts/build.sh index 1d7177fc..49209fb4 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -20,15 +20,15 @@ fi if [ ! -e dist/windows/bin/java.exe ]; then ./scripts/link_windows.sh fi -if [ ! -e dist/mac/bin/java ]; then - ./scripts/link_mac.sh -fi # Compile sources if [ ! -e src/main/java/com/google/devtools/build/lib/analysis/AnalysisProtos.java ]; then ./scripts/gen_proto.sh fi +export JAVA_HOME=$(pwd)/jdks/linux/jdk-21 +export PATH=$JAVA_HOME/bin:$PATH + mvn package -DskipTests # Build vsix diff --git a/src/main/java/org/javacs/InferConfig.java b/src/main/java/org/javacs/InferConfig.java index 855443c0..80194ce0 100644 --- a/src/main/java/org/javacs/InferConfig.java +++ b/src/main/java/org/javacs/InferConfig.java @@ -100,16 +100,20 @@ Set classPath() { // Bazel var bazelWorkspaceRoot = bazelWorkspaceRoot(); - if (Files.exists(bazelWorkspaceRoot.resolve("WORKSPACE"))) { + if (isBazelProject(bazelWorkspaceRoot)) { return bazelClasspath(bazelWorkspaceRoot); } return Collections.emptySet(); } + private boolean isBazelProject(Path root) { + return Files.exists(root.resolve("WORKSPACE")) || Files.exists(root.resolve("MODULE.bazel")); + } + private Path bazelWorkspaceRoot() { for (var current = workspaceRoot; current != null; current = current.getParent()) { - if (Files.exists(current.resolve("WORKSPACE"))) { + if (isBazelProject(current)) { return current; } } @@ -141,7 +145,7 @@ Set buildDocPath() { // Bazel var bazelWorkspaceRoot = bazelWorkspaceRoot(); - if (Files.exists(bazelWorkspaceRoot.resolve("WORKSPACE"))) { + if (isBazelProject(bazelWorkspaceRoot)) { return bazelSourcepath(bazelWorkspaceRoot); } diff --git a/src/main/java/org/javacs/JavaLanguageServer.java b/src/main/java/org/javacs/JavaLanguageServer.java index e79d83c3..70f5c796 100644 --- a/src/main/java/org/javacs/JavaLanguageServer.java +++ b/src/main/java/org/javacs/JavaLanguageServer.java @@ -210,7 +210,7 @@ public InitializeResult initialize(InitializeParams params) { } private static final String[] watchFiles = { - "**/*.java", "**/pom.xml", "**/BUILD", "**/javaconfig.json", "**/WORKSPACE" + "**/*.java", "**/pom.xml", "**/BUILD", "**/javaconfig.json", "**/WORKSPACE", "**/MODULE.bazel" }; @Override @@ -275,6 +275,8 @@ public void didChangeWatchedFiles(DidChangeWatchedFilesParams params) { switch (name) { case "BUILD": case "pom.xml": + case "WORKSPACE": + case "MODULE.bazel": LOG.info("Compiler needs to be re-created because " + file + " has changed"); modifiedBuild = true; } diff --git a/src/test/java/org/javacs/HoverTest.java b/src/test/java/org/javacs/HoverTest.java index ddd5f0e0..191aa923 100644 --- a/src/test/java/org/javacs/HoverTest.java +++ b/src/test/java/org/javacs/HoverTest.java @@ -3,6 +3,7 @@ import static org.hamcrest.Matchers.*; import static org.hamcrest.MatcherAssert.assertThat; +import java.util.List; import java.util.StringJoiner; import org.javacs.lsp.*; import org.junit.Test; @@ -78,8 +79,12 @@ private String symbolAt(String file, int line, int character) { var pos = new TextDocumentPositionParams( new TextDocumentIdentifier(FindResource.uri(file)), new Position(line - 1, character - 1)); + var hover = server.hover(pos).get(); + if (hover.contents instanceof MarkupContent) { + return ((MarkupContent) hover.contents).value; + } var result = new StringJoiner("\n"); - for (var h : server.hover(pos).get().contents) { + for (var h : (List) hover.contents) { result.add(h.value); } return result.toString(); From af6717bc3c1852ab1e2b6078f7598f2c70c9e872 Mon Sep 17 00:00:00 2001 From: Chaz Bailey Date: Tue, 3 Mar 2026 17:20:38 +0000 Subject: [PATCH 2/3] Add tests for Bzlmod detection and make detection methods package-private --- src/main/java/org/javacs/InferConfig.java | 4 +- .../bazel-bzlmod-project/MODULE.bazel | 0 .../javacs/InferBazelBzlmodConfigTest.java | 43 +++++++++++++++++++ 3 files changed, 45 insertions(+), 2 deletions(-) create mode 100644 src/test/examples/bazel-bzlmod-project/MODULE.bazel create mode 100644 src/test/java/org/javacs/InferBazelBzlmodConfigTest.java diff --git a/src/main/java/org/javacs/InferConfig.java b/src/main/java/org/javacs/InferConfig.java index 80194ce0..0b5bdd4f 100644 --- a/src/main/java/org/javacs/InferConfig.java +++ b/src/main/java/org/javacs/InferConfig.java @@ -107,11 +107,11 @@ Set classPath() { return Collections.emptySet(); } - private boolean isBazelProject(Path root) { + boolean isBazelProject(Path root) { return Files.exists(root.resolve("WORKSPACE")) || Files.exists(root.resolve("MODULE.bazel")); } - private Path bazelWorkspaceRoot() { + Path bazelWorkspaceRoot() { for (var current = workspaceRoot; current != null; current = current.getParent()) { if (isBazelProject(current)) { return current; diff --git a/src/test/examples/bazel-bzlmod-project/MODULE.bazel b/src/test/examples/bazel-bzlmod-project/MODULE.bazel new file mode 100644 index 00000000..e69de29b diff --git a/src/test/java/org/javacs/InferBazelBzlmodConfigTest.java b/src/test/java/org/javacs/InferBazelBzlmodConfigTest.java new file mode 100644 index 00000000..0ce00089 --- /dev/null +++ b/src/test/java/org/javacs/InferBazelBzlmodConfigTest.java @@ -0,0 +1,43 @@ +package org.javacs; + +import static org.hamcrest.Matchers.*; +import static org.hamcrest.MatcherAssert.assertThat; + +import java.nio.file.Paths; +import java.nio.file.Files; +import org.junit.Test; +import org.junit.BeforeClass; +import java.io.IOException; + +public class InferBazelBzlmodConfigTest { + private static final String EXAMPLE_PATH = "src/test/examples/bazel-bzlmod-project"; + + @BeforeClass + public static void setup() throws IOException { + var path = Paths.get(EXAMPLE_PATH); + if (!Files.exists(path)) { + Files.createDirectories(path); + } + var moduleFile = path.resolve("MODULE.bazel"); + if (!Files.exists(moduleFile)) { + Files.createFile(moduleFile); + } + var subDir = path.resolve("subdir"); + if (!Files.exists(subDir)) { + Files.createDirectories(subDir); + } + } + + @Test + public void detectBzlmodRoot() { + var config = new InferConfig(Paths.get(EXAMPLE_PATH)); + assertThat(config.isBazelProject(Paths.get(EXAMPLE_PATH)), is(true)); + assertThat(config.bazelWorkspaceRoot(), equalTo(Paths.get(EXAMPLE_PATH))); + } + + @Test + public void detectBzlmodRootFromSubdir() { + var config = new InferConfig(Paths.get(EXAMPLE_PATH).resolve("subdir")); + assertThat(config.bazelWorkspaceRoot(), equalTo(Paths.get(EXAMPLE_PATH))); + } +} From 85d1ea046b808c2b6ea18e84d386274cec2fb769 Mon Sep 17 00:00:00 2001 From: Chaz Bailey Date: Tue, 3 Mar 2026 20:52:52 +0000 Subject: [PATCH 3/3] Revert unnecessary change in build script --- scripts/build.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/scripts/build.sh b/scripts/build.sh index 49209fb4..8b46281d 100755 --- a/scripts/build.sh +++ b/scripts/build.sh @@ -20,6 +20,9 @@ fi if [ ! -e dist/windows/bin/java.exe ]; then ./scripts/link_windows.sh fi +if [ ! -e dist/mac/bin/java ]; then + ./scripts/link_mac.sh +fi # Compile sources if [ ! -e src/main/java/com/google/devtools/build/lib/analysis/AnalysisProtos.java ]; then