Skip to content
Open
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
7 changes: 7 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,13 @@
},
"description": "Relative paths from workspace root to .jar files, .zip files, or folders that should be included in the Java class path"
},
"java.extraCompilerArgs": {
"type": "array",
"items": {
"type": "string"
},
"description": "Extra compiler args, for example [\"--enable-preview\",\"-source 21\"]."
},
"java.docPath": {
"type": "array",
"items": {
Expand Down
5 changes: 3 additions & 2 deletions src/main/java/org/javacs/CompileBatch.java
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ public void close() {
private static ReusableCompiler.Borrow batchTask(
JavaCompilerService parent, Collection<? extends JavaFileObject> sources) {
parent.diags.clear();
var options = options(parent.classPath, parent.addExports);
var options = options(parent.classPath, parent.addExports,parent.extraArgs);
return parent.compiler.getTask(parent.fileManager, parent.diags::add, options, List.of(), sources);
}

Expand All @@ -110,7 +110,7 @@ private static String joinPath(Collection<Path> classOrSourcePath) {
return classOrSourcePath.stream().map(Path::toString).collect(Collectors.joining(File.pathSeparator));
}

private static List<String> options(Set<Path> classPath, Set<String> addExports) {
private static List<String> options(Set<Path> classPath, Set<String> addExports,Set<String> extraArgs) {
var list = new ArrayList<String>();

Collections.addAll(list, "-classpath", joinPath(classPath));
Expand All @@ -131,6 +131,7 @@ private static List<String> options(Set<Path> classPath, Set<String> addExports)
"-Xlint:unchecked",
"-Xlint:varargs",
"-Xlint:static");
list.addAll(extraArgs);
for (var export : addExports) {
list.add("--add-exports");
list.add(export + "=ALL-UNNAMED");
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/org/javacs/JavaCompilerService.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ class JavaCompilerService implements CompilerProvider {
// Not modifiable! If you want to edit these, you need to create a new instance
final Set<Path> classPath, docPath;
final Set<String> addExports;
final Set<String> extraArgs;
final ReusableCompiler compiler = new ReusableCompiler();
final Docs docs;
final Set<String> jdkClasses = ScanClassPath.jdkTopLevelClasses(), classPathClasses;
Expand All @@ -21,7 +22,7 @@ class JavaCompilerService implements CompilerProvider {
// TODO intercept files that aren't in the batch and erase method bodies so compilation is faster
final SourceFileManager fileManager;

JavaCompilerService(Set<Path> classPath, Set<Path> docPath, Set<String> addExports) {
JavaCompilerService(Set<Path> classPath, Set<Path> docPath, Set<String> addExports, Set<String> extraArgs) {
System.err.println("Class path:");
for (var p : classPath) {
System.err.println(" " + p);
Expand All @@ -34,6 +35,7 @@ class JavaCompilerService implements CompilerProvider {
this.classPath = Collections.unmodifiableSet(classPath);
this.docPath = Collections.unmodifiableSet(docPath);
this.addExports = Collections.unmodifiableSet(addExports);
this.extraArgs = Collections.unmodifiableSet(extraArgs);
this.docs = new Docs(docPath);
this.classPathClasses = ScanClassPath.classPathTopLevelClasses(classPath);
this.fileManager = new SourceFileManager();
Expand Down
16 changes: 14 additions & 2 deletions src/main/java/org/javacs/JavaLanguageServer.java
Original file line number Diff line number Diff line change
Expand Up @@ -92,11 +92,12 @@ private JavaCompilerService createCompiler() {

var externalDependencies = externalDependencies();
var classPath = classPath();
var extraArgs = extraCompilerArgs();
var addExports = addExports();
// If classpath is specified by the user, don't infer anything
if (!classPath.isEmpty()) {
javaEndProgress();
return new JavaCompilerService(classPath, docPath(), addExports);
return new JavaCompilerService(classPath, docPath(), addExports, extraArgs);
}
// Otherwise, combine inference with user-specified external dependencies
else {
Expand All @@ -109,7 +110,7 @@ private JavaCompilerService createCompiler() {
var docPath = infer.buildDocPath();

javaEndProgress();
return new JavaCompilerService(classPath, docPath, addExports);
return new JavaCompilerService(classPath, docPath, addExports, extraArgs);
}
}

Expand All @@ -133,6 +134,17 @@ private Set<Path> classPath() {
return paths;
}

private Set<String> extraCompilerArgs(){
if (!settings.has("extraCompilerArgs")) return Set.of();
var array = settings.getAsJsonArray("extraCompilerArgs");
var args = new HashSet<String>();
for (var each : array) {
// split "a b c" to ["a","b","c"]
args.addAll(Arrays.asList(each.getAsString().split("\\s+")));
}
return args;
}

private Set<Path> docPath() {
if (!settings.has("docPath")) return Set.of();
var array = settings.getAsJsonArray("docPath");
Expand Down