Skip to content

Commit

Permalink
[hotfix] fixed extraction of java version and java home for bazel `5.…
Browse files Browse the repository at this point in the history
…0.0` (#165)

* aspects fix

* aspects fix 2

* fix 3

* google style

* changelog
  • Loading branch information
abrams27 committed Feb 23, 2022
1 parent d4ac0f6 commit e6062ca
Show file tree
Hide file tree
Showing 5 changed files with 42 additions and 8 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

### Fixes 🛠️

- Fixed extraction of java version and java home for bazel `5.0.0`.
| [#165](https://github.com/JetBrains/bazel-bsp/pull/165)
- Log messages are no longer trimmed.
| [#157](https://github.com/JetBrains/bazel-bsp/pull/157)
- Memoize BazelProcess output so that it doesn't get lost.
Expand Down
12 changes: 10 additions & 2 deletions install/src/main/java/org/jetbrains/bsp/bazel/install/aspects.bzl
Original file line number Diff line number Diff line change
Expand Up @@ -61,15 +61,23 @@ fetch_cpp_compiler = aspect(
)

def _fetch_java_target_version(target, ctx):
if hasattr(ctx.rule.attr, "target_version"):
print(ctx.rule.attr.target_version)
print(target[java_common.JavaToolchainInfo].target_version)
return []

fetch_java_target_version = aspect(
implementation = _fetch_java_target_version,
attr_aspects = ["_java_toolchain"],
)

def _fetch_java_target_home(target, ctx):
print(target[java_common.JavaRuntimeInfo].java_home)
return []

fetch_java_target_home = aspect(
implementation = _fetch_java_target_home,
attr_aspects = ["_java_toolchain"],
)

def _get_target_info(ctx, field_name):
fields = getattr(ctx.rule.attr, field_name, [])
fields = [ctx.expand_location(field) for field in fields]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,8 @@ public void startServer(BspIntegrationData bspIntegrationData) {
bazelBspCompilationManager, bazelRunner, internalAspectsResolver);
BazelCppTargetManager bazelCppTargetManager = new BazelCppTargetManager(bazelBspAspectsManager);
BazelBspTargetManager bazelBspTargetManager =
new BazelBspTargetManager(bazelRunner, bazelBspAspectsManager, bazelCppTargetManager);
new BazelBspTargetManager(
bazelRunner, bazelData, bazelBspAspectsManager, bazelCppTargetManager);
BazelBspQueryManager bazelBspQueryManager =
new BazelBspQueryManager(
bazelBspServerConfig.getProjectView(), bazelData, bazelRunner, bazelBspTargetManager);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,31 +8,45 @@
import java.util.function.Supplier;
import org.jetbrains.bsp.bazel.bazelrunner.BazelProcess;
import org.jetbrains.bsp.bazel.bazelrunner.BazelRunner;
import org.jetbrains.bsp.bazel.bazelrunner.data.BazelData;
import org.jetbrains.bsp.bazel.bazelrunner.params.BazelRunnerFlag;
import org.jetbrains.bsp.bazel.commons.Lazy;
import org.jetbrains.bsp.bazel.commons.Uri;
import org.jetbrains.bsp.bazel.server.bsp.resolvers.QueryResolver;

public class BazelBspJvmTargetManager extends Lazy<String> {
public static final String FETCH_JAVA_VERSION_ASPECT = "fetch_java_target_version";
public static final String FETCH_JAVA_HOME_ASPECT = "fetch_java_target_home";
public static final String BAZEL_JDK_CURRENT_JAVA_TOOLCHAIN =
"@bazel_tools//tools/jdk:current_java_toolchain";
public static final String BAZEL_JDK_CURRENT_JAVA_RUNTIME =
"@bazel_tools//tools/jdk:current_java_runtime";
private final BazelRunner bazelRunner;
private final BazelData bazelData;
private final BazelBspAspectsManager bazelBspAspectsManager;

public BazelBspJvmTargetManager(
BazelRunner bazelRunner, BazelBspAspectsManager bazelBspAspectsManager) {
BazelRunner bazelRunner, BazelData bazelData, BazelBspAspectsManager bazelBspAspectsManager) {
this.bazelRunner = bazelRunner;
this.bazelData = bazelData;
this.bazelBspAspectsManager = bazelBspAspectsManager;
}

public JvmBuildTarget getJVMBuildTarget(Build.Rule rule) {
Optional<String> javaHomePath = getJavaPath(rule);
Optional<String> javaVersion = getJavaVersion();
Optional<String> javaHomePath = getJavaHomePath(rule);
return new JvmBuildTarget(javaHomePath.orElse(null), javaVersion.orElse(null));
}

private Optional<String> getJavaPath(Build.Rule rule) {
private Optional<String> getJavaHomePath(Build.Rule rule) {
if (bazelData.getVersion().getMajorVersion() < 5) {
return getJavaPathForBazelLessThan5(rule);
}

return getJavaPathForBazel5();
}

private Optional<String> getJavaPathForBazelLessThan5(Build.Rule rule) {
List<String> traversingPath = Lists.newArrayList("$jvm", "$java_runtime", ":alias", "actual");

return traverseDependency(rule, traversingPath)
Expand All @@ -41,6 +55,13 @@ private Optional<String> getJavaPath(Build.Rule rule) {
.map(path -> Uri.fromAbsolutePath(path).toString());
}

private Optional<String> getJavaPathForBazel5() {
return bazelBspAspectsManager
.fetchLinesFromAspect(BAZEL_JDK_CURRENT_JAVA_RUNTIME, FETCH_JAVA_HOME_ASPECT)
.findFirst()
.map(path -> Uri.fromExecPath("exec-root://" + path, bazelData.getExecRoot()).toString());
}

private Optional<Build.Rule> traverseDependency(
Build.Rule startingRule, List<String> attributesToTraverse) {
Build.Rule currentRule = startingRule;
Expand All @@ -55,7 +76,7 @@ private Optional<Build.Rule> traverseDependency(
.flatMap(this::getTargetFromAttribute)
.map(Build.Target::getRule);

if (!rule.isPresent()) {
if (rule.isEmpty()) {
return Optional.empty();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import java.util.Optional;
import java.util.Set;
import org.jetbrains.bsp.bazel.bazelrunner.BazelRunner;
import org.jetbrains.bsp.bazel.bazelrunner.data.BazelData;
import org.jetbrains.bsp.bazel.commons.Constants;
import org.jetbrains.bsp.bazel.server.bsp.utils.BuildManagerParsingUtils;

Expand All @@ -18,12 +19,13 @@ public class BazelBspTargetManager {

public BazelBspTargetManager(
BazelRunner bazelRunner,
BazelData bazelData,
BazelBspAspectsManager bazelBspAspectsManager,
BazelCppTargetManager bazelCppTargetManager) {
this.bazelBspScalaTargetManager = new BazelBspScalaTargetManager(bazelBspAspectsManager);
this.bazelCppTargetManager = bazelCppTargetManager;
this.bazelBspJvmTargetManager =
new BazelBspJvmTargetManager(bazelRunner, bazelBspAspectsManager);
new BazelBspJvmTargetManager(bazelRunner, bazelData, bazelBspAspectsManager);
}

private Optional<ScalaBuildTarget> getScalaBuildTarget(Build.Rule rule) {
Expand Down

0 comments on commit e6062ca

Please sign in to comment.