Skip to content

Commit d3d4dc9

Browse files
mickaelistriarobstryker
authored andcommitted
Better pass custom Java lib
1 parent 70ed23c commit d3d4dc9

File tree

2 files changed

+34
-9
lines changed

2 files changed

+34
-9
lines changed

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/core/dom/JavacCompilationUnitResolver.java

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@
9494
import com.sun.tools.javac.comp.CompileStates.CompileState;
9595
import com.sun.tools.javac.file.JavacFileManager;
9696
import com.sun.tools.javac.main.Option;
97+
import com.sun.tools.javac.main.Option.OptionKind;
9798
import com.sun.tools.javac.parser.JavadocTokenizer;
9899
import com.sun.tools.javac.parser.Scanner;
99100
import com.sun.tools.javac.parser.ScannerFactory;
@@ -756,8 +757,13 @@ public Void visitClass(ClassTree node, Void p) {
756757
fileObjects.add(fileObject);
757758
}
758759

759-
760-
Iterable<String> options = configureAPIfNecessary(fileManager) ? null : Arrays.asList("-proc:none");
760+
// some options needs to be passed to getTask() to be properly handled
761+
// (just having them set in Options is sometimes not enough). So we
762+
// turn them back into CLI arguments to pass them.
763+
List<String> options = new ArrayList<>(toCLIOptions(javacOptions));
764+
if (!configureAPTIfNecessary(fileManager)) {
765+
options.add("-proc:none");
766+
}
761767
JavacTask task = ((JavacTool)compiler).getTask(null, fileManager, null /* already added to context */, options, List.of() /* already set */, fileObjects, context);
762768
{
763769
// don't know yet a better way to ensure those necessary flags get configured
@@ -1169,7 +1175,7 @@ private static Function<String, IBinding> javacAdditionalBindingCreator(Map<Stri
11691175
};
11701176
}
11711177

1172-
private boolean configureAPIfNecessary(JavacFileManager fileManager) {
1178+
private boolean configureAPTIfNecessary(JavacFileManager fileManager) {
11731179
Iterable<? extends File> apPaths = fileManager.getLocation(StandardLocation.ANNOTATION_PROCESSOR_PATH);
11741180
if (apPaths != null) {
11751181
return true;
@@ -1213,4 +1219,20 @@ private boolean configureAPIfNecessary(JavacFileManager fileManager) {
12131219
return false;
12141220
}
12151221

1222+
private static List<String> toCLIOptions(Options opts) {
1223+
return opts.keySet().stream().map(Option::lookup)
1224+
.filter(Objects::nonNull)
1225+
.filter(opt -> opt.getKind() != OptionKind.HIDDEN)
1226+
.map(opt ->
1227+
switch (opt.getArgKind()) {
1228+
case NONE -> Stream.of(opt.primaryName);
1229+
case REQUIRED -> opt.primaryName.endsWith("=") || opt.primaryName.endsWith(":") ? Stream.of(opt.primaryName + opts.get(opt)) : Stream.of(opt.primaryName, opts.get(opt));
1230+
case ADJACENT -> {
1231+
var value = opts.get(opt);
1232+
yield value == null || value.isEmpty() ? Arrays.stream(new String[0]) :
1233+
Stream.of(opt.primaryName + opts.get(opt));
1234+
}
1235+
}).flatMap(Function.identity())
1236+
.toList();
1237+
}
12161238
}

org.eclipse.jdt.core.javac/src/org/eclipse/jdt/internal/javac/JavacUtils.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@
4141
import org.eclipse.core.runtime.Path;
4242
import org.eclipse.jdt.core.IClasspathAttribute;
4343
import org.eclipse.jdt.core.IClasspathEntry;
44+
import org.eclipse.jdt.core.IJavaElement;
4445
import org.eclipse.jdt.core.IJavaProject;
46+
import org.eclipse.jdt.core.IType;
4547
import org.eclipse.jdt.core.JavaCore;
4648
import org.eclipse.jdt.core.JavaModelException;
4749
import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
@@ -181,13 +183,14 @@ private static void configureOptions(IJavaProject javaProject, Context context,
181183
if (limitModules != null && !limitModules.isBlank()) {
182184
options.put(Option.LIMIT_MODULES, limitModules);
183185
}
184-
if (nineOrLater && !options.isSet(Option.RELEASE) && javaProject instanceof JavaProject javaProjectImpl) {
186+
if (!options.isSet(Option.RELEASE) && javaProject instanceof JavaProject) {
185187
try {
186-
for (IClasspathEntry entry : javaProject.getRawClasspath()) {
187-
if (entry.getPath() != null && entry.getPath().toString().startsWith("org.eclipse.jdt.launching.JRE_CONTAINER")) {
188-
for (IClasspathEntry resolved : javaProjectImpl.resolveClasspath(new IClasspathEntry[] { entry })) {
189-
options.put(Option.SYSTEM, resolved.getPath().toString());
190-
}
188+
IType systemType = javaProject.findType(Object.class.getName());
189+
if (systemType != null) {
190+
IJavaElement element = systemType.getAncestor(IJavaElement.PACKAGE_FRAGMENT_ROOT);
191+
IPath path = element.getPath();
192+
if (path != null && path.toFile().exists()) {
193+
options.put(nineOrLater ? Option.SYSTEM : Option.BOOT_CLASS_PATH, path.toFile().getAbsolutePath());
191194
}
192195
}
193196
} catch (JavaModelException ex) {

0 commit comments

Comments
 (0)