Skip to content
This repository has been archived by the owner on Aug 5, 2024. It is now read-only.

[fix] now sources of thrift dependencies are included as dependencies #202

Merged
merged 11 commits into from
Apr 4, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@

### Fixes 🛠️

- Now sources of thrift dependencies are included as dependencies.
| [#202](https://github.com/JetBrains/bazel-bsp/pull/202)
- Handle the case when there is no JDK in the project.
| [#200](https://github.com/JetBrains/bazel-bsp/pull/200)
- 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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import org.jetbrains.bsp.bazel.server.sync.languages.cpp.CppLanguagePlugin;
import org.jetbrains.bsp.bazel.server.sync.languages.java.JavaLanguagePlugin;
import org.jetbrains.bsp.bazel.server.sync.languages.scala.ScalaLanguagePlugin;
import org.jetbrains.bsp.bazel.server.sync.languages.thrift.ThriftLanguagePlugin;

public class BazelBspServer {

Expand Down Expand Up @@ -66,8 +67,10 @@ public void startServer(BspIntegrationData bspIntegrationData) {
var javaLanguagePlugin = new JavaLanguagePlugin(bazelPathsResolver, bazelInfo);
var scalaLanguagePlugin = new ScalaLanguagePlugin(javaLanguagePlugin, bazelPathsResolver);
var cppLanguagePlugin = new CppLanguagePlugin();
var thriftLanguagePlugin = new ThriftLanguagePlugin(bazelPathsResolver);
var languagePluginsService =
new LanguagePluginsService(scalaLanguagePlugin, javaLanguagePlugin, cppLanguagePlugin);
new LanguagePluginsService(
scalaLanguagePlugin, javaLanguagePlugin, cppLanguagePlugin, thriftLanguagePlugin);
var targetKindResolver = new TargetKindResolver();
var bazelProjectMapper =
new BazelProjectMapper(languagePluginsService, bazelPathsResolver, targetKindResolver);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ java_library(
"//server/src/main/java/org/jetbrains/bsp/bazel/server/bsp/info",
"//server/src/main/java/org/jetbrains/bsp/bazel/server/bsp/managers",
"//server/src/main/java/org/jetbrains/bsp/bazel/server/bsp/utils",
"//server/src/main/java/org/jetbrains/bsp/bazel/server/sync/dependencytree",
"//server/src/main/java/org/jetbrains/bsp/bazel/server/sync/proto:bsp_target_info_java_proto",
"@com_google_protobuf//:protobuf_java",
"@maven//:ch_epfl_scala_bsp4j",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import org.jetbrains.bsp.bazel.info.BspTargetInfo.TargetInfo;
import org.jetbrains.bsp.bazel.projectview.model.ProjectView;
import org.jetbrains.bsp.bazel.server.bsp.utils.SourceRootGuesser;
import org.jetbrains.bsp.bazel.server.sync.dependencytree.DependencyTree;
import org.jetbrains.bsp.bazel.server.sync.languages.LanguageData;
import org.jetbrains.bsp.bazel.server.sync.languages.LanguagePluginsService;
import org.jetbrains.bsp.bazel.server.sync.model.Label;
Expand All @@ -22,7 +23,6 @@
import org.jetbrains.bsp.bazel.server.sync.model.Tag;

public class BazelProjectMapper {

private final LanguagePluginsService languagePluginsService;
private final BazelPathsResolver bazelPathsResolver;
private final TargetKindResolver targetKindResolver;
Expand All @@ -39,8 +39,9 @@ public BazelProjectMapper(
public Project createProject(
Map<String, TargetInfo> targets, Set<String> rootTargets, ProjectView projectView) {
languagePluginsService.prepareSync(targets.values());
var dependencyTree = new DependencyTree(targets, rootTargets);
var targetsToImport = selectTargetsToImport(rootTargets, targets);
var modulesFromBazel = createModules(targetsToImport);
var modulesFromBazel = createModules(targetsToImport, dependencyTree);
var workspaceRoot = bazelPathsResolver.workspaceRoot();
var syntheticModules = createSyntheticModules(modulesFromBazel, workspaceRoot, projectView);
var allModules = modulesFromBazel.appendAll(syntheticModules);
Expand All @@ -55,13 +56,14 @@ private List<TargetInfo> selectTargetsToImport(
return List.ofAll(rootTargets).flatMap(targets::get);
}

private List<Module> createModules(List<TargetInfo> targetsToImport) {
private List<Module> createModules(
List<TargetInfo> targetsToImport, DependencyTree dependencyTree) {
return targetsToImport
.map(this::createModule)
.map(target -> createModule(target, dependencyTree))
.filter(module -> !module.tags().contains(Tag.NO_IDE));
}

private Module createModule(TargetInfo target) {
private Module createModule(TargetInfo target, DependencyTree dependencyTree) {
var label = Label.from(target.getId());
var directDependencies = resolveDirectDependencies(target);
var languages = inferLanguages(target);
Expand All @@ -73,7 +75,7 @@ private Module createModule(TargetInfo target) {
var languagePlugin = languagePluginsService.getPlugin(languages);
var languageData = (Option<LanguageData>) languagePlugin.resolveModule(target);

var sourceDependencies = languagePlugin.dependencySources(target);
var sourceDependencies = languagePlugin.dependencySources(target, dependencyTree);

return new Module(
label,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
load("@rules_java//java:defs.bzl", "java_library")

java_library(
name = "dependencytree",
srcs = glob(["*.java"]),
visibility = ["//visibility:public"],
exports = [
"//server/src/main/java/org/jetbrains/bsp/bazel/server/sync/proto:bsp_target_info_java_proto",
"@com_google_protobuf//:protobuf_java",
"@maven//:io_vavr_vavr",
],
deps = [
"//server/src/main/java/org/jetbrains/bsp/bazel/server/sync/proto:bsp_target_info_java_proto",
"@com_google_protobuf//:protobuf_java",
"@maven//:io_vavr_vavr",
],
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package org.jetbrains.bsp.bazel.server.sync.dependencytree;

import io.vavr.Lazy;
import io.vavr.collection.HashSet;
import io.vavr.collection.Map;
import io.vavr.collection.Set;
import org.jetbrains.bsp.bazel.info.BspTargetInfo.Dependency;
import org.jetbrains.bsp.bazel.info.BspTargetInfo.TargetInfo;

public class DependencyTree {
private final Set<String> rootTargets;
private final Map<String, TargetInfo> idToTargetInfo;
private final Map<String, Lazy<Set<TargetInfo>>> idToLazyTransitiveDependencies;

public DependencyTree(Map<String, TargetInfo> idToTargetInfo, Set<String> rootTargets) {
this.rootTargets = rootTargets;
this.idToTargetInfo = idToTargetInfo;
this.idToLazyTransitiveDependencies = createIdToLazyTransitiveDependenciesMap(idToTargetInfo);
}

private Map<String, Lazy<Set<TargetInfo>>> createIdToLazyTransitiveDependenciesMap(
abrams27 marked this conversation as resolved.
Show resolved Hide resolved
Map<String, TargetInfo> idToTargetInfo) {
return idToTargetInfo.mapValues(this::calculateLazyTransitiveDependenciesForTarget);
}

private Lazy<Set<TargetInfo>> calculateLazyTransitiveDependenciesForTarget(
TargetInfo targetInfo) {
return Lazy.of(() -> calculateTransitiveDependenciesForTarget(targetInfo));
}

private Set<TargetInfo> calculateTransitiveDependenciesForTarget(TargetInfo targetInfo) {
var dependencies = getDependencies(targetInfo);
var strictlyTransitiveDependencies = calculateStrictlyTransitiveDependencies(dependencies);
var directDependencies = calculateDirectDependencies(dependencies);

return strictlyTransitiveDependencies.addAll(directDependencies);
}

private Set<TargetInfo> calculateStrictlyTransitiveDependencies(Set<String> dependencies) {
return dependencies.flatMap(idToLazyTransitiveDependencies::get).flatMap(Lazy::get);
}

private Set<TargetInfo> calculateDirectDependencies(Set<String> dependencies) {
return dependencies.flatMap(idToTargetInfo::get);
}

public Set<TargetInfo> transitiveDependenciesWithoutRootTargets(String targetId) {
abrams27 marked this conversation as resolved.
Show resolved Hide resolved
var target = idToTargetInfo.get(targetId);

return target
.toSet()
.flatMap(this::getDependencies)
.filter(this::isNotARootTarget)
.flatMap(this::collectTransitiveDependenciesAndAddTarget);
}

private Set<String> getDependencies(TargetInfo target) {
return HashSet.ofAll(target.getDependenciesList()).map(Dependency::getId);
}

private boolean isNotARootTarget(String targetId) {
return !rootTargets.contains(targetId);
}

private Set<TargetInfo> collectTransitiveDependenciesAndAddTarget(String targetId) {
var target = idToTargetInfo.get(targetId).toSet();
var dependencies = idToLazyTransitiveDependencies.get(targetId).toSet().flatMap(Lazy::get);

return dependencies.addAll(target);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
import io.vavr.control.Option;
import java.net.URI;
import org.jetbrains.bsp.bazel.info.BspTargetInfo.TargetInfo;
import org.jetbrains.bsp.bazel.server.sync.dependencytree.DependencyTree;

public abstract class LanguagePlugin<T extends LanguageData> {
public void prepareSync(Seq<TargetInfo> targets) {}
Expand All @@ -15,7 +16,7 @@ public Option<T> resolveModule(TargetInfo targetInfo) {
return Option.none();
}

public Set<URI> dependencySources(TargetInfo targetInfo) {
public Set<URI> dependencySources(TargetInfo targetInfo, DependencyTree dependencyTree) {
return HashSet.empty();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,29 +9,34 @@
import org.jetbrains.bsp.bazel.server.sync.languages.java.JavaModule;
import org.jetbrains.bsp.bazel.server.sync.languages.scala.ScalaLanguagePlugin;
import org.jetbrains.bsp.bazel.server.sync.languages.scala.ScalaModule;
import org.jetbrains.bsp.bazel.server.sync.languages.thrift.ThriftLanguagePlugin;
import org.jetbrains.bsp.bazel.server.sync.model.Language;
import org.jetbrains.bsp.bazel.server.sync.model.Module;

public class LanguagePluginsService {
private final ScalaLanguagePlugin scalaLanguagePlugin;
private final JavaLanguagePlugin javaLanguagePlugin;
private final CppLanguagePlugin cppLanguagePlugin;
private final ThriftLanguagePlugin thriftLanguagePlugin;
private final EmptyLanguagePlugin emptyLanguagePlugin;

public LanguagePluginsService(
ScalaLanguagePlugin scalaLanguagePlugin,
JavaLanguagePlugin javaLanguagePlugin,
CppLanguagePlugin cppLanguagePlugin) {
CppLanguagePlugin cppLanguagePlugin,
ThriftLanguagePlugin thriftLanguagePlugin) {
this.scalaLanguagePlugin = scalaLanguagePlugin;
this.javaLanguagePlugin = javaLanguagePlugin;
this.cppLanguagePlugin = cppLanguagePlugin;
this.thriftLanguagePlugin = thriftLanguagePlugin;
this.emptyLanguagePlugin = new EmptyLanguagePlugin();
}

public void prepareSync(Seq<TargetInfo> targetInfos) {
scalaLanguagePlugin.prepareSync(targetInfos);
javaLanguagePlugin.prepareSync(targetInfos);
cppLanguagePlugin.prepareSync(targetInfos);
thriftLanguagePlugin.prepareSync(targetInfos);
}

public LanguagePlugin<?> getPlugin(Set<Language> languages) {
Expand All @@ -41,6 +46,8 @@ public LanguagePlugin<?> getPlugin(Set<Language> languages) {
return javaLanguagePlugin;
} else if (languages.contains(Language.CPP)) {
return cppLanguagePlugin;
} else if (languages.contains(Language.THRIFT)) {
return thriftLanguagePlugin;
} else {
return emptyLanguagePlugin;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import org.jetbrains.bsp.bazel.info.BspTargetInfo.JavaTargetInfo;
import org.jetbrains.bsp.bazel.info.BspTargetInfo.TargetInfo;
import org.jetbrains.bsp.bazel.server.sync.BazelPathsResolver;
import org.jetbrains.bsp.bazel.server.sync.dependencytree.DependencyTree;
import org.jetbrains.bsp.bazel.server.sync.languages.LanguagePlugin;
import org.jetbrains.bsp.bazel.server.sync.model.Module;

Expand Down Expand Up @@ -82,7 +83,7 @@ private List<URI> resolveIdeClasspath(List<URI> runtimeClasspath, List<URI> comp
}

@Override
public Set<URI> dependencySources(TargetInfo targetInfo) {
public Set<URI> dependencySources(TargetInfo targetInfo, DependencyTree dependencyTree) {
if (!targetInfo.hasJavaTargetInfo()) {
return HashSet.empty();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.util.function.BiFunction;
import org.jetbrains.bsp.bazel.info.BspTargetInfo.TargetInfo;
import org.jetbrains.bsp.bazel.server.sync.BazelPathsResolver;
import org.jetbrains.bsp.bazel.server.sync.dependencytree.DependencyTree;
import org.jetbrains.bsp.bazel.server.sync.languages.LanguagePlugin;
import org.jetbrains.bsp.bazel.server.sync.languages.java.JavaLanguagePlugin;
import org.jetbrains.bsp.bazel.server.sync.languages.java.JavaModule;
Expand Down Expand Up @@ -61,8 +62,8 @@ private ScalaSdk getScalaSdk() {
}

@Override
public Set<URI> dependencySources(TargetInfo targetInfo) {
return javaLanguagePlugin.dependencySources(targetInfo);
public Set<URI> dependencySources(TargetInfo targetInfo, DependencyTree dependencyTree) {
return javaLanguagePlugin.dependencySources(targetInfo, dependencyTree);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package org.jetbrains.bsp.bazel.server.sync.languages.thrift;

import ch.epfl.scala.bsp4j.BuildTarget;
import io.vavr.collection.Set;
import java.net.URI;
import org.jetbrains.bsp.bazel.info.BspTargetInfo.TargetInfo;
import org.jetbrains.bsp.bazel.server.sync.BazelPathsResolver;
import org.jetbrains.bsp.bazel.server.sync.dependencytree.DependencyTree;
import org.jetbrains.bsp.bazel.server.sync.languages.LanguagePlugin;

public class ThriftLanguagePlugin extends LanguagePlugin<ThriftModule> {
private static final String THRIFT_LIBRARY_RULE_NAME = "thrift_library";

private final BazelPathsResolver bazelPathsResolver;

public ThriftLanguagePlugin(BazelPathsResolver bazelPathsResolver) {
this.bazelPathsResolver = bazelPathsResolver;
}

@Override
public Set<URI> dependencySources(TargetInfo targetInfo, DependencyTree dependencyTree) {
return dependencyTree
.transitiveDependenciesWithoutRootTargets(targetInfo.getId())
.filter(this::isThriftLibrary)
.flatMap(TargetInfo::getSourcesList)
.map(bazelPathsResolver::resolveUri);
}

private boolean isThriftLibrary(TargetInfo target) {
return target.getKind().equals(THRIFT_LIBRARY_RULE_NAME);
}

@Override
protected void applyModuleData(ThriftModule moduleData, BuildTarget buildTarget) {
// no actions needed
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.jetbrains.bsp.bazel.server.sync.languages.thrift;

import org.jetbrains.bsp.bazel.server.sync.languages.LanguageData;

public class ThriftModule implements LanguageData {}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ public enum Language {
SCALA("scala", HashSet.of(".scala")),
JAVA("java", HashSet.of(".java")),
KOTLIN("kotlin", HashSet.of(".kt"), HashSet.of(Language.JAVA.name)),
CPP("cpp", HashSet.of(".C", ".cc", ".cpp", ".CPP", ".c++", ".cp", "cxx", ".h", ".hpp"));
CPP("cpp", HashSet.of(".C", ".cc", ".cpp", ".CPP", ".c++", ".cp", "cxx", ".h", ".hpp")),
THRIFT("thrift", HashSet.of(".thrift"));

private final String name;
private final Set<String> extensions;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
load("//:junit5.bzl", "java_junit5_test")

java_junit5_test(
name = "DependencyTreeTest",
size = "small",
srcs = ["DependencyTreeTest.java"],
test_package = "org.jetbrains.bsp.bazel.server.sync.dependencytree",
deps = [
"//server/src/main/java/org/jetbrains/bsp/bazel/server/sync/dependencytree",
],
)
Loading