reference model saver
diff --git a/javascript/tools/org.eclipse.dltk.javascript.dev-tools/META-INF/MANIFEST.MF b/javascript/tools/org.eclipse.dltk.javascript.dev-tools/META-INF/MANIFEST.MF
index 7ae5a4b..a6bdb6c 100644
--- a/javascript/tools/org.eclipse.dltk.javascript.dev-tools/META-INF/MANIFEST.MF
+++ b/javascript/tools/org.eclipse.dltk.javascript.dev-tools/META-INF/MANIFEST.MF
@@ -4,6 +4,9 @@
 Bundle-SymbolicName: org.eclipse.dltk.javascript.dev_tools
 Bundle-Version: 1.0.0.qualifier
 Require-Bundle: org.eclipse.core.runtime,
- org.eclipse.dltk.javascript.rhino
+ org.eclipse.dltk.javascript.core,
+ org.eclipse.dltk.javascript.rhino,
+ org.eclipse.emf.ecore,
+ org.eclipse.emf.ecore.xmi
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/javascript/tools/org.eclipse.dltk.javascript.dev-tools/src/org/eclipse/dltk/javascript/developertools/ReferenceModelSaver.java b/javascript/tools/org.eclipse.dltk.javascript.dev-tools/src/org/eclipse/dltk/javascript/developertools/ReferenceModelSaver.java
new file mode 100644
index 0000000..a28fcb7
--- /dev/null
+++ b/javascript/tools/org.eclipse.dltk.javascript.dev-tools/src/org/eclipse/dltk/javascript/developertools/ReferenceModelSaver.java
@@ -0,0 +1,134 @@
+/*******************************************************************************
+ * Copyright (c) 2010 xored software, Inc.
+ *
+ * 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
+ *
+ * Contributors:
+ *     xored software, Inc. - initial API and Implementation (Alex Panchenko)
+ *******************************************************************************/
+package org.eclipse.dltk.javascript.developertools;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.dltk.internal.javascript.reference.resolvers.SelfCompletingReference;
+import org.eclipse.dltk.internal.javascript.typeinference.IReference;
+import org.eclipse.dltk.internal.javascript.typeinference.NativeArrayReference;
+import org.eclipse.dltk.internal.javascript.typeinference.NativeBooleanReference;
+import org.eclipse.dltk.internal.javascript.typeinference.NativeDateReference;
+import org.eclipse.dltk.internal.javascript.typeinference.NativeNumberReference;
+import org.eclipse.dltk.internal.javascript.typeinference.NativeStringReference;
+import org.eclipse.dltk.internal.javascript.typeinference.NativeXMLReference;
+import org.eclipse.dltk.internal.javascript.typeinference.StandardSelfCompletingReference;
+import org.eclipse.dltk.javascript.internal.model.references.Member;
+import org.eclipse.dltk.javascript.internal.model.references.Method;
+import org.eclipse.dltk.javascript.internal.model.references.Parameter;
+import org.eclipse.dltk.javascript.internal.model.references.ReferenceModelFactory;
+import org.eclipse.dltk.javascript.internal.model.references.Type;
+import org.eclipse.emf.ecore.xmi.XMIResource;
+import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
+
+public class ReferenceModelSaver {
+
+	public static void main(String[] args) throws IOException {
+		final Map<Class<? extends StandardSelfCompletingReference>, Type> types = new HashMap<Class<? extends StandardSelfCompletingReference>, Type>();
+		types.put(NativeBooleanReference.class, createType("Boolean"));
+		types.put(NativeNumberReference.class, createType("Number"));
+		types.put(NativeStringReference.class, createType("String"));
+		types.put(NativeArrayReference.class, createType("Array"));
+		types.put(NativeDateReference.class, createType("Date"));
+		types.put(NativeXMLReference.class, createType("XML"));
+		processType(new NativeBooleanReference("A"), types);
+		processType(new NativeNumberReference("A"), types);
+		processType(new NativeStringReference("A"), types);
+		processType(new NativeArrayReference("A"), types);
+		processType(new NativeDateReference("A"), types);
+		processType(new NativeXMLReference("A"), types);
+		final XMIResource resource = new XMIResourceImpl();
+		List<Type> typeList = new ArrayList<Type>(types.values());
+		Collections.sort(typeList, new Comparator<Type>() {
+			public int compare(Type o1, Type o2) {
+				return String.CASE_INSENSITIVE_ORDER.compare(o1.getName(), o2
+						.getName());
+			}
+		});
+		resource.getContents().addAll(typeList);
+		resource.setEncoding("UTF-8");
+		resource.save(System.out, null);
+	}
+
+	private static void processType(
+			StandardSelfCompletingReference typeRef,
+			final Map<Class<? extends StandardSelfCompletingReference>, Type> types) {
+		final Type type = types.get(typeRef.getClass());
+		Assert.isNotNull(type);
+		final List<IReference> children = new ArrayList<IReference>(typeRef
+				.getChilds(true));
+		Collections.sort(children, new Comparator<IReference>() {
+			public int compare(IReference o1, IReference o2) {
+				return String.CASE_INSENSITIVE_ORDER.compare(o1.getName(), o2
+						.getName());
+			}
+		});
+		for (IReference reference : children) {
+			if (!(reference instanceof SelfCompletingReference)) {
+				System.out.println(reference.getName() + " skipped");
+				continue;
+			}
+			SelfCompletingReference ref = (SelfCompletingReference) reference;
+			final Member member;
+			if (reference.isFunctionRef()) {
+				Method method = ReferenceModelFactory.eINSTANCE.createMethod();
+				final String[] parameterNames = ref.getParameterNames();
+				if (parameterNames != null) {
+					for (String paramName : parameterNames) {
+						final Parameter parameter = ReferenceModelFactory.eINSTANCE
+								.createParameter();
+						parameter.setName(paramName);
+						parameter.setOptional(!isIdentifier(paramName));
+						method.getParameters().add(parameter);
+					}
+				}
+				member = method;
+			} else {
+				member = ReferenceModelFactory.eINSTANCE.createProperty();
+			}
+			member.setName(reference.getName());
+			member.setType(types.get(ref.getClass()));
+			member.setDescription(ref.getProposalInfo());
+			type.getMembers().add(member);
+		}
+	}
+
+	/**
+	 * @param name
+	 * @return
+	 */
+	private static boolean isIdentifier(String name) {
+		for (int i = 0; i < name.length(); ++i) {
+			if (i == 0) {
+				if (!Character.isJavaIdentifierStart(name.charAt(i))) {
+					return false;
+				}
+			} else if (!Character.isJavaIdentifierPart(name.charAt(i))) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	private static Type createType(String name) {
+		Type type = ReferenceModelFactory.eINSTANCE.createType();
+		type.setName(name);
+		return type;
+	}
+}