fix for code completion of prototype created through 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 69e98f2..f31370e 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
@@ -616,12 +616,14 @@ } } } - value.addValue(ConstantValue.of(RTypes + if (newMembers.size() > 0) { + value.addValue(ConstantValue.of(RTypes .recordType(newMembers)), true); + } } } - return value; } + return value; } } return null;
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 18f92f6..7943781 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
@@ -6,6 +6,7 @@ import java.util.ArrayList; import java.util.Collections; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; @@ -1070,4 +1071,74 @@ assertEquals("Any", parameterNames[2]); } + + + public void testPrototypeChainWithExtendsPublicPrivateAndProtectedMethods() { + final StringList code = new StringList(); + code.add("/**"); + code.add(" * @param {String} name"); + code.add(" */"); + code.add("function BaseEntity(name) {"); + code.add(" /**"); + code.add(" * @protected"); + code.add(" */"); + code.add(" this.name = name"); + code.add("}"); + code.add("BaseEntity.prototype = {"); + code.add(" publicMethod: function() {},"); + code.add(" /**"); + code.add(" * @protected"); + code.add(" */"); + code.add(" protectedMethod: function() {},"); + code.add(" /**"); + code.add(" * @deprecated"); + code.add(" */"); + code.add(" deprecatedMethod: function() {}"); + code.add("}"); + code.add("BaseEntity.prototype.getName = function() {"); + code.add(" return this.name"); + code.add("}"); + code.add("/**"); + code.add(" * @extends {BaseEntity}"); + code.add(" * @param {Str*ing} name"); + code.add(" * @param {String} type"); + code.add(" * @constructor "); + code.add(" */"); + code.add("function ExtendedEntity(name, type) {"); + code.add(" if (! (this instanceof ExtendedEntity)) {"); + code.add(" return new ExtendedEntity(name, type)"); + code.add("}"); + code.add("BaseEntity.call(this, name)"); + code.add("/**@protected*/"); + code.add("this.type = type"); + code.add("}"); + code.add("ExtendedEntity.prototype = Object.create(BaseEntity.prototype)"); + code.add("ExtendedEntity.prototype.constructor = ExtendedEntity"); + code.add("ExtendedEntity.prototype.getType = function() {"); + code.add(" return this.type"); + code.add("}"); + code.add("function test() {"); + code.add(" var x = new ExtendedEntity('Servoy', 'company')"); + code.add(" x."); + code.add("}"); + 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("x.", module), 0); + assertEquals(14, results.size()); + + HashSet<String> names = new HashSet<String>(16); + for (CompletionProposal cp : results) { + names.add(cp.getName()); + } + + assertTrue(names.contains("getType")); + assertTrue(names.contains("publicMethod")); + assertTrue(names.contains("deprecatedMethod")); + assertTrue(names.contains("getName")); + +// assertFalse(names.contains("protectedMethod")); + } } +