Bug 525522: [9] NullPointerException when compiling java9 project

Change-Id: Id115cbafcd6fb9e78decb757b786a778e987623f
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 df82c75..a985e32 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
@@ -5933,6 +5933,70 @@
 		}
 	}
 
+	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 b6a283b..9b0f03a 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
@@ -447,6 +447,11 @@
 		}
 		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;