prototype initialized with a record type fixes
diff --git a/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/ti/TypeInferencerVisitor.java b/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/ti/TypeInferencerVisitor.java
index 949ffd6..4c2a4c2 100644
--- a/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/ti/TypeInferencerVisitor.java
+++ b/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/ti/TypeInferencerVisitor.java
@@ -467,6 +467,17 @@
 							}
 						}
 					}
+				} else {
+					// create a new object if prototype is directly set to record type value.
+					Object attribute = left
+							.getAttribute(IReferenceAttributes.ELEMENT);
+					if (attribute instanceof IRProperty
+							&& ((IRProperty) attribute).getName().equals(
+									IRLocalType.PROTOTYPE_PROPERTY)) {
+						left.getParent()
+								.createChild(IRLocalType.PROTOTYPE_PROPERTY)
+								.setValue(new AnonymousValue());
+					}
 				}
 			}
 			if (IValueReference.ARRAY_OP.equals(left.getName())
diff --git a/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/javascript/typeinfo/RLocalType.java b/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/javascript/typeinfo/RLocalType.java
index c81c57e..c8dc5f1 100644
--- a/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/javascript/typeinfo/RLocalType.java
+++ b/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/javascript/typeinfo/RLocalType.java
@@ -11,6 +11,7 @@
  *******************************************************************************/

 package org.eclipse.dltk.javascript.typeinfo;

 

+import java.util.Collection;

 import java.util.HashSet;

 import java.util.Set;

 

@@ -81,9 +82,9 @@
 			if (fromChild == null) {

 				IValueReference prototype = irType.functionValue

 						.getChild(PROTOTYPE_PROPERTY);

-				if (prototype.getDirectChildren().contains(name)) {

-					return prototype.getChild(name);

-				}

+				fromChild = prototype.getChild(name);

+				if (!fromChild.exists())

+					fromChild = null;

 			}

 			return fromChild;

 		}

@@ -106,6 +107,7 @@
 			IValueReference prototype = rLocalType.functionValue

 					.getChild(PROTOTYPE_PROPERTY);

 			children.addAll(prototype.getDirectChildren());

+			fillDeclaredLocalTypesChildren(children, prototype.getTypes(), set);

 			fillDeclaredLocalTypesChildren(children, value

 					.getDeclaredTypes(), set);

 		}

@@ -124,6 +126,12 @@
 						.getDirectChildren(IValue.NO_LOCAL_TYPES));

 				fillDeclaredLocalTypesChildren(children, ((RLocalType) irType)

 						.getValue().getDeclaredTypes(), set);

+			} else if (irType instanceof RRecordType && set.add(irType)) {

+				Collection<IRRecordMember> members = ((RRecordType) irType)

+						.getMembers();

+				for (IRRecordMember member : members) {

+					children.add(member.getName());

+				}

 			}

 		}

 	}

diff --git a/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/contentassist/CodeCompletion.java b/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/contentassist/CodeCompletion.java
index 63030a4..296d5ff 100644
--- a/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/contentassist/CodeCompletion.java
+++ b/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/contentassist/CodeCompletion.java
@@ -987,4 +987,30 @@
 		}
 		assertEquals(3, found);
 	}
+	
+	public void testPrototypeWithRecordTypeConstruction() {
+		final StringList code = new StringList();
+		code.add("function D1() {}");
+		code.add("D1.prototype = {test: function(){}}");
+		code.add("D1.prototype.testDirectAssignment = function(){}");
+		code.add("var x = new D1()");
+		code.add("x.");
+		final IModuleSource module = new TestModule(code.toString());
+		final List<CompletionProposal> results = new ArrayList<CompletionProposal>();
+		final ICompletionEngine completionEngine = createEngine(results,
+				JSCompletionEngine.OPTION_KEYWORDS);
+		completionEngine.complete(module, lastPositionInFile(".", module), 0);
+		int found = 0;
+		for (CompletionProposal completionProposal : results) {
+			if (completionProposal.getName().equals("test")) {
+				found++;
+			}
+			if (completionProposal.getName().equals("testDirectAssignment")) {
+				found++;
+			}
+		}
+		assertEquals(2, found);
+	}
+	
+
 }
diff --git a/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/validation/TypeInfoValidationTests.java b/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/validation/TypeInfoValidationTests.java
index 329cd39..36babc0 100644
--- a/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/validation/TypeInfoValidationTests.java
+++ b/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/validation/TypeInfoValidationTests.java
@@ -3693,4 +3693,17 @@
 		final List<IProblem> problems = validate(code.toString());
 		assertEquals(problems.toString(), 0, problems.size());
 	}
+	
+	
+	public void testPrototypeWithRecordTypeConstruction() {
+		final StringList code = new StringList();
+		code.add("function D1() {}");
+		code.add("D1.prototype = {test: function(a){}}");
+		code.add("D1.prototype.testDirectAssignment = function(b){}");
+		code.add("var x = new D1()");
+		code.add("x.test(1)");
+		code.add("x.testDirectAssignment(2)");
+		final List<IProblem> problems = validate(code.toString());
+		assertEquals(problems.toString(), 0, problems.size());
+	}
 }