diff --git a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/context/functions/FunctionDeclarationParsing.java b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/context/functions/FunctionDeclarationParsing.java
index bd7b38296e39..38b25440a6eb 100644
--- a/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/context/functions/FunctionDeclarationParsing.java
+++ b/plugins/xpath/xpath-lang/src/org/intellij/lang/xpath/context/functions/FunctionDeclarationParsing.java
@@ -102,7 +102,7 @@ public class FunctionDeclarationParsing {
XPathType r = null;
if ("numeric".equals(type)) {
- r = XPathType.NUMBER;
+ r = XPath2Type.NUMERIC;
} else if (type.startsWith("xs:")) {
final String base = type.substring(3);
r = XPath2Type.fromName(new QName(XPath2Type.XMLSCHEMA_NS, base));
diff --git a/plugins/xpath/xpath-lang/test/org/intellij/lang/xpath/XPath2StaticTypeTest.java b/plugins/xpath/xpath-lang/test/org/intellij/lang/xpath/XPath2StaticTypeTest.java
index e7d2a5e1722f..190dba7570ed 100644
--- a/plugins/xpath/xpath-lang/test/org/intellij/lang/xpath/XPath2StaticTypeTest.java
+++ b/plugins/xpath/xpath-lang/test/org/intellij/lang/xpath/XPath2StaticTypeTest.java
@@ -23,20 +23,46 @@ import org.intellij.lang.xpath.psi.XPathType;
public class XPath2StaticTypeTest extends TestCase {
public void testStatic() throws Throwable {
- assertTrue(XPathType.isAssignable(XPath2Type.ITEM, XPath2Type.STRING));
+ assertTrue(XPathType.isAssignable(XPath2Type.NODE, XPath2Type.ITEM));
- assertTrue(XPathType.isAssignable(XPath2Type.STRING, XPath2Type.ANYURI));
+ assertFalse(XPathType.isAssignable(XPath2Type.NODE, XPath2Type.STRING));
+ }
+
+ public void testBooleanAssignability() {
+ // via "effective boolean value"
+ assertTrue(XPathType.isAssignable(XPath2Type.BOOLEAN, XPath2Type.STRING));
+ assertTrue(XPathType.isAssignable(XPath2Type.BOOLEAN, XPath2Type.NUMERIC));
+ assertTrue(XPathType.isAssignable(XPath2Type.BOOLEAN, XPath2Type.INTEGER));
+
+ assertFalse(XPathType.isAssignable(XPath2Type.BOOLEAN_STRICT, XPath2Type.STRING));
+ }
+
+ public void testAnyAssignability() {
+ assertTrue(XPathType.isAssignable(XPath2Type.ITEM, XPath2Type.STRING));
+ assertTrue(XPathType.isAssignable(XPath2Type.ITEM, XPath2Type.BOOLEAN));
+ assertTrue(XPathType.isAssignable(XPath2Type.ITEM, XPath2Type.DATE));
+ }
+
+ public void testNumericAssignability() {
+ assertTrue(XPathType.isAssignable(XPath2Type.FLOAT, XPath2Type.INTEGER));
assertTrue(XPathType.isAssignable(XPath2Type.DOUBLE, XPath2Type.FLOAT));
assertTrue(XPathType.isAssignable(XPath2Type.DOUBLE, XPath2Type.INTEGER));
- assertTrue(XPathType.isAssignable(XPath2SequenceType.create(XPath2Type.STRING), XPath2SequenceType.create(XPath2Type.STRING)));
+ assertTrue(XPathType.isAssignable(XPath2Type.FLOAT, XPath2Type.DOUBLE));
+
+ assertFalse(XPathType.isAssignable(XPath2Type.NUMERIC, XPath2Type.BOOLEAN));
+ }
+
+ public void testStringAssignability() {
+ assertTrue(XPathType.isAssignable(XPath2Type.STRING, XPath2Type.ANYURI));
assertTrue(XPathType.isAssignable(XPath2Type.STRING, XPath2SequenceType.create(XPath2Type.STRING)));
+
+ assertTrue(XPathType.isAssignable(XPath2SequenceType.create(XPath2Type.STRING), XPath2SequenceType.create(XPath2Type.STRING)));
assertTrue(XPathType.isAssignable(XPath2SequenceType.create(XPath2Type.STRING), XPath2Type.STRING));
- assertFalse(XPathType.isAssignable(XPath2SequenceType.create(XPath2Type.STRING), XPath2SequenceType.create(XPath2Type.INTEGER)));
-
assertFalse(XPathType.isAssignable(XPath2Type.STRING, XPath2Type.INTEGER));
- assertFalse(XPathType.isAssignable(XPath2Type.NODE, XPath2Type.STRING));
+
+ assertFalse(XPathType.isAssignable(XPath2SequenceType.create(XPath2Type.STRING), XPath2SequenceType.create(XPath2Type.INTEGER)));
}
}
diff --git a/plugins/xpath/xpath-lang/test/org/intellij/lang/xpath/XPath2TypeTest.java b/plugins/xpath/xpath-lang/test/org/intellij/lang/xpath/XPath2TypeTest.java
index 123e98c33760..6e3ae03d90c5 100644
--- a/plugins/xpath/xpath-lang/test/org/intellij/lang/xpath/XPath2TypeTest.java
+++ b/plugins/xpath/xpath-lang/test/org/intellij/lang/xpath/XPath2TypeTest.java
@@ -89,6 +89,10 @@ public class XPath2TypeTest extends XPath2HighlightingTestBase {
doXPathHighlighting();
}
+ public void testToNumericIDEA67335() throws Throwable {
+ doXPathHighlighting();
+ }
+
@Override
protected String getSubPath() {
return "xpath/highlighting/types";
diff --git a/plugins/xpath/xpath-lang/testData/xpath/highlighting/types/toNumericIDEA67335.xpath2 b/plugins/xpath/xpath-lang/testData/xpath/highlighting/types/toNumericIDEA67335.xpath2
new file mode 100644
index 000000000000..f58a6ab00bea
--- /dev/null
+++ b/plugins/xpath/xpath-lang/testData/xpath/highlighting/types/toNumericIDEA67335.xpath2
@@ -0,0 +1 @@
+ceiling(0 = 1) + floor('a') + round(.)
\ No newline at end of file