Bug 521328: [9][assist] completing after "requires" shows proposals with
a folder icon

Change-Id: Idf9ed64e65c8a487efef13b3c4fb92c7a82ba09b
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/LazyModuleCompletionProposal.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/LazyModuleCompletionProposal.java
index f64952f..4bdf9d9 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/LazyModuleCompletionProposal.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/LazyModuleCompletionProposal.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2016 IBM Corporation and others.
+ * Copyright (c) 2016, 2017 IBM Corporation and others.
  * 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
@@ -16,17 +16,31 @@
 package org.eclipse.jdt.internal.ui.text.java;
 
 import org.eclipse.jdt.core.CompletionProposal;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaProject;
 
 import org.eclipse.jdt.ui.text.java.JavaContentAssistInvocationContext;
 
 public class LazyModuleCompletionProposal extends LazyJavaCompletionProposal {
 
+	private ICompilationUnit fCompilationUnit;
+	
 	public LazyModuleCompletionProposal(CompletionProposal proposal, JavaContentAssistInvocationContext context) {
 		super(proposal, context);
+		fCompilationUnit= context.getCompilationUnit();
 	}
-
 	@Override
 	protected ProposalInfo computeProposalInfo() {
+
+		IJavaProject project;
+		if (fCompilationUnit != null)
+			project= fCompilationUnit.getJavaProject();
+		else
+			project= fInvocationContext.getProject();
+		if (project != null) {
+			return new ModuleProposalInfo(project, fProposal);
+		}
+
 		return super.computeProposalInfo();
 	}
 }
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/ModuleProposalInfo.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/ModuleProposalInfo.java
new file mode 100644
index 0000000..32ae191
--- /dev/null
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/ModuleProposalInfo.java
@@ -0,0 +1,63 @@
+/*******************************************************************************
+ * Copyright (c) 2017 GK Software AG, and others.
+ * 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
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
+ * Contributors:
+ *     Stephan Herrmann - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.internal.ui.text.java;
+
+import org.eclipse.core.runtime.Assert;
+
+import org.eclipse.jdt.core.CompletionProposal;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaModelException;
+
+public class ModuleProposalInfo extends ProposalInfo {
+
+	private boolean fJavaElementResolved= false;
+
+	private final IJavaProject fJavaProject;
+
+	private final CompletionProposal fProposal;
+
+	ModuleProposalInfo(IJavaProject project, CompletionProposal proposal) {
+		Assert.isNotNull(project);
+		Assert.isNotNull(proposal);
+		fJavaProject= project;
+		fProposal= proposal;
+	}
+
+	@Override
+	public IJavaElement getJavaElement() throws JavaModelException {
+		if (!fJavaElementResolved) {
+			fJavaElementResolved= true;
+			fElement= resolveModule();
+		}
+		return fElement;
+	}
+
+	/**
+	 * Resolves to an IModuleDescription.
+	 * 
+	 * @return the <code>IModuleDescription</code> or <code>null</code> if no Java element can be found
+	 * @throws JavaModelException thrown if the given path is <code>null</code> or absolute
+	 */
+	private IJavaElement resolveModule() throws JavaModelException {
+		char[] signature= fProposal.getDeclarationSignature();
+		if (signature != null) {
+			String typeName= String.valueOf(signature);
+			return fJavaProject.findModule(typeName, null);
+		}
+		return null;
+	}
+
+}
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/text/java/CompletionProposalLabelProvider.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/text/java/CompletionProposalLabelProvider.java
index e48bf4c..1fe3028 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/text/java/CompletionProposalLabelProvider.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/text/java/CompletionProposalLabelProvider.java
@@ -19,7 +19,6 @@
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.jface.viewers.StyledString;
 
-import org.eclipse.ui.ide.IDE;
 
 import org.eclipse.jdt.core.CompletionContext;
 import org.eclipse.jdt.core.CompletionProposal;
@@ -33,7 +32,6 @@
 import org.eclipse.jdt.ui.JavaElementImageDescriptor;
 import org.eclipse.jdt.ui.JavaElementLabels;
 
-import org.eclipse.jdt.internal.ui.JavaPlugin;
 import org.eclipse.jdt.internal.ui.JavaPluginImages;
 import org.eclipse.jdt.internal.core.manipulation.util.BasicElementLabels;
 import org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider;
@@ -663,7 +661,7 @@
 				descriptor= JavaPluginImages.DESC_OBJS_PACKAGE;
 				break;
 			case CompletionProposal.MODULE_REF:
-				descriptor= JavaPlugin.getDefault().getWorkbench().getSharedImages().getImageDescriptor(IDE.SharedImages.IMG_OBJ_PROJECT);
+				descriptor= JavaPluginImages.DESC_OBJS_MODULE;
 				break;
 			case CompletionProposal.KEYWORD:
 			case CompletionProposal.LABEL_REF: