if the value reference is a ELEMENT reference, do report that instead 
so that LocalTypes with prototypes that can have record types inside
them are reported really as a good function
diff --git a/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/javascript/internal/core/codeassist/JavaScriptCompletionEngine2.java b/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/javascript/internal/core/codeassist/JavaScriptCompletionEngine2.java
index 7cda77f..4db9b29 100644
--- a/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/javascript/internal/core/codeassist/JavaScriptCompletionEngine2.java
+++ b/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/javascript/internal/core/codeassist/JavaScriptCompletionEngine2.java
@@ -583,64 +583,74 @@
 		 * @param reference
 		 */
 		private void reportReference(IValueReference reference) {
-			int proposalKind = CompletionProposal.FIELD_REF;
-			final ReferenceKind kind = reference.getKind();
-			if (reference.getAttribute(IReferenceAttributes.PHANTOM, true) == null
-					&& (kind == ReferenceKind.FUNCTION || reference
-							.hasChild(IValueReference.FUNCTION_OP))) {
-				proposalKind = CompletionProposal.METHOD_REF;
-			} else if (kind == ReferenceKind.LOCAL) {
-				proposalKind = CompletionProposal.LOCAL_VARIABLE_REF;
-			}
-			CompletionProposal proposal = CompletionProposal.create(
-					proposalKind, position);
+			Object element = reference
+					.getAttribute(IReferenceAttributes.ELEMENT);
+			if (element instanceof IRMember) {
+				reportMember((IRMember) element,
+						((IRMember) element).getName(), true);
+			} else {
+				int proposalKind = CompletionProposal.FIELD_REF;
+				final ReferenceKind kind = reference.getKind();
+				if (reference.getAttribute(IReferenceAttributes.PHANTOM, true) == null
+						&& (kind == ReferenceKind.FUNCTION || reference
+								.hasChild(IValueReference.FUNCTION_OP))) {
+					proposalKind = CompletionProposal.METHOD_REF;
+				} else if (kind == ReferenceKind.LOCAL) {
+					proposalKind = CompletionProposal.LOCAL_VARIABLE_REF;
+				}
+				CompletionProposal proposal = CompletionProposal.create(
+						proposalKind, position);
 
-			int relevance = computeBaseRelevance();
-			relevance += computeRelevanceForInterestingProposal();
-			relevance += computeRelevanceForCaseMatching(prefix,
-					reference.getName());
-			relevance += computeRelevanceForRestrictions(IAccessRule.K_ACCESSIBLE);
-			proposal.setRelevance(relevance);
+				int relevance = computeBaseRelevance();
+				relevance += computeRelevanceForInterestingProposal();
+				relevance += computeRelevanceForCaseMatching(prefix,
+						reference.getName());
+				relevance += computeRelevanceForRestrictions(IAccessRule.K_ACCESSIBLE);
+				proposal.setRelevance(relevance);
 
-			proposal.setCompletion(proposalKind == CompletionProposal.METHOD_REF ? reference
-					.getName() + "()"
-					: reference.getName());
-			proposal.setName(reference.getName());
-			proposal.setExtraInfo(reference);
-			if (proposalKind == CompletionProposal.METHOD_REF) {
-				final IRMethod method = (IRMethod) reference.getAttribute(
-						IReferenceAttributes.R_METHOD, true);
-				if (method != null) {
-					int paramCount = method.getParameterCount();
-					if (paramCount > 0) {
-						final String[] params = new String[paramCount];
-						for (int i = 0; i < paramCount; ++i) {
-							params[i] = method.getParameters().get(i).getName();
-						}
-						proposal.setParameterNames(params);
-						if (method.getParameters().get(paramCount - 1)
-								.getKind() != ParameterKind.NORMAL) {
-							int requiredCount = method.getParameters().size();
-							while (requiredCount > 0
-									&& method.getParameters()
-											.get(requiredCount - 1).getKind() != ParameterKind.NORMAL) {
-								--requiredCount;
+				proposal.setCompletion(proposalKind == CompletionProposal.METHOD_REF ? reference
+						.getName() + "()"
+						: reference.getName());
+				proposal.setName(reference.getName());
+				proposal.setExtraInfo(reference);
+				if (proposalKind == CompletionProposal.METHOD_REF) {
+					final IRMethod method = (IRMethod) reference.getAttribute(
+							IReferenceAttributes.R_METHOD, true);
+					if (method != null) {
+						int paramCount = method.getParameterCount();
+						if (paramCount > 0) {
+							final String[] params = new String[paramCount];
+							for (int i = 0; i < paramCount; ++i) {
+								params[i] = method.getParameters().get(i)
+										.getName();
 							}
-							if (requiredCount == 0
-									&& method.getParameters()
-											.get(requiredCount).getKind() == ParameterKind.VARARGS) {
-								++requiredCount; // heuristic...
-							}
-							if (requiredCount != paramCount) {
-								proposal.setAttribute(
-										CompletionProposal.ATTR_REQUIRED_PARAM_COUNT,
-										requiredCount);
+							proposal.setParameterNames(params);
+							if (method.getParameters().get(paramCount - 1)
+									.getKind() != ParameterKind.NORMAL) {
+								int requiredCount = method.getParameters()
+										.size();
+								while (requiredCount > 0
+										&& method.getParameters()
+												.get(requiredCount - 1)
+												.getKind() != ParameterKind.NORMAL) {
+									--requiredCount;
+								}
+								if (requiredCount == 0
+										&& method.getParameters()
+												.get(requiredCount).getKind() == ParameterKind.VARARGS) {
+									++requiredCount; // heuristic...
+								}
+								if (requiredCount != paramCount) {
+									proposal.setAttribute(
+											CompletionProposal.ATTR_REQUIRED_PARAM_COUNT,
+											requiredCount);
+								}
 							}
 						}
 					}
 				}
+				accept(proposal);
 			}
-			accept(proposal);
 		}
 
 		public void reportTypeRef(Type type) {