always make a copy reference of the prototype with Object.create
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 e70a726..69e98f2 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
@@ -594,12 +594,10 @@
}
} else if (method.getName().equals("create")
&& RTypes.OBJECT.getDeclaration().equals(
- method.getDeclaringType())) {
- if (arguments.length == 1)
- return arguments[0];
- else if (arguments.length == 2) {
- AnonymousValue value = new AnonymousValue();
- value.addValue(arguments[0], false);
+ method.getDeclaringType()) && arguments.length > 0) {
+ AnonymousValue value = new AnonymousValue();
+ value.addValue(arguments[0], false);
+ if (arguments.length == 2) {
JSTypeSet types = arguments[1].getTypes();
for (IRType type : types) {
if (type instanceof IRRecordType) {
@@ -622,7 +620,6 @@
.recordType(newMembers)), true);
}
}
-
return value;
}
}
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 1c43b4a..cbac402 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
@@ -3880,4 +3880,39 @@
assertEquals(JavaScriptProblems.DEPRECATED_FUNCTION, problems.get(2)
.getID());
}
+
+ public void testObjectCreateWith2SubclassesUsingtheBase() {
+ final StringList code = new StringList();
+ code.add("function AbstractMessage(format, parameters, throwable) {");
+ code.add(" this.throwable = throwable");
+ code.add("}");
+ code.add("/**");
+ code.add(" * @return {Error}");
+ code.add(" */");
+ code.add(" AbstractMessage.prototype.getThrowable = function() {");
+ code.add(" return null;");
+ code.add("}");
+ code.add("function ObjectMessage(object) {}");
+ code.add("ObjectMessage.prototype = Object.create(AbstractMessage.prototype)");
+ code.add("ObjectMessage.prototype.constructor = ObjectMessage");
+ code.add("ObjectMessage.prototype.getThrowable = function() {");
+ code.add(" return (this.format instanceof Error) ? this.format : null");
+ code.add("}");
+ code.add("function LogEvent(message) {");
+ code.add(" /**");
+ code.add(" * @type {AbstractMessage}");
+ code.add(" */");
+ code.add(" this.message = message");
+ code.add("}");
+ code.add("function OutputAppender() {}");
+ code.add("/**");
+ code.add(" * @param {LogEvent} logEvent");
+ code.add(" */");
+ code.add("OutputAppender.prototype.append = function(logEvent){");
+ code.add(" var ex2 = logEvent.message.getThrowable()");
+ code.add(" ex2.stack");
+ code.add("}");
+ final List<IProblem> problems = validate(code.toString());
+ assertEquals(problems.toString(), 0, problems.size());
+ }
}