fix for calling the function that is given as a function type through a
union.
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 57fc806..07aabba 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
@@ -104,6 +104,7 @@
import org.eclipse.dltk.javascript.typeinfo.IRType;
import org.eclipse.dltk.javascript.typeinfo.IRTypeDeclaration;
import org.eclipse.dltk.javascript.typeinfo.IRTypeExtension;
+import org.eclipse.dltk.javascript.typeinfo.IRUnionType;
import org.eclipse.dltk.javascript.typeinfo.IRVariable;
import org.eclipse.dltk.javascript.typeinfo.ITypeChecker;
import org.eclipse.dltk.javascript.typeinfo.ITypeCheckerExtension;
@@ -1094,6 +1095,11 @@
&& expressionType != RTypes.none()
&& !RTypes.FUNCTION.isAssignableFrom(expressionType)
.ok()) {
+ if (expressionType instanceof IRUnionType) {
+ if (expressionType.isAssignableFrom(RTypes.FUNCTION)
+ .ok())
+ return;
+ }
reporter.reportProblem(
JavaScriptProblems.WRONG_FUNCTION,
isIdentifier(expression) ? NLS.bind(
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 238082e..6b8c4aa 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
@@ -2193,6 +2193,26 @@
final List<IProblem> problems = validate(code.toString());
assertEquals(problems.toString(), 0, problems.size());
}
+
+ public void testFunctionFromParamType() {
+ final StringList code = new StringList();
+ code.add("/** @param {function(String)} obj */");
+ code.add("function y(obj) {");
+ code.add(" obj('');");
+ code.add("}");
+ final List<IProblem> problems = validate(code.toString());
+ assertEquals(problems.toString(), 0, problems.size());
+ }
+
+ public void testFunctionCallFromUnion() {
+ final StringList code = new StringList();
+ code.add("/** @param {function(String)|String} obj */");
+ code.add("function y(obj) {");
+ code.add(" obj('');");
+ code.add("}");
+ final List<IProblem> problems = validate(code.toString());
+ assertEquals(problems.toString(), 0, problems.size());
+ }
public void testUnionParamTypeCompatibility() {
final StringList code = new StringList();