in java/com/google/devtools/bazel/e4b/command/BazelCommand.java [293:348]
public List<String> complete(String string)
throws IOException, InterruptedException, BazelNotFoundException {
if (string.equals("/") || string.isEmpty()) {
return ImmutableList.of("//");
} else if (string.contains(":")) {
// complete targets using `bazel query`
int idx = string.indexOf(':');
final String packageName = string.substring(0, idx);
final String targetPrefix = string.substring(idx + 1);
ImmutableList.Builder<String> builder = ImmutableList.builder();
builder.addAll(
BazelCommand.this.runBazelAndGetOuputLines(ConsoleType.NO_CONSOLE, workspaceRoot,
ImmutableList.<String>builder().add("query", packageName + ":*").build(), line -> {
int i = line.indexOf(':');
String s = line.substring(i + 1);
return !s.isEmpty() && s.startsWith(targetPrefix) ? (packageName + ":" + s)
: null;
}));
if ("all".startsWith(targetPrefix)) {
builder.add(packageName + ":all");
}
if ("*".startsWith(targetPrefix)) {
builder.add(packageName + ":*");
}
return builder.build();
} else {
// complete packages
int lastSlash = string.lastIndexOf('/');
final String prefix = lastSlash > 0 ? string.substring(0, lastSlash + 1) : "";
final String suffix = lastSlash > 0 ? string.substring(lastSlash + 1) : string;
final String directory = (prefix.isEmpty() || prefix.equals("//")) ? ""
: prefix.substring(string.startsWith("//") ? 2 : 0, prefix.length() - 1);
File file = directory.isEmpty() ? workspaceRoot : new File(workspaceRoot, directory);
ImmutableList.Builder<String> builder = ImmutableList.builder();
File[] files = file.listFiles((f) -> {
// Only give directories whose name starts with suffix...
return f.getName().startsWith(suffix) && f.isDirectory()
// ...that does not start with '.'...
&& !f.getName().startsWith(".")
// ...and is not a Bazel convenience link
&& (!file.equals(workspaceRoot) || !f.getName().startsWith("bazel-"));
});
if (files != null) {
for (File d : files) {
builder.add(prefix + d.getName() + "/");
if (new File(d, "BUILD").exists()) {
builder.add(prefix + d.getName() + ":");
}
}
}
if ("...".startsWith(suffix)) {
builder.add(prefix + "...");
}
return builder.build();
}
}