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

Implement buildTargetScalaMainClasses #36

Merged
merged 40 commits into from
Feb 4, 2021
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
3dc670d
Init
magda-aug Jan 19, 2021
784c1bb
Fix resolving target options
magda-aug Jan 20, 2021
df5e842
Fix variable name
magda-aug Jan 20, 2021
e48a09b
Change access
magda-aug Jan 20, 2021
017ef70
Fix formatting
magda-aug Jan 20, 2021
7622ec1
Fix formatting
magda-aug Jan 20, 2021
b1e0124
Read arguments
magda-aug Jan 20, 2021
4c94579
Upgrade bsp-testkit
magda-aug Jan 21, 2021
127984b
Add empty test
magda-aug Jan 21, 2021
dcb0882
Fix formatting
magda-aug Jan 21, 2021
7e1750b
Move constants
magda-aug Jan 21, 2021
b9d7637
Merge branch 'dev' into scala-mainclasses-2
magda-aug Jan 21, 2021
2bac873
Fix
magda-aug Jan 21, 2021
63c37e0
Add more data to test
magda-aug Jan 21, 2021
64bc27a
Add package name
magda-aug Jan 21, 2021
88e4eed
Move targetRulesResolver to constructor
magda-aug Jan 27, 2021
69728f0
return Completable Future instead of null
magda-aug Jan 27, 2021
fdc6cae
Extract method
magda-aug Jan 27, 2021
db9ea50
Extract isAttributeSpecifiedAndHasGivenName
magda-aug Jan 27, 2021
cc6214b
Call buildServerImpl
magda-aug Jan 27, 2021
8815911
Pass compiler options and args to test
magda-aug Jan 27, 2021
94c2441
Fix tests
magda-aug Jan 27, 2021
bf55173
Fix tests
magda-aug Jan 27, 2021
b41b805
Add more args to test
magda-aug Jan 28, 2021
5db976f
Read also jvm flags
magda-aug Jan 28, 2021
2b88327
Move to constants
magda-aug Jan 28, 2021
b5bd604
Read only jvm flags
magda-aug Feb 2, 2021
7ae79f3
Merge branch 'dev' into scala-mainclasses-2
magda-aug Feb 2, 2021
3f63924
fix formatting
magda-aug Feb 2, 2021
d1b1e76
unify naming
magda-aug Feb 2, 2021
e0a6707
use helper method
magda-aug Feb 2, 2021
09443e5
remove duplicate methods
magda-aug Feb 2, 2021
8e23255
Add more test cases
magda-aug Feb 3, 2021
0089ae3
revert
magda-aug Feb 3, 2021
83a4f34
Add test case
magda-aug Feb 3, 2021
847d335
target without args test case
magda-aug Feb 3, 2021
20b982d
increase timeout
magda-aug Feb 4, 2021
8b801e3
add test case without jvm flags
magda-aug Feb 4, 2021
0ce672b
increase timeout
magda-aug Feb 4, 2021
f6d595d
increase timeout
magda-aug Feb 4, 2021
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
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ public CompletableFuture<ScalaTestClassesResult> buildTargetScalaTestClasses(
@Override
public CompletableFuture<ScalaMainClassesResult> buildTargetScalaMainClasses(
ScalaMainClassesParams scalaMainClassesParams) {
return scalaBuildServerService.buildTargetScalaMainClasses(scalaMainClassesParams);
return serverRequestHelpers.executeCommand(
() -> scalaBuildServerService.buildTargetScalaMainClasses(scalaMainClassesParams));
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package org.jetbrains.bsp.bazel.server.bsp.services;

import ch.epfl.scala.bsp4j.BuildTargetIdentifier;
import ch.epfl.scala.bsp4j.ScalaMainClass;
import ch.epfl.scala.bsp4j.ScalaMainClassesItem;
import ch.epfl.scala.bsp4j.ScalaMainClassesParams;
import ch.epfl.scala.bsp4j.ScalaMainClassesResult;
import ch.epfl.scala.bsp4j.ScalaTestClassesParams;
Expand All @@ -8,25 +11,33 @@
import ch.epfl.scala.bsp4j.ScalacOptionsParams;
import ch.epfl.scala.bsp4j.ScalacOptionsResult;
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.query2.proto.proto2api.Build;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import org.eclipse.lsp4j.jsonrpc.messages.Either;
import org.eclipse.lsp4j.jsonrpc.messages.ResponseError;
import org.jetbrains.bsp.bazel.commons.Constants;
import org.jetbrains.bsp.bazel.server.bazel.BazelRunner;
import org.jetbrains.bsp.bazel.server.bazel.data.BazelData;
import org.jetbrains.bsp.bazel.server.bsp.resolvers.TargetRulesResolver;
import org.jetbrains.bsp.bazel.server.bsp.resolvers.TargetsLanguageOptionsResolver;

public class ScalaBuildServerService {

private static final String SCALA_COMPILER_OPTIONS_NAME = "scalacopts";
private static final List<String> SCALA_LANGUAGES_IDS =
ImmutableList.of(Constants.SCALAC, Constants.JAVAC);
private static final String MAIN_CLASS_ATTR_NAME = "main_class";
private static final String ARGS_ATTR_NAME = "args";
magda-aug marked this conversation as resolved.
Show resolved Hide resolved

private final BazelRunner bazelRunner;
private final TargetsLanguageOptionsResolver<ScalacOptionsItem> targetsLanguageOptionsResolver;

public ScalaBuildServerService(BazelData bazelData, BazelRunner bazelRunner) {
this.bazelRunner = bazelRunner;
this.targetsLanguageOptionsResolver =
TargetsLanguageOptionsResolver.<ScalacOptionsItem>builder()
.bazelData(bazelData)
Expand All @@ -43,8 +54,8 @@ public Either<ResponseError, ScalacOptionsResult> buildTargetScalacOptions(
List<ScalacOptionsItem> resultItems =
targetsLanguageOptionsResolver.getResultItemsForTargets(scalacOptionsParams.getTargets());

ScalacOptionsResult javacOptionsResult = new ScalacOptionsResult(resultItems);
return Either.forRight(javacOptionsResult);
ScalacOptionsResult scalacOptionsResult = new ScalacOptionsResult(resultItems);
return Either.forRight(scalacOptionsResult);
}

public CompletableFuture<ScalaTestClassesResult> buildTargetScalaTestClasses(
Expand All @@ -54,10 +65,55 @@ public CompletableFuture<ScalaTestClassesResult> buildTargetScalaTestClasses(
return CompletableFuture.completedFuture(new ScalaTestClassesResult(new ArrayList<>()));
}

public CompletableFuture<ScalaMainClassesResult> buildTargetScalaMainClasses(
public Either<ResponseError, ScalaMainClassesResult> buildTargetScalaMainClasses(
ScalaMainClassesParams scalaMainClassesParams) {
System.out.printf("DWH: Got buildTargetScalaMainClasses: %s%n", scalaMainClassesParams);
// TODO(illicitonion): Populate
return CompletableFuture.completedFuture(new ScalaMainClassesResult(new ArrayList<>()));
TargetRulesResolver<ScalaMainClassesItem> targetRulesResolver =
magda-aug marked this conversation as resolved.
Show resolved Hide resolved
TargetRulesResolver.withBazelRunnerAndMapper(bazelRunner, this::mapRuleToMainClassesItem);

List<ScalaMainClassesItem> resultItems =
targetRulesResolver.getItemsForTargets(scalaMainClassesParams.getTargets());

ScalaMainClassesResult result = new ScalaMainClassesResult(resultItems);

return Either.forRight(result);
}

private ScalaMainClassesItem mapRuleToMainClassesItem(Build.Rule rule) {
BuildTargetIdentifier targetId = new BuildTargetIdentifier(rule.getName());
List<ScalaMainClass> mainClasses = collectMainClasses(rule);
return new ScalaMainClassesItem(targetId, mainClasses);
}

private List<ScalaMainClass> collectMainClasses(Build.Rule rule) {
List<String> targetOptions =
getAttribute(rule, SCALA_COMPILER_OPTIONS_NAME)
.flatMap(attr -> attr.getStringListValueList().stream())
.collect(Collectors.toList());
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Isn't it the same case as the two methods extracted below, that is, could it be extracted to something like getTargetOptions?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's not exactly the same, two methods use getStringListValueList (because the attributes are of type string list) and one uses getStringValue.
Anyway, I extracted the methods with the same logic

List<String> mainClassesNames = getTargetMainClasses(rule);
List<String> arguments = getTargetArguments(rule);
return mainClassesNames.stream()
.map(mainClassName -> new ScalaMainClass(mainClassName, arguments, targetOptions))
.collect(Collectors.toList());
}

private List<String> getTargetArguments(Build.Rule rule) {
return getAttribute(rule, ARGS_ATTR_NAME)
.map(Build.Attribute::getStringValue)
.collect(Collectors.toList());
}

private List<String> getTargetMainClasses(Build.Rule rule) {
return getAttribute(rule, MAIN_CLASS_ATTR_NAME)
.map(Build.Attribute::getStringValue)
.collect(Collectors.toList());
}

private Stream<Build.Attribute> getAttribute(Build.Rule rule, String name) {
return rule.getAttributeList().stream()
.filter(
attr ->
attr.getName().equals(name)
&& attr.hasExplicitlySpecified()
&& attr.getExplicitlySpecified());
magda-aug marked this conversation as resolved.
Show resolved Hide resolved
}
}