diff options
author | Stephan Herrmann | 2017-10-10 13:13:55 +0000 |
---|---|---|
committer | Stephan Herrmann | 2017-11-07 14:36:25 +0000 |
commit | 61e0b5004ce74c3fe43e05009fd3dce1e688331e (patch) | |
tree | 28ab0e5fd6810f889d3ddcce9aadcd6da82f2226 | |
parent | 89d027a32400905e02f236e34d2b8a117e9cb48b (diff) | |
download | eclipse.jdt.core-61e0b5004ce74c3fe43e05009fd3dce1e688331e.tar.gz eclipse.jdt.core-61e0b5004ce74c3fe43e05009fd3dce1e688331e.tar.xz eclipse.jdt.core-61e0b5004ce74c3fe43e05009fd3dce1e688331e.zip |
Change-Id: Id115cbafcd6fb9e78decb757b786a778e987623f
2 files changed, 69 insertions, 0 deletions
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 99596cc0e9..f1af2d6ebb 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 @@ -5862,6 +5862,70 @@ public class ModuleBuilderTests extends ModifyingResourceTests { } } + public void testBug525522() throws Exception { + if (!isJRE9) return; + String save = System.getProperty("modules.to.load"); + System.setProperty("modules.to.load", "java.base;java.desktop;java.rmi;java.sql;java.jnlp"); + JRTUtil.reset(); + ClasspathJrt.resetCaches(); + try { + // non-modular substitute for java.jnlp: + IClasspathAttribute[] jreAttribs = { JavaCore.newClasspathAttribute(IClasspathAttribute.LIMIT_MODULES, "java.base,java.desktop,java.rmi,java.sql") }; + IJavaProject jnlp = createJava9ProjectWithJREAttributes("jnlp", new String[] {"src"}, jreAttribs); + createFolder("jnlp/src/javax/jnlp"); + createFile("jnlp/src/javax/jnlp/UnavailableServiceException.java", + "package javax.jnlp;\n" + + "@SuppressWarnings(\"serial\")\n" + + "public class UnavailableServiceException extends Exception {\n" + + "}\n"); + createFile("jnlp/src/javax/jnlp/ServiceManager.java", + "package javax.jnlp;\n" + + "public class ServiceManager {\n" + + " public static void lookup(String s) throws UnavailableServiceException {}\n" + + "}\n"); + + // non-modular project consuming the non-modular jnlp, instead of the module from the JRE: + IJavaProject p1 = createJava9ProjectWithJREAttributes("nonmod1", new String[] {"src"}, jreAttribs); + addClasspathEntry(p1, JavaCore.newProjectEntry(jnlp.getPath())); + + createFolder("nonmod1/src/test"); + createFile("nonmod1/src/test/Test.java", + "package test;\n" + + "import javax.jnlp.ServiceManager;\n" + + "import javax.jnlp.UnavailableServiceException;\n" + + "\n" + + "public class Test {\n" + + "\n" + + " void init() {\n" + + " try {\n" + + " ServiceManager.lookup(\"\");\n" + + " } catch (final UnavailableServiceException e) {\n" + + " e.printStackTrace();\n" + + " }\n" + + "\n" + + " }\n" + + "}\n"); + p1.getProject().getWorkspace().build(IncrementalProjectBuilder.FULL_BUILD, null); + assertNoErrors(); + + this.problemRequestor.reset(); + ICompilationUnit cu = getCompilationUnit("/nonmod1/src/test/Test.java"); + cu.getWorkingCopy(this.wcOwner, null); + assertProblems( + "Unexpected problems", + "----------\n" + + "----------\n", + this.problemRequestor); + + } finally { + System.setProperty("modules.to.load", save); + JRTUtil.reset(); + ClasspathJrt.resetCaches(); + deleteProject("jnlp"); + deleteProject("nonmod1"); + } + } + 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/model/org/eclipse/jdt/internal/core/builder/NameEnvironment.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/NameEnvironment.java index fe90c9135d..bcf5f72c6c 100644 --- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/NameEnvironment.java +++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/builder/NameEnvironment.java @@ -449,6 +449,11 @@ private NameEnvironmentAnswer findClass(String qualifiedTypeName, char[] typeNam } NameEnvironmentAnswer answer = classpathLocation.findClass(binaryFileName, qPackageName, moduleName, qBinaryFileName, false); if (answer != null) { + char[] answerMod = answer.moduleName(); + if (answerMod != null && this.modulePathEntries != null) { + if (!this.modulePathEntries.containsKey(String.valueOf(answerMod))) + continue; // assumed to be filtered out by --limit-modules + } if (!answer.ignoreIfBetter()) { if (answer.isBetter(suggestedAnswer)) return answer; |