blob: 7e2acbbb11a84d3ba7254fe2b999967356a9b80e [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.core.tests.model;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IncrementalProjectBuilder;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.Path;
import org.eclipse.jdt.core.IClasspathAttribute;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.core.tests.util.Util;
import org.eclipse.jdt.internal.core.ClasspathAttribute;
import org.eclipse.jdt.internal.core.builder.ClasspathJrt;
import junit.framework.Test;
public class ModuleOptionsTests extends ModifyingResourceTests {
public ModuleOptionsTests(String name) {
super(name);
}
static {
// TESTS_NAMES = new String[] { "testAddReads" };
}
public static Test suite() {
return buildModelTestSuite(ModuleOptionsTests.class, BYTECODE_DECLARATION_ORDER);
}
public void setUpSuite() throws Exception {
super.setUpSuite();
ClasspathJrt.resetCaches();
}
public void tearDownSuite() throws Exception {
super.tearDownSuite();
}
// testing auto rebuild after change of limit-modules
public void testLimitModules3() throws CoreException, IOException {
if (!isJRE9) return;
try {
IClasspathAttribute[] attributes = {
JavaCore.newClasspathAttribute(IClasspathAttribute.MODULE, "true"),
JavaCore.newClasspathAttribute(IClasspathAttribute.LIMIT_MODULES, "java.se") // test transitive closure
};
IJavaProject project = createJava9ProjectWithJREAttributes("org.astro", new String[]{"src", "src2"}, attributes);
String[] sources = {
"src/module-info.java",
"module org.astro {\n" +
" requires java.base;\n" +
" requires java.desktop;\n" +
" requires java.datatransfer;\n" +
" requires java.sql;\n" +
"}\n",
"src/org/astro/Test2.java",
"package org.astro;\n" +
"class Test2 {\n" +
" java.awt.Window window;\n" +
"}\n",
"src2/org/astro/Test3.java",
"package org.astro;\n" +
"class Test3 {\n" +
" java.awt.datatransfer.Clipboard clippy;\n" +
"}\n"
};
createSourceFiles(project, sources);
getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);
IMarker[] markers = project.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
assertMarkers("Unexpected markers",
"",
markers);
IClasspathAttribute[] newLimits = {
JavaCore.newClasspathAttribute(IClasspathAttribute.MODULE, "true"),
JavaCore.newClasspathAttribute(IClasspathAttribute.LIMIT_MODULES, "java.base,java.sql") // no more awt etc
};
setJRECPAttributes(project, newLimits);
getWorkspace().build(IncrementalProjectBuilder.AUTO_BUILD, null);
markers = project.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
Arrays.sort(markers, (a,b) -> a.getAttribute(IMarker.CHAR_START, 0) - b.getAttribute(IMarker.CHAR_START, 0));
assertMarkers("Unexpected markers",
"java.awt cannot be resolved to a type\n" +
"java.awt cannot be resolved to a type\n" +
"java.desktop cannot be resolved to a module\n" +
"java.datatransfer cannot be resolved to a module",
markers);
} finally {
this.deleteProject("org.astro");
}
}
public void testAddExports() throws CoreException, IOException {
if (!isJRE9) return;
try {
String[] sources = {
"src/module-info.java",
"module org.astro {\n" +
" requires java.base;\n" +
" requires java.desktop;\n" +
" requires java.datatransfer;\n" +
" requires java.sql;\n" +
"}\n",
"src/org/astro/Test2.java",
"package org.astro;\n" +
"public class Test2 {\n" +
" java.awt.Window window;\n" +
"}\n",
"src2/org/astro/Test3.java",
"package org.astro;\n" +
"class Test3 {\n" +
" java.awt.datatransfer.Clipboard clippy;\n" +
"}\n"
};
IJavaProject project = setupModuleProject("org.astro", new String[] {"src", "src2"}, sources, null);
sources = new String[] {
"src/module-info.java",
"module test {\n" +
" requires org.astro;\n" +
"}\n",
"src/test/Test.java",
"package test;\n" +
"class Test {\n" +
" org.astro.Test2 t;\n" +
"}\n"
};
IClasspathAttribute[] attributes = {
JavaCore.newClasspathAttribute(IClasspathAttribute.MODULE, "true"),
JavaCore.newClasspathAttribute(IClasspathAttribute.ADD_EXPORTS, "org.astro/org.astro=test")
};
IClasspathEntry cp = JavaCore.newProjectEntry(project.getPath(), null, false, attributes, false);
IJavaProject p2 = setupModuleProject("test", sources, new IClasspathEntry[] {cp});
getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);
IMarker[] markers = p2.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
assertMarkers("Unexpected markers",
"",
markers);
IClasspathAttribute[] newAttrs = {
JavaCore.newClasspathAttribute(IClasspathAttribute.MODULE, "true")
};
setCPAttributes(p2, newAttrs, cp);
getWorkspace().build(IncrementalProjectBuilder.AUTO_BUILD, null);
markers = p2.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
assertMarkers("Unexpected markers",
"The type org.astro.Test2 is not accessible",
markers);
} finally {
this.deleteProject("org.astro");
this.deleteProject("test");
}
}
public void testAddExports_JRE() throws CoreException, IOException {
if (!isJRE9) return;
try {
String[] sources = {
"src/module-info.java",
"module org.astro {\n" +
" requires java.base;\n" +
" requires java.desktop;\n" +
" requires java.datatransfer;\n" +
" requires java.sql;\n" +
"}\n",
"src/org/astro/Test2.java",
"package org.astro;\n" +
"public class Test2 {\n" +
" int test(jdk.internal.misc.Unsafe unsafe) {\n" +
" return unsafe.addressSize();\n" +
" }" +
"}\n",
};
IClasspathAttribute[] attrs = new IClasspathAttribute[] {
JavaCore.newClasspathAttribute(IClasspathAttribute.MODULE, "true"),
JavaCore.newClasspathAttribute(IClasspathAttribute.ADD_EXPORTS, "java.base/jdk.internal.misc=org.astro")
};
IJavaProject project = createJava9ProjectWithJREAttributes("org.astro", new String[] {"src"}, attrs);
createSourceFiles(project, sources);
getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);
IMarker[] markers = project.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
assertMarkers("Unexpected markers",
"",
markers);
IClasspathAttribute[] newAttrs = {
JavaCore.newClasspathAttribute(IClasspathAttribute.MODULE, "true")
};
setJRECPAttributes(project, newAttrs);
getWorkspace().build(IncrementalProjectBuilder.AUTO_BUILD, null);
markers = project.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
assertMarkers("Unexpected markers",
"The type jdk.internal.misc.Unsafe is not accessible",
markers);
} finally {
this.deleteProject("org.astro");
}
}
public void testAddExports_multi() throws CoreException, IOException {
if (!isJRE9) return;
try {
String[] sources = {
"src/module-info.java",
"module org.astro {\n" +
" requires java.base;\n" +
" requires java.desktop;\n" +
" requires java.datatransfer;\n" +
" requires java.sql;\n" +
"}\n",
"src/org/astro/Test2.java",
"package org.astro;\n" +
"public class Test2 {\n" +
" java.awt.Window window;\n" +
"}\n",
"src2/org/astro/sub/Test3.java",
"package org.astro.sub;\n" +
"public class Test3 {\n" +
" java.awt.datatransfer.Clipboard clippy;\n" +
"}\n"
};
IJavaProject project = setupModuleProject("org.astro", new String[] {"src", "src2"}, sources, null);
sources = new String[] {
"src/module-info.java",
"module test {\n" +
" requires org.astro;\n" +
"}\n",
"src/test/Test.java",
"package test;\n" +
"class Test {\n" +
" org.astro.Test2 t;\n" +
" org.astro.sub.Test3 t3;\n" +
"}\n"
};
IClasspathAttribute[] attributes = {
JavaCore.newClasspathAttribute(IClasspathAttribute.MODULE, "true"),
JavaCore.newClasspathAttribute(IClasspathAttribute.ADD_EXPORTS, "org.astro/org.astro=test")
};
IClasspathEntry cp = JavaCore.newProjectEntry(project.getPath(), null, false, attributes, false);
IJavaProject p2 = setupModuleProject("test", sources, new IClasspathEntry[] {cp});
getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);
IMarker[] markers = p2.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
assertMarkers("Unexpected markers",
"The type org.astro.sub.Test3 is not accessible",
markers);
IClasspathAttribute[] newAttrs = {
JavaCore.newClasspathAttribute(IClasspathAttribute.MODULE, "true"),
JavaCore.newClasspathAttribute(IClasspathAttribute.ADD_EXPORTS, "org.astro/org.astro=test:org.astro/org.astro.sub=test")
};
setCPAttributes(p2, newAttrs, cp);
getWorkspace().build(IncrementalProjectBuilder.AUTO_BUILD, null);
markers = p2.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
assertMarkers("Unexpected markers",
"",
markers);
} finally {
this.deleteProject("org.astro");
this.deleteProject("test");
}
}
public void testAddExports_classFolder() throws CoreException, IOException {
if (!isJRE9) return;
try {
String[] sources = {
"src/module-info.java",
"module org.astro {\n" +
" requires java.base;\n" +
" requires java.desktop;\n" +
" requires java.datatransfer;\n" +
" requires java.sql;\n" +
"}\n",
"src/org/astro/Test2.java",
"package org.astro;\n" +
"public class Test2 {\n" +
" java.awt.Window window;\n" +
"}\n",
"src2/org/astro/sub/Test3.java",
"package org.astro.sub;\n" +
"public class Test3 {\n" +
" java.awt.datatransfer.Clipboard clippy;\n" +
"}\n"
};
IJavaProject project = setupModuleProject("org.astro", new String[] {"src", "src2"}, sources, null);
sources = new String[] {
"src/module-info.java",
"module test {\n" +
" requires org.astro;\n" +
"}\n",
"src/test/Test.java",
"package test;\n" +
"class Test {\n" +
" org.astro.Test2 t;\n" +
" org.astro.sub.Test3 t3;\n" +
"}\n"
};
IClasspathAttribute[] attributes = {
JavaCore.newClasspathAttribute(IClasspathAttribute.MODULE, "true"),
JavaCore.newClasspathAttribute(IClasspathAttribute.ADD_EXPORTS, "org.astro/org.astro=test")
};
IClasspathEntry cp = JavaCore.newLibraryEntry(project.getProject().findMember("bin").getFullPath(), null,
null, null, attributes, false);
IJavaProject p2 = setupModuleProject("test", sources, new IClasspathEntry[] {cp});
getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);
IMarker[] markers = p2.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
assertMarkers("Unexpected markers",
"The type org.astro.sub.Test3 is not accessible",
markers);
IClasspathAttribute[] newAttrs = {
JavaCore.newClasspathAttribute(IClasspathAttribute.MODULE, "true"),
JavaCore.newClasspathAttribute(IClasspathAttribute.ADD_EXPORTS, "org.astro/org.astro=test:org.astro/org.astro.sub=test")
};
setCPAttributes(p2, newAttrs, cp);
getWorkspace().build(IncrementalProjectBuilder.AUTO_BUILD, null);
markers = p2.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
assertMarkers("Unexpected markers",
"",
markers);
} finally {
this.deleteProject("org.astro");
this.deleteProject("test");
}
}
public void testAddReads() throws CoreException, IOException {
if (!isJRE9) return;
String libPath = "externalLib/mod.one.jar";
try {
String[] sources = new String[] {
"src/module-info.java",
"module org.astro {\n" +
" exports org.astro;\n" +
"}",
"src/org/astro/World.java",
"package org.astro;\n" +
"public interface World {\n" +
" public String name();\n" +
"}"
};
IJavaProject p = setupModuleProject("org.astro", sources);
String[] src1 = new String[] {
"src/module-info.java",
"module mod.one {\n" +
" exports one.p;\n" +
"}\n",
"src/org/astro/World.java",
"package org.astro;\n" +
"public interface World { public String name(); }\n",
"src/one/p/C.java",
"package one.p;\n" +
"public class C implements org.astro.World {\n" +
" public String name() {\n" +
" return \"C\";\n" +
" }\n" +
"}\n"
};
IJavaProject p1 = setupModuleProject("mod.one", src1);
getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);
// jar-up without the required class, should be supplied by the other module
deleteFile("/mod.one/src/org/astro/World.java");
deleteFile("/mod.one/bin/org/astro/World.class");
File rootDir = new File(p1.getProject().findMember("bin").getLocation().toString());
Util.zip(rootDir, getExternalResourcePath(libPath));
String[] src2 = new String[] {
"src/module-info.java",
"module com.greetings {\n" +
" requires mod.one;\n" +
"}",
"src/com/greetings/MyTest.java",
"package com.greetings;\n" +
"public class MyTest extends one.p.C {}"
};
IClasspathEntry dep1 = JavaCore.newProjectEntry(p.getPath(), null, false,
new IClasspathAttribute[] {new ClasspathAttribute("module", "true")},
false/*not exported*/);
IClasspathEntry dep2 = JavaCore.newLibraryEntry(new Path(getExternalResourcePath(libPath)), null, null, null,
new IClasspathAttribute[] {
new ClasspathAttribute("module", "true"),
new ClasspathAttribute(IClasspathAttribute.ADD_READS, "mod.one=org.astro")
},
false/*not exported*/);
IJavaProject p2 = setupModuleProject("com.greetings", src2, new IClasspathEntry[] { dep1, dep2 });
getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);
IMarker[] markers = p2.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
assertMarkers("Unexpected markers", "", markers);
IClasspathAttribute[] attrs = new IClasspathAttribute[] {
JavaCore.newClasspathAttribute(IClasspathAttribute.MODULE, "true")
};
setCPAttributes(p2, attrs, dep2);
getWorkspace().build(IncrementalProjectBuilder.AUTO_BUILD, null);
markers = p2.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
assertMarkers("Unexpected markers",
"The project was not built since its build path is incomplete. Cannot find the class file for org.astro.World. Fix the build path then try building this project\n" +
"The type org.astro.World cannot be resolved. It is indirectly referenced from required .class files",
markers);
} finally {
deleteExternalResource(libPath);
deleteProject("mod.one");
deleteProject("org.astro");
deleteProject("com.greetings");
}
}
public void testAddReads2() throws CoreException, IOException {
if (!isJRE9) return;
String libPath = "externalLib/mod.one.jar";
try {
String[] sources = new String[] {
"src/module-info.java",
"module org.astro {\n" +
" exports org.astro;\n" +
"}",
"src/org/astro/World.java",
"package org.astro;\n" +
"public interface World {\n" +
" public String name();\n" +
"}"
};
IJavaProject p = setupModuleProject("org.astro", sources);
String[] src1 = new String[] {
"src/module-info.java",
"module mod.one {\n" +
" exports one.p;\n" +
"}\n",
"src/org/astro/World.java",
"package org.astro;\n" +
"public interface World { public String name(); }\n",
"src/one/p/C.java",
"package one.p;\n" +
"public class C implements org.astro.World {\n" +
" public String name() {\n" +
" return \"C\";\n" +
" }\n" +
"}\n"
};
IJavaProject p1 = setupModuleProject("mod.one", src1);
getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);
// jar-up without the required class, should be supplied by the other module
deleteFile("/mod.one/src/org/astro/World.java");
deleteFile("/mod.one/bin/org/astro/World.class");
File rootDir = new File(p1.getProject().findMember("bin").getLocation().toString());
Util.zip(rootDir, getExternalResourcePath(libPath));
String[] src2 = new String[] {
"src/module-info.java",
"module com.greetings {\n" +
" requires mod.one;\n" +
"}",
"src/com/greetings/MyTest.java",
"package com.greetings;\n" +
"public class MyTest extends one.p.C {}"
};
IClasspathEntry dep1 = JavaCore.newProjectEntry(p.getPath(), null, false,
new IClasspathAttribute[] {new ClasspathAttribute("module", "true")},
false/*not exported*/);
IClasspathEntry dep2 = JavaCore.newLibraryEntry(new Path(getExternalResourcePath(libPath)), null, null, null,
new IClasspathAttribute[] {
new ClasspathAttribute("module", "true"),
},
false/*not exported*/);
IJavaProject p2 = setupModuleProject("com.greetings", src2, new IClasspathEntry[] { dep1, dep2 });
getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);
IMarker[] markers = p2.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
assertMarkers("Unexpected markers",
"The project was not built since its build path is incomplete. Cannot find the class file for org.astro.World. Fix the build path then try building this project\n" +
"The type org.astro.World cannot be resolved. It is indirectly referenced from required .class files",
markers);
IClasspathAttribute[] attrs = new IClasspathAttribute[] {
JavaCore.newClasspathAttribute(IClasspathAttribute.MODULE, "true"),
JavaCore.newClasspathAttribute(IClasspathAttribute.ADD_READS, "mod.one=org.astro")
};
setCPAttributes(p2, attrs, dep2);
getWorkspace().build(IncrementalProjectBuilder.AUTO_BUILD, null);
markers = p2.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
assertMarkers("Unexpected markers", "", markers);
} finally {
deleteExternalResource(libPath);
deleteProject("mod.one");
deleteProject("org.astro");
deleteProject("com.greetings");
}
}
public void _testPatchModule() throws CoreException, IOException {
if (!isJRE9) return;
try {
String[] sources = {
"src/module-info.java",
"module org.astro {\n" +
" requires java.base;\n" +
" requires java.desktop;\n" +
" requires java.datatransfer;\n" +
" requires java.sql;\n" +
" exports org.astro;\n" +
"}\n",
"src/org/astro/Test2.java",
"package org.astro;\n" +
"public class Test2 {\n" +
" java.awt.Window window;\n" +
"}\n"
};
IJavaProject project = setupModuleProject("org.astro", sources);
sources = new String[] {
"src/code/Code.java",
"package code;\n" +
"class Code {\n" +
"}\n",
"src2/org/astro/Galaxy.java",
"package org.astro;\n" +
"public class Galaxy { }\n"
};
IClasspathAttribute[] attributes = {
JavaCore.newClasspathAttribute(IClasspathAttribute.MODULE, "true"),
};
IClasspathEntry cp = JavaCore.newProjectEntry(project.getPath(), null, false, attributes, false);
IJavaProject p2 = setupModuleProject("patch", new String[] {"src", "src2"}, sources, null);
attributes = new IClasspathAttribute[] {
JavaCore.newClasspathAttribute(IClasspathAttribute.MODULE, "true"),
JavaCore.newClasspathAttribute(IClasspathAttribute.PATCH_MODULE, "org.astro")
};
IClasspathEntry cp2 = JavaCore.newProjectEntry(p2.getPath(), null, false, attributes, false);
sources = new String[] {
"src/module-info.java",
"module test {\n" +
" requires org.astro;\n" +
"}\n",
"src/test/Test.java",
"package test;\n" +
"class Test {\n" +
" org.astro.World w = null;\n" +
" org.astro.Galaxy g = null;\n" +
"}\n",
};
IJavaProject p3 = setupModuleProject("test", sources, new IClasspathEntry[] {cp, cp2});
getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);
IMarker[] markers = p3.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
assertMarkers("Unexpected markers",
"",
markers);
} finally {
this.deleteProject("org.astro");
this.deleteProject("patch");
this.deleteProject("test");
}
}
public void testPatchModule() throws CoreException, IOException {
if (!isJRE9) return;
try {
IClasspathAttribute[] attributes = {
JavaCore.newClasspathAttribute(IClasspathAttribute.MODULE, "true")
};
IJavaProject patchProject = createJava9ProjectWithJREAttributes("org.astro.patch", new String[]{"src", "src2"}, attributes);
String[] patchSources = {
"src/org/astro/Test2.java",
"package org.astro;\n" +
"class Test2 {\n" +
" int test(jdk.internal.misc.Unsafe unsafe) {\n" +
" return unsafe.addressSize();\n" +
" }\n" +
"}\n",
"src2/jdk/internal/misc/Test3.java",
"package jdk.internal.misc;\n" +
"class Test3 {\n" +
" Signal.NativeHandler handler;\n" + // package access
"}\n"
};
createSourceFiles(patchProject, patchSources);
getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);
IMarker[] markers = patchProject.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
assertMarkers("Unexpected markers",
"The type jdk.internal.misc.Unsafe is not accessible\n" +
"Signal cannot be resolved to a type",
markers);
attributes = new IClasspathAttribute[] {
JavaCore.newClasspathAttribute(IClasspathAttribute.MODULE, "true"),
JavaCore.newClasspathAttribute(IClasspathAttribute.PATCH_MODULE, "java.base")
};
setJRECPAttributes(patchProject, attributes);
getWorkspace().build(IncrementalProjectBuilder.AUTO_BUILD, null);
markers = patchProject.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
assertMarkers("Unexpected markers",
"",
markers);
} finally {
this.deleteProject("org.astro.patch");
}
}
public void testPatchModule2() throws CoreException, IOException {
if (!isJRE9) return;
try {
IClasspathAttribute[] attributes = {
JavaCore.newClasspathAttribute(IClasspathAttribute.MODULE, "true"),
JavaCore.newClasspathAttribute(IClasspathAttribute.PATCH_MODULE, "java.base")
};
IJavaProject patchProject = createJava9ProjectWithJREAttributes("org.astro.patch", new String[]{"src", "src2"}, attributes);
String[] patchSources = {
"src/org/astro/Test2.java",
"package org.astro;\n" +
"class Test2 {\n" +
" int test(jdk.internal.misc.Unsafe unsafe) {\n" +
" return unsafe.addressSize();\n" +
" }\n" +
"}\n",
"src2/jdk/internal/misc/Test3.java",
"package jdk.internal.misc;\n" +
"class Test3 {\n" +
" Signal.NativeHandler handler;\n" + // package access
"}\n"
};
createSourceFiles(patchProject, patchSources);
getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null);
attributes = new IClasspathAttribute[] {
JavaCore.newClasspathAttribute(IClasspathAttribute.MODULE, "true"),
};
setJRECPAttributes(patchProject, attributes);
getWorkspace().build(IncrementalProjectBuilder.AUTO_BUILD, null);
IMarker[] markers = patchProject.getProject().findMarkers(null, true, IResource.DEPTH_INFINITE);
assertMarkers("Unexpected markers",
"The type jdk.internal.misc.Unsafe is not accessible\n" +
"Signal cannot be resolved to a type",
markers);
} finally {
this.deleteProject("org.astro.patch");
}
}
private void setCPAttributes(IJavaProject javaProject, IClasspathAttribute[] attributes, IClasspathEntry entryToReplace) throws JavaModelException {
IClasspathEntry[] oldClasspath= javaProject.getRawClasspath();
int nEntries= oldClasspath.length;
IClasspathEntry[] newEntries= Arrays.copyOf(oldClasspath, nEntries);
for (int i = 0; i < newEntries.length; i++) {
if (newEntries[i].getPath().equals(entryToReplace.getPath())) {
switch(entryToReplace.getEntryKind()) {
case IClasspathEntry.CPE_PROJECT:
newEntries[i] = JavaCore.newProjectEntry(entryToReplace.getPath(), entryToReplace.getAccessRules(), entryToReplace.combineAccessRules(), attributes, entryToReplace.isExported());
break;
case IClasspathEntry.CPE_LIBRARY:
newEntries[i] = JavaCore.newLibraryEntry(entryToReplace.getPath(), newEntries[i].getSourceAttachmentPath(), null, null, attributes, false);
break;
default:
// not supported
break;
}
break;
}
}
javaProject.setRawClasspath(newEntries, null);
}
private void setJRECPAttributes(IJavaProject javaProject, IClasspathAttribute[] attributes) throws JavaModelException {
IClasspathEntry[] oldClasspath= javaProject.getRawClasspath();
int nEntries= oldClasspath.length;
IClasspathEntry[] newEntries= Arrays.copyOf(oldClasspath, nEntries);
for (int i = 0; i < newEntries.length; i++) {
if (newEntries[i].getPath().equals(getJRE9Path())) {
newEntries[i] = JavaCore.newLibraryEntry(getJRE9Path(), newEntries[i].getSourceAttachmentPath(), null, null, attributes, false);
break;
}
}
javaProject.setRawClasspath(newEntries, null);
}
}