diff --git a/model/src/main/java/com/microsoft/java/bs/gradle/model/GradleSourceSet.java b/model/src/main/java/com/microsoft/java/bs/gradle/model/GradleSourceSet.java index 10a3c9f9..8e6021b0 100644 --- a/model/src/main/java/com/microsoft/java/bs/gradle/model/GradleSourceSet.java +++ b/model/src/main/java/com/microsoft/java/bs/gradle/model/GradleSourceSet.java @@ -1,6 +1,7 @@ package com.microsoft.java.bs.gradle.model; import java.io.File; +import java.util.List; import java.util.Set; /** @@ -89,6 +90,11 @@ public interface GradleSourceSet { */ public String getTargetCompatibility(); + /** + * The list of compiler arguments. + */ + public List getCompilerArgs(); + /** * Module dependencies. */ diff --git a/plugin/src/main/java/com/microsoft/java/bs/gradle/plugin/SourceSetsModelBuilder.java b/plugin/src/main/java/com/microsoft/java/bs/gradle/plugin/SourceSetsModelBuilder.java index ada98a54..a91b140a 100644 --- a/plugin/src/main/java/com/microsoft/java/bs/gradle/plugin/SourceSetsModelBuilder.java +++ b/plugin/src/main/java/com/microsoft/java/bs/gradle/plugin/SourceSetsModelBuilder.java @@ -7,6 +7,7 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -102,6 +103,7 @@ public Object buildAll(String modelName, Project rootProject) { gradleSourceSet.setGradleVersion(gradleVersion); gradleSourceSet.setSourceCompatibility(getSourceCompatibility(project, sourceSet)); gradleSourceSet.setTargetCompatibility(getTargetCompatibility(project, sourceSet)); + gradleSourceSet.setCompilerArgs(getCompilerArgs(project, sourceSet)); gradleSourceSets.add(gradleSourceSet); }); @@ -302,6 +304,18 @@ private String getTargetCompatibility(Project project, SourceSet sourceSet) { return ""; } + /** + * Get the compilation arguments of the source set. + */ + private List getCompilerArgs(Project project, SourceSet sourceSet) { + JavaCompile javaCompile = getJavaCompileTask(project, sourceSet); + if (javaCompile != null) { + return javaCompile.getOptions().getCompilerArgs(); + } + + return Collections.emptyList(); + } + private Set getClasspathConfigurationNames(SourceSet sourceSet) { Set configurationNames = new HashSet<>(); configurationNames.add(sourceSet.getCompileClasspathConfigurationName()); diff --git a/plugin/src/main/java/com/microsoft/java/bs/gradle/plugin/model/DefaultGradleSourceSet.java b/plugin/src/main/java/com/microsoft/java/bs/gradle/plugin/model/DefaultGradleSourceSet.java index ee1db08a..df4def86 100644 --- a/plugin/src/main/java/com/microsoft/java/bs/gradle/plugin/model/DefaultGradleSourceSet.java +++ b/plugin/src/main/java/com/microsoft/java/bs/gradle/plugin/model/DefaultGradleSourceSet.java @@ -2,6 +2,7 @@ import java.io.File; import java.io.Serializable; +import java.util.List; import java.util.Objects; import java.util.Set; @@ -49,6 +50,8 @@ public class DefaultGradleSourceSet implements GradleSourceSet, Serializable { private String targetCompatibility; + private List compilerArgs; + private Set moduleDependencies; private Set projectDependencies; @@ -191,6 +194,14 @@ public void setTargetCompatibility(String targetCompatibility) { this.targetCompatibility = targetCompatibility; } + public List getCompilerArgs() { + return compilerArgs; + } + + public void setCompilerArgs(List compilerArgs) { + this.compilerArgs = compilerArgs; + } + public Set getModuleDependencies() { return moduleDependencies; } @@ -210,10 +221,11 @@ public void setProjectDependencies(Set projectDependenc @Override public int hashCode() { return Objects.hash(projectName, projectPath, projectDir, - rootDir, sourceSetName, classesTaskName, sourceDirs, generatedSourceDirs, - sourceOutputDir, resourceDirs, resourceOutputDir, - javaHome, javaVersion, gradleVersion, sourceCompatibility, - targetCompatibility, moduleDependencies, projectDependencies); + rootDir, sourceSetName, classesTaskName, sourceDirs, + generatedSourceDirs, sourceOutputDir, resourceDirs, + resourceOutputDir, javaHome, javaVersion, gradleVersion, + sourceCompatibility, targetCompatibility, compilerArgs, + moduleDependencies, projectDependencies); } @Override @@ -244,6 +256,7 @@ public boolean equals(Object obj) { && Objects.equals(gradleVersion, other.gradleVersion) && Objects.equals(sourceCompatibility, other.sourceCompatibility) && Objects.equals(targetCompatibility, other.targetCompatibility) + && Objects.equals(compilerArgs, other.compilerArgs) && Objects.equals(moduleDependencies, other.moduleDependencies) && Objects.equals(projectDependencies, other.projectDependencies); } diff --git a/plugin/src/test/java/com/microsoft/java/bs/gradle/plugin/GradleBuildServerPluginTest.java b/plugin/src/test/java/com/microsoft/java/bs/gradle/plugin/GradleBuildServerPluginTest.java index 0a850d07..e94e0a60 100644 --- a/plugin/src/test/java/com/microsoft/java/bs/gradle/plugin/GradleBuildServerPluginTest.java +++ b/plugin/src/test/java/com/microsoft/java/bs/gradle/plugin/GradleBuildServerPluginTest.java @@ -63,6 +63,7 @@ void testModelBuilder() throws IOException { assertNotNull(gradleSourceSet.getJavaVersion()); assertNotNull(gradleSourceSet.getSourceCompatibility()); assertNotNull(gradleSourceSet.getTargetCompatibility()); + assertNotNull(gradleSourceSet.getCompilerArgs()); assertNotNull(gradleSourceSet.getGradleVersion()); assertNotNull(gradleSourceSet.getModuleDependencies()); assertTrue(gradleSourceSet.getModuleDependencies().stream().anyMatch( diff --git a/server/src/main/java/com/microsoft/java/bs/core/internal/server/GradleBuildServer.java b/server/src/main/java/com/microsoft/java/bs/core/internal/server/GradleBuildServer.java index ff23cb5a..c825dd29 100644 --- a/server/src/main/java/com/microsoft/java/bs/core/internal/server/GradleBuildServer.java +++ b/server/src/main/java/com/microsoft/java/bs/core/internal/server/GradleBuildServer.java @@ -35,6 +35,9 @@ import ch.epfl.scala.bsp4j.InitializeBuildResult; import ch.epfl.scala.bsp4j.InverseSourcesParams; import ch.epfl.scala.bsp4j.InverseSourcesResult; +import ch.epfl.scala.bsp4j.JavaBuildServer; +import ch.epfl.scala.bsp4j.JavacOptionsParams; +import ch.epfl.scala.bsp4j.JavacOptionsResult; import ch.epfl.scala.bsp4j.OutputPathsParams; import ch.epfl.scala.bsp4j.OutputPathsResult; import ch.epfl.scala.bsp4j.ResourcesParams; @@ -50,7 +53,7 @@ /** * The implementation of the Build Server Protocol. */ -public class GradleBuildServer implements BuildServer { +public class GradleBuildServer implements BuildServer, JavaBuildServer { private LifecycleService lifecycleService; @@ -163,6 +166,12 @@ public CompletableFuture buildTargetDependencyModules( buildTargetService.getBuildTargetDependencyModules(params)); } + @Override + public CompletableFuture buildTargetJavacOptions(JavacOptionsParams params) { + return handleRequest("buildTarget/javacOptions", cc -> + buildTargetService.getBuildTargetrJavacOptions(params)); + } + private void handleNotification(String methodName, Runnable runnable, boolean async) { LogEntity entity = new LogEntity.Builder() .operationName(escapeMethodName(methodName)) diff --git a/server/src/main/java/com/microsoft/java/bs/core/internal/services/BuildTargetService.java b/server/src/main/java/com/microsoft/java/bs/core/internal/services/BuildTargetService.java index 274d62b7..ae48bfa2 100644 --- a/server/src/main/java/com/microsoft/java/bs/core/internal/services/BuildTargetService.java +++ b/server/src/main/java/com/microsoft/java/bs/core/internal/services/BuildTargetService.java @@ -5,6 +5,7 @@ import java.io.File; import java.net.URI; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -30,6 +31,9 @@ import ch.epfl.scala.bsp4j.DependencyModulesItem; import ch.epfl.scala.bsp4j.DependencyModulesParams; import ch.epfl.scala.bsp4j.DependencyModulesResult; +import ch.epfl.scala.bsp4j.JavacOptionsItem; +import ch.epfl.scala.bsp4j.JavacOptionsParams; +import ch.epfl.scala.bsp4j.JavacOptionsResult; import ch.epfl.scala.bsp4j.MavenDependencyModule; import ch.epfl.scala.bsp4j.MavenDependencyModuleArtifact; import ch.epfl.scala.bsp4j.OutputPathItem; @@ -234,6 +238,30 @@ public CompileResult compile(CompileParams params) { return result; } + /** + * Get the compiler options. + */ + public JavacOptionsResult getBuildTargetrJavacOptions(JavacOptionsParams params) { + List items = new ArrayList<>(); + for (BuildTargetIdentifier btId : params.getTargets()) { + GradleBuildTarget target = buildTargetManager.getGradleBuildTarget(btId); + if (target == null) { + LOGGER.warning("Skip javac options collection for the build target: " + btId.getUri() + + ". Because it cannot be found in the cache."); + continue; + } + + GradleSourceSet sourceSet = target.getSourceSet(); + items.add(new JavacOptionsItem( + btId, + sourceSet.getCompilerArgs(), + Collections.emptyList(), // classpath, not support currently + "" // classDirectory, not support currently + )); + } + return new JavacOptionsResult(items); + } + /** * Group the build targets by the project root directory, * projects with the same root directory can run their tasks diff --git a/server/src/test/java/com/microsoft/java/bs/core/internal/services/BuildTargetServiceTest.java b/server/src/test/java/com/microsoft/java/bs/core/internal/services/BuildTargetServiceTest.java index 052a6f2a..32965fe0 100644 --- a/server/src/test/java/com/microsoft/java/bs/core/internal/services/BuildTargetServiceTest.java +++ b/server/src/test/java/com/microsoft/java/bs/core/internal/services/BuildTargetServiceTest.java @@ -8,6 +8,7 @@ import java.io.File; import java.net.URI; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; @@ -29,6 +30,8 @@ import ch.epfl.scala.bsp4j.DependencyModule; import ch.epfl.scala.bsp4j.DependencyModulesParams; import ch.epfl.scala.bsp4j.DependencyModulesResult; +import ch.epfl.scala.bsp4j.JavacOptionsParams; +import ch.epfl.scala.bsp4j.JavacOptionsResult; import ch.epfl.scala.bsp4j.MavenDependencyModule; import ch.epfl.scala.bsp4j.MavenDependencyModuleArtifact; import ch.epfl.scala.bsp4j.OutputPathsParams; @@ -212,4 +215,27 @@ public String getClassifier() { MavenDependencyModuleArtifact artifact = module.getArtifacts().get(0); assertEquals("sources", artifact.getClassifier()); } + + @Test + void testGetJavacOptions() { + GradleBuildTarget gradleBuildTarget = mock(GradleBuildTarget.class); + when(buildTargetManager.getGradleBuildTarget(any())).thenReturn(gradleBuildTarget); + + GradleSourceSet gradleSourceSet = mock(GradleSourceSet.class); + when(gradleBuildTarget.getSourceSet()).thenReturn(gradleSourceSet); + + List compilerArgs = new ArrayList<>(); + + compilerArgs.add("--add-opens"); + compilerArgs.add("java.base/java.lang=ALL-UNNAMED"); + when(gradleSourceSet.getCompilerArgs()).thenReturn(compilerArgs); + + BuildTargetService buildTargetService = new BuildTargetService(buildTargetManager, + preferenceManager); + JavacOptionsResult javacOptions = buildTargetService.getBuildTargetrJavacOptions( + new JavacOptionsParams(Arrays.asList(new BuildTargetIdentifier("test")))); + + assertEquals(1, javacOptions.getItems().size()); + assertEquals(2, javacOptions.getItems().get(0).getOptions().size()); + } }