Bug 534624: [9] Support module-info.java in multi-release JAR files
Change-Id: Ia696898b71b068381945082967cd92557202f947
Signed-off-by: jay <jarthana@in.ibm.com>
diff --git a/org.eclipse.jdt.compiler.apt/src/org/eclipse/jdt/internal/compiler/apt/model/DeclaredTypeImpl.java b/org.eclipse.jdt.compiler.apt/src/org/eclipse/jdt/internal/compiler/apt/model/DeclaredTypeImpl.java
index 422236e..7523d53 100644
--- a/org.eclipse.jdt.compiler.apt/src/org/eclipse/jdt/internal/compiler/apt/model/DeclaredTypeImpl.java
+++ b/org.eclipse.jdt.compiler.apt/src/org/eclipse/jdt/internal/compiler/apt/model/DeclaredTypeImpl.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2006, 2017 BEA Systems, Inc.
+ * Copyright (c) 2006, 2018 BEA Systems, Inc.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -24,10 +24,8 @@
import javax.lang.model.type.TypeVisitor;
import org.eclipse.jdt.internal.compiler.apt.dispatch.BaseProcessingEnvImpl;
-import org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding;
import org.eclipse.jdt.internal.compiler.lookup.ParameterizedTypeBinding;
import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
-import org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding;
import org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
import org.eclipse.jdt.internal.compiler.lookup.TypeVariableBinding;
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java
index 9b159e0..22a5fd6 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AbstractJavaModelTests.java
@@ -1427,6 +1427,13 @@
project.setRawClasspath(newPath, null);
return project;
}
+ protected IClasspathEntry getJRTLibraryEntry() {
+ if (!isJRE9) return null;
+ String javaHome = System.getProperty("java.home") + File.separator;
+ Path bootModPath = new Path(javaHome +"/lib/jrt-fs.jar");
+ Path sourceAttachment = new Path(javaHome +"/lib/src.zip");
+ return JavaCore.newLibraryEntry(bootModPath, sourceAttachment, null, null, null, false);
+ }
/*
}
* Creates a Java project where prj=src=bin and with JCL_LIB on its classpath.
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ModuleBuilderTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ModuleBuilderTests.java
index a17703b..d7afeba 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ModuleBuilderTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ModuleBuilderTests.java
@@ -6958,6 +6958,63 @@
this.deleteProject("com.greetings");
}
}
+ public void testBug534624a() throws CoreException, IOException {
+ if (!isJRE9) return;
+ IJavaProject project = null;
+ Hashtable<String, String> options = JavaCore.getOptions();
+ try {
+ project = setUpJavaProject("bug.test.b534624");
+ IClasspathEntry[] rawClasspath = project.getRawClasspath();
+ IClasspathEntry jrtEntry = getJRTLibraryEntry();
+ for(int i = 0; i < rawClasspath.length; i++) {
+ if (rawClasspath[i].getEntryKind() == IClasspathEntry.CPE_CONTAINER)
+ rawClasspath[i] = jrtEntry;
+ }
+ project.setRawClasspath(rawClasspath, null);
+ project.setOption(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_10);
+ project.setOption(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_10);
+ project.setOption(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_10);
+ getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);
+ IMarker[] markers = project.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
+ assertMarkers("Unexpected markers", "Version9 cannot be resolved to a module", markers);
+ } finally {
+ if (project != null)
+ deleteProject(project);
+ JavaCore.setOptions(options);
+ }
+ }
+ public void testBug534624b() throws CoreException, IOException {
+ if (!isJRE9) return;
+ IJavaProject project = null;
+ Hashtable<String, String> options = JavaCore.getOptions();
+ try {
+ project = setUpJavaProject("bug.test.b534624");
+ IClasspathEntry[] rawClasspath = project.getRawClasspath();
+ IClasspathEntry jrtEntry = getJRTLibraryEntry();
+ for(int i = 0; i < rawClasspath.length; i++) {
+ if (rawClasspath[i].getEntryKind() == IClasspathEntry.CPE_CONTAINER)
+ rawClasspath[i] = jrtEntry;
+ }
+ project.setRawClasspath(rawClasspath, null);
+ project.setOption(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_9);
+ project.setOption(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_9);
+ project.setOption(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_9);
+ getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);
+ IMarker[] markers = project.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
+ assertMarkers("Unexpected markers", "Version10 cannot be resolved to a module", markers);
+
+ project.setOption(JavaCore.COMPILER_SOURCE, JavaCore.VERSION_10);
+ project.setOption(JavaCore.COMPILER_COMPLIANCE, JavaCore.VERSION_10);
+ project.setOption(JavaCore.COMPILER_CODEGEN_TARGET_PLATFORM, JavaCore.VERSION_10);
+ getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);
+ markers = project.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
+ assertMarkers("Unexpected markers", "Version9 cannot be resolved to a module", markers);
+ } finally {
+ if (project != null)
+ deleteProject(project);
+ JavaCore.setOptions(options);
+ }
+ }
protected void assertNoErrors() throws CoreException {
for (IProject p : getWorkspace().getRoot().getProjects()) {
int maxSeverity = p.findMaxProblemSeverity(null, true, IResource.DEPTH_INFINITE);
diff --git a/org.eclipse.jdt.core.tests.model/workspace/bug.test.b534624/.classpath b/org.eclipse.jdt.core.tests.model/workspace/bug.test.b534624/.classpath
new file mode 100644
index 0000000..404104c
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/bug.test.b534624/.classpath
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+ <classpathentry kind="src" path="src"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-10">
+ <attributes>
+ <attribute name="module" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="lib" path="lib/multi.jar">
+ <attributes>
+ <attribute name="module" value="true"/>
+ </attributes>
+ </classpathentry>
+ <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.jdt.core.tests.model/workspace/bug.test.b534624/.project b/org.eclipse.jdt.core.tests.model/workspace/bug.test.b534624/.project
new file mode 100644
index 0000000..cb5a6bc
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/bug.test.b534624/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+ <name>bug.test.b534624</name>
+ <comment></comment>
+ <projects>
+ </projects>
+ <buildSpec>
+ <buildCommand>
+ <name>org.eclipse.jdt.core.javabuilder</name>
+ <arguments>
+ </arguments>
+ </buildCommand>
+ </buildSpec>
+ <natures>
+ <nature>org.eclipse.jdt.core.javanature</nature>
+ </natures>
+</projectDescription>
diff --git a/org.eclipse.jdt.core.tests.model/workspace/bug.test.b534624/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.jdt.core.tests.model/workspace/bug.test.b534624/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..d779bfb
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/bug.test.b534624/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,13 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=10
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=10
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.release=enabled
+org.eclipse.jdt.core.compiler.source=10
diff --git a/org.eclipse.jdt.core.tests.model/workspace/bug.test.b534624/lib/multi.jar b/org.eclipse.jdt.core.tests.model/workspace/bug.test.b534624/lib/multi.jar
new file mode 100644
index 0000000..c28b088
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/bug.test.b534624/lib/multi.jar
Binary files differ
diff --git a/org.eclipse.jdt.core.tests.model/workspace/bug.test.b534624/src/module-info.java b/org.eclipse.jdt.core.tests.model/workspace/bug.test.b534624/src/module-info.java
new file mode 100644
index 0000000..5f8fde4
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/bug.test.b534624/src/module-info.java
@@ -0,0 +1,4 @@
+module bug.test.b534624 {
+ requires Version9;
+ requires Version10;
+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathJar.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathJar.java
index 39c1ee1..a0b66c4 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathJar.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/ClasspathJar.java
@@ -110,7 +110,19 @@
ZipFile file = null;
try {
file = new ZipFile(this.zipFilename);
- ClassFileReader classfile = ClassFileReader.read(file, IModule.MODULE_INFO_CLASS); // FIXME: use jar cache
+ String releasePath = "META-INF/versions/" + this.compliance + '/' + IModule.MODULE_INFO_CLASS; //$NON-NLS-1$
+ System.out.println("Reading for module from: " + this.zipFilename); //$NON-NLS-1$
+ ClassFileReader classfile = null;
+ try {
+ classfile = ClassFileReader.read(file, releasePath);
+ System.out.println("Read classfile : " + classfile); //$NON-NLS-1$
+ } catch (Exception e) {
+ e.printStackTrace();
+ // move on to the default
+ }
+ if (classfile == null) {
+ classfile = ClassFileReader.read(file, IModule.MODULE_INFO_CLASS); // FIXME: use jar cache
+ }
if (classfile != null) {
mod = classfile.getModuleDeclaration();
}