Skip to content

Commit eb7237f

Browse files
committed
Ignore modules when reading module-info from jar
1 parent acccaf1 commit eb7237f

File tree

2 files changed

+15
-9
lines changed

2 files changed

+15
-9
lines changed

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -674,7 +674,10 @@ public Void visitClass(ClassTree node, Void p) {
674674
Map<JavaFileObject, File> fileObjectsToJars = new HashMap<>();
675675
context.put(FILE_OBJECTS_TO_JAR_KEY, fileObjectsToJars);
676676
boolean docEnabled = JavaCore.ENABLED.equals(compilerOptions.get(JavaCore.COMPILER_DOC_COMMENT_SUPPORT));
677-
JavacUtils.configureJavacContext(context, compilerOptions, javaProject, JavacUtils.isTest(javaProject, sourceUnits));
677+
// ignore module is a workaround for cases when we read a module-info.java from a library.
678+
// Such units cause a failure later because their name is lost in ASTParser and Javac cannot treat them as modules
679+
boolean ignoreModule = !Arrays.stream(sourceUnits).allMatch(u -> new String(u.getFileName()).endsWith("java"));
680+
JavacUtils.configureJavacContext(context, compilerOptions, javaProject, JavacUtils.isTest(javaProject, sourceUnits), ignoreModule);
678681
Options javacOptions = Options.instance(context);
679682
javacOptions.put("allowStringFolding", Boolean.FALSE.toString()); // we need to keep strings as authored
680683
if ((focalPoint >= 0 || !resolveBindings) && (flags & ICompilationUnit.FORCE_PROBLEM_DETECTION) == 0) {
@@ -716,8 +719,11 @@ public Void visitClass(ClassTree node, Void p) {
716719
String lastSegment = split[split.length-1].replace(".class", ".java");
717720
sourceUnitPath = Path.of(lastSegment);
718721
}
719-
if( sourceUnitPath == null )
722+
if( sourceUnitPath == null ) {
723+
// This can cause trouble in case the name of the file is important
724+
// eg module-info.java.
720725
sourceUnitPath = Path.of(new File(System.identityHashCode(sourceUnit) + '/' + MOCK_NAME_FOR_CLASSES).toURI());
726+
}
721727
} else if (unitFile.getName().endsWith(".jar")) {
722728
sourceUnitPath = Path.of(unitFile.toURI()).resolve(System.identityHashCode(sourceUnit) + '/' + MOCK_NAME_FOR_CLASSES);
723729
} else {

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

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -60,17 +60,17 @@
6060

6161
public class JavacUtils {
6262

63-
public static void configureJavacContext(Context context, Map<String, String> compilerOptions, IJavaProject javaProject, boolean isTest) {
64-
configureJavacContext(context, compilerOptions, javaProject, null, null, isTest);
63+
public static void configureJavacContext(Context context, Map<String, String> compilerOptions, IJavaProject javaProject, boolean isTest, boolean skipModules) {
64+
configureJavacContext(context, compilerOptions, javaProject, null, null, isTest, skipModules);
6565
}
6666

6767
public static void configureJavacContext(Context context, JavacConfig compilerConfig,
6868
IJavaProject javaProject, File output, boolean isTest) {
69-
configureJavacContext(context, compilerConfig.compilerOptions().getMap(), javaProject, compilerConfig, output, isTest);
69+
configureJavacContext(context, compilerConfig.compilerOptions().getMap(), javaProject, compilerConfig, output, isTest, false);
7070
}
7171

7272
private static void configureJavacContext(Context context, Map<String, String> compilerOptions,
73-
IJavaProject javaProject, JavacConfig compilerConfig, File output, boolean isTest) {
73+
IJavaProject javaProject, JavacConfig compilerConfig, File output, boolean isTest, boolean skipModules) {
7474
IClasspathEntry[] classpath = new IClasspathEntry[0];
7575
if (javaProject != null && javaProject.getProject() != null) {
7676
try {
@@ -103,7 +103,7 @@ private static void configureJavacContext(Context context, Map<String, String> c
103103
JavacFileManager.preRegister(context);
104104
}
105105
if (javaProject instanceof JavaProject internal) {
106-
configurePaths(internal, context, compilerConfig, output, isTest);
106+
configurePaths(internal, context, compilerConfig, output, isTest, skipModules);
107107
}
108108
}
109109

@@ -228,7 +228,7 @@ private static void addDebugInfos(Map<String, String> compilerOptions, Options o
228228
}
229229

230230
private static void configurePaths(JavaProject javaProject, Context context, JavacConfig compilerConfig,
231-
File output, boolean isTest) {
231+
File output, boolean isTest, boolean skipModules) {
232232
var fileManager = (StandardJavaFileManager)context.get(JavaFileManager.class);
233233
try {
234234
if (compilerConfig != null && !isEmpty(compilerConfig.annotationProcessorPaths())) {
@@ -338,7 +338,7 @@ private static void configurePaths(JavaProject javaProject, Context context, Jav
338338
classpathFiles.addAll(outDirectories(javaProject, entry -> isTest || !entry.isTest()));
339339
fileManager.setLocation(StandardLocation.CLASS_PATH, classpathFiles);
340340

341-
if (!moduleSourcePathEnabled && javaProject.getModuleDescription() != null) {
341+
if (!skipModules && !moduleSourcePathEnabled && javaProject.getModuleDescription() != null) {
342342
moduleProjects = new LinkedHashSet<>(moduleProjects);
343343
moduleProjects.add(javaProject);
344344
for (IJavaProject requiredModuleProject : moduleProjects) {

0 commit comments

Comments
 (0)