fix for re-assignment to prototype.
diff --git a/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/validation/TypeInfoValidator.java b/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/validation/TypeInfoValidator.java
index a532eb5..0d4a14f 100644
--- a/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/validation/TypeInfoValidator.java
+++ b/plugins/org.eclipse.dltk.javascript.core/src/org/eclipse/dltk/internal/javascript/validation/TypeInfoValidator.java
@@ -94,6 +94,7 @@
import org.eclipse.dltk.javascript.typeinfo.IRConstructor;
import org.eclipse.dltk.javascript.typeinfo.IRElement;
import org.eclipse.dltk.javascript.typeinfo.IRFunctionType;
+import org.eclipse.dltk.javascript.typeinfo.IRLocalType;
import org.eclipse.dltk.javascript.typeinfo.IRMapType;
import org.eclipse.dltk.javascript.typeinfo.IRMember;
import org.eclipse.dltk.javascript.typeinfo.IRMethod;
@@ -1814,8 +1815,19 @@
// test if it is not a function override of a super local type class.
Set<String> directChildren = null;
if (reference.getParent() != null)
- directChildren = reference.getParent().getDirectChildren(
+ if (reference.getParent().getName()
+ .equals(IRLocalType.PROTOTYPE_PROPERTY)) {
+ directChildren = Collections.emptySet(); // just ignore
+ // it if it
+ // is an
+ // assignment
+ // to
+ // prototype
+ } else {
+ directChildren = reference.getParent()
+ .getDirectChildren(
IValue.NO_LOCAL_TYPES);
+ }
if (directChildren == null
|| directChildren.contains(reference.getName())) {
reporter.reportProblem(JavaScriptProblems.UNASSIGNABLE_ELEMENT,
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 6d871b7..cbc9e85 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
@@ -3748,6 +3748,42 @@
}
+ public void testPrototypeOverrideFunctions() {
+ final StringList code = new StringList();
+ code.add("function Base(name) {");
+ code.add(" this.name = name");
+ code.add("}");
+ code.add("Base.prototype = {");
+ code.add(" method: function(a,b,c) {");
+ code.add(" return 'method1 in base called'");
+ code.add(" }");
+ code.add("}");
+ code.add("Base.prototype.method2 = function(a,b,c) {");
+ code.add(" return 'method2 in base called'");
+ code.add("}");
+ code.add("/**");
+ code.add(" * @extends {Base}");
+ code.add(" */");
+ code.add("function Sub(name, age) {");
+ code.add(" Base.call(this, name)");
+ code.add(" this.age = age");
+ code.add("}");
+ code.add("Sub.prototype = Object.create(Base.prototype, {");
+ code.add(" method: {");
+ code.add(" value: function(a,b) {");
+ code.add(" return 'method1 in sub called'");
+ code.add(" },");
+ code.add(" enumerable: true");
+ code.add(" }");
+ code.add(" })");
+ code.add("Sub.prototype.method2 = function(a,b,c) {");
+ code.add(" return 'method2 in sub called'");
+ code.add("}");
+ final List<IProblem> problems = validate(code.toString());
+ assertEquals(problems.toString(), 0, problems.size());
+
+ }
+
public void testApplyCall() {
final StringList code = new StringList();
code.add("function test() {var args = Array.prototype.slice.apply(arguments, [1]);");