@@ -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" );
0 commit comments