if using @extends then set the prototype of that class to the exteds,
copy over the functions as Function properties
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 119c1d9..14ee220 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
@@ -120,6 +120,7 @@
import org.eclipse.dltk.javascript.typeinfo.IRClassType;
import org.eclipse.dltk.javascript.typeinfo.IRConstructor;
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.IRMethod;
import org.eclipse.dltk.javascript.typeinfo.IRRecordMember;
@@ -843,8 +844,22 @@
thisValue.setDeclaredType(this.context.contextualize(method
.getThisType()));
} else if (method.getExtendsType() != null) {
- thisValue.setDeclaredType(this.context.contextualize(method
- .getExtendsType()));
+ IRType thisType = this.context.contextualize(method
+ .getExtendsType());
+ thisValue.setDeclaredType(thisType);
+ if (thisType instanceof IRLocalType) {
+ IValueReference prototype = result.createChild("prototype");
+ prototype.setDeclaredType(context.getType(ITypeNames.OBJECT)
+ .toRType(context));
+ Set<String> directChildren = ((IRLocalType) thisType)
+ .getDirectChildren();
+ for (String child : directChildren) {
+ prototype.createChild(child).setDeclaredType(
+ context.getType(ITypeNames.FUNCTION).toRType(
+ context));
+ }
+ }
+
}
final IValueCollection function = new FunctionValueCollection(
peekContext(), method.getName(), thisValue,
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 3cca152..29bfc1e 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
@@ -915,4 +915,38 @@
assertEquals(1, results.size());
assertEquals(CompletionProposal.FIELD_REF, results.get(0).getKind());
}
+
+ public void testPrototypeWithExtends() {
+ final StringList code = new StringList();
+ code.add("/**");
+ code.add(" * @constructor");
+ code.add(" */");
+ code.add("function MyConstructor() {");
+ code.add(" this.mypublicfunction = function() {");
+ code.add(" }");
+ code.add("}");
+ code.add("/**");
+ code.add(" * @constructor");
+ code.add(" * @extends {MyConstructor}");
+ code.add(" */");
+ code.add("function MySubConstructor() {");
+ code.add(" this.mypublicfunction = function() {");
+ code.add(" MySubConstructor.prototype.");
+ code.add(" }");
+ 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(".", module), 0);
+ assertEquals(8, results.size());
+ boolean found = false;
+ for (CompletionProposal completionProposal : results) {
+ if (completionProposal.getName().equals("mypublicfunction")) {
+ found = true;
+ break;
+ }
+ }
+ assertEquals(true, found);
+ }
}