fix to support for Object.create(null)
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 1f0c063..1087f11 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
@@ -408,7 +408,7 @@ RTypes.localType(name, context .getParent().getChild(name))); } - } + } else { left.setKind(ReferenceKind.FIELD); final Comment comment = JSDocSupport @@ -536,8 +536,7 @@ if (methods != null && methods.size() == 1) { final IRMethod method = methods.get(0); IValueReference ref = checkSpecialJavascriptFunctionCalls( - reference, - arguments, method); + reference, arguments, method); if (ref != null) return ref; if (method.isGeneric()) { @@ -597,10 +596,12 @@ } } else if (method.getName().equals("create") && RTypes.OBJECT.getDeclaration().equals( - method.getDeclaringType()) && arguments.length > 0) { + method.getDeclaringType()) && arguments.length > 0 + && arguments[0] != null) { AnonymousValue value = new AnonymousValue(); IValue argumentValue = ((IValueProvider) arguments[0]) .getValue(); + if (argumentValue != null) value.getValue().addValue(argumentValue); if (arguments.length == 2) { @@ -616,9 +617,9 @@ .getType()).getMember("value"); if (valueMember != null) { newMembers.add(new RRecordMember(member - .getName(), valueMember + .getName(), valueMember .getType(), member - .getSource())); + .getSource())); } valueMember = ((IRRecordType) member .getType()).getMember("get"); @@ -639,7 +640,7 @@ } if (newMembers.size() > 0) { value.addValue(ConstantValue.of(RTypes - .recordType(newMembers)), true); + .recordType(newMembers)), true); } } }
diff --git a/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/typeinference/TypeInferenceTests.java b/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/typeinference/TypeInferenceTests.java index 7bc391a..9dbda10 100644 --- a/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/typeinference/TypeInferenceTests.java +++ b/tests/org.eclipse.dltk.javascript.core.tests/src/org/eclipse/dltk/javascript/core/tests/typeinference/TypeInferenceTests.java
@@ -1367,5 +1367,14 @@ assertEquals(20, location.getNameStart()); assertEquals(26, location.getNameEnd()); } + + public void testObjectCreateCallWithNull() { + final StringList code = new StringList(); + code.add("var p = Object.create(null)"); + final IValueCollection collection = inference(code.toString()); + IValueReference func = collection.getChild("p").getChild("hasOwnProperty"); + assertTrue(func.exists()); + + } }