Skip to content

Commit 337fa07

Browse files
committed
Cherry pick some changes from georgewfraser#111
1 parent a9ec8da commit 337fa07

File tree

2 files changed

+40
-22
lines changed

2 files changed

+40
-22
lines changed

src/main/java/org/javacs/InferConfig.java

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -70,13 +70,23 @@ Set<Path> classPath() {
7070
}
7171

7272
// Bazel
73-
if (Files.exists(workspaceRoot.resolve("WORKSPACE"))) {
74-
return bazelClasspath();
73+
var bazelWorkspaceRoot = bazelWorkspaceRoot();
74+
if (Files.exists(bazelWorkspaceRoot.resolve("WORKSPACE"))) {
75+
return bazelClasspath(bazelWorkspaceRoot);
7576
}
7677

7778
return Collections.emptySet();
7879
}
7980

81+
private Path bazelWorkspaceRoot() {
82+
for (var current = workspaceRoot; current != null; current = current.getParent()) {
83+
if (Files.exists(current.resolve("WORKSPACE"))) {
84+
return current;
85+
}
86+
}
87+
return workspaceRoot;
88+
}
89+
8090
/** Find source .jar files in local maven repository. */
8191
Set<Path> buildDocPath() {
8292
// externalDependencies
@@ -101,8 +111,9 @@ Set<Path> buildDocPath() {
101111
}
102112

103113
// Bazel
104-
if (Files.exists(workspaceRoot.resolve("WORKSPACE"))) {
105-
return bazelSourcepath();
114+
var bazelWorkspaceRoot = bazelWorkspaceRoot();
115+
if (Files.exists(bazelWorkspaceRoot.resolve("WORKSPACE"))) {
116+
return bazelSourcepath(bazelWorkspaceRoot);
106117
}
107118

108119
return Collections.emptySet();
@@ -237,29 +248,29 @@ private static String findExecutableOnPath(String name) {
237248
return null;
238249
}
239250

240-
private Set<Path> bazelClasspath() {
251+
private Set<Path> bazelClasspath(Path bazelWorkspaceRoot) {
241252
var absolute = new HashSet<Path>();
242-
for (var relative : bazelAQuery("Javac", "--classpath")) {
243-
absolute.add(workspaceRoot.resolve(relative));
253+
for (var relative : bazelAQuery(bazelWorkspaceRoot, "Javac", "--classpath")) {
254+
absolute.add(bazelWorkspaceRoot.resolve(relative));
244255
}
245256
return absolute;
246257
}
247258

248-
private Set<Path> bazelSourcepath() {
259+
private Set<Path> bazelSourcepath(Path bazelWorkspaceRoot) {
249260
var absolute = new HashSet<Path>();
250-
var outputBase = bazelOutputBase();
251-
for (var relative : bazelAQuery("JavaSourceJar", "--sources")) {
261+
var outputBase = bazelOutputBase(bazelWorkspaceRoot);
262+
for (var relative : bazelAQuery(bazelWorkspaceRoot, "JavaSourceJar", "--sources")) {
252263
absolute.add(outputBase.resolve(relative));
253264
}
254265
return absolute;
255266
}
256267

257-
private Path bazelOutputBase() {
268+
private Path bazelOutputBase(Path bazelWorkspaceRoot) {
258269
// Run bazel as a subprocess
259270
String[] command = {
260271
"bazel", "info", "output_base",
261272
};
262-
var output = fork(command);
273+
var output = fork(bazelWorkspaceRoot, command);
263274
if (output == NOT_FOUND) {
264275
return NOT_FOUND;
265276
}
@@ -272,7 +283,7 @@ private Path bazelOutputBase() {
272283
}
273284
}
274285

275-
private Set<String> bazelAQuery(String filterMnemonic, String filterArgument) {
286+
private Set<String> bazelAQuery(Path bazelWorkspaceRoot, String filterMnemonic, String filterArgument) {
276287
String[] command = {
277288
"bazel",
278289
"aquery",
@@ -281,7 +292,7 @@ private Set<String> bazelAQuery(String filterMnemonic, String filterArgument) {
281292
+ filterMnemonic
282293
+ ", kind(java_library, ...) union kind(java_test, ...) union kind(java_binary, ...))"
283294
};
284-
var output = fork(command);
295+
var output = fork(bazelWorkspaceRoot, command);
285296
if (output == NOT_FOUND) {
286297
return Set.of();
287298
}
@@ -328,7 +339,7 @@ private Set<String> readActionGraph(Path output, String filterArgument) {
328339
}
329340
}
330341

331-
private Path fork(String[] command) {
342+
private static Path fork(Path workspaceRoot, String[] command) {
332343
try {
333344
LOG.info("Running " + String.join(" ", command) + " ...");
334345
var output = Files.createTempFile("java-language-server-bazel-output", ".proto");

src/test/java/org/javacs/InferBazelConfigTest.java

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,31 @@
33
import static org.hamcrest.Matchers.*;
44
import static org.junit.Assert.*;
55

6-
import java.nio.file.Path;
76
import java.nio.file.Paths;
8-
import java.util.Collections;
97
import org.junit.Test;
108

119
public class InferBazelConfigTest {
12-
13-
private Path bazelWorkspace = Paths.get("src/test/examples/bazel-project");
14-
private InferConfig bazel =
15-
new InferConfig(bazelWorkspace, Collections.emptySet(), Paths.get("nowhere"), Paths.get("nowhere"));
16-
1710
@Test
1811
public void bazelClassPath() {
12+
var bazel = new InferConfig(Paths.get("src/test/examples/bazel-project"));
13+
assertThat(bazel.classPath(), contains(hasToString(endsWith("guava-18.0-ijar.jar"))));
14+
}
15+
16+
@Test
17+
public void bazelClassPathInSubdir() {
18+
var bazel = new InferConfig(Paths.get("src/test/examples/bazel-project/hello"));
1919
assertThat(bazel.classPath(), contains(hasToString(endsWith("guava-18.0-ijar.jar"))));
2020
}
2121

2222
@Test
2323
public void bazelDocPath() {
24+
var bazel = new InferConfig(Paths.get("src/test/examples/bazel-project"));
25+
assertThat(bazel.buildDocPath(), contains(hasToString(endsWith("guava-18.0-sources.jar"))));
26+
}
27+
28+
@Test
29+
public void bazelDocPathInSubdir() {
30+
var bazel = new InferConfig(Paths.get("src/test/examples/bazel-project/hello"));
2431
assertThat(bazel.buildDocPath(), contains(hasToString(endsWith("guava-18.0-sources.jar"))));
2532
}
2633
}

0 commit comments

Comments
 (0)