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());
+ }
}