Skip to content

Commit

Permalink
[fix] now sources of thrift dependencies are included as dependencies (
Browse files Browse the repository at this point in the history
…#202)

* thrift language plugin

* lil aspects cleanup

* format

* changelog

* dependency tree

* thrift proto cleanup

* changelog update

* test update

* review fixesssss

* rebase fixx
  • Loading branch information
abrams27 committed Apr 4, 2022
1 parent d0cd455 commit f1939c4
Show file tree
Hide file tree
Showing 15 changed files with 478 additions and 13 deletions.
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(
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) {
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

0 comments on commit f1939c4

Please sign in to comment.