From 80e1b9cdd5c1a7d7966f030344a9665463c3c8f2 Mon Sep 17 00:00:00 2001 From: sweinreuter Date: Wed, 6 Apr 2011 16:44:52 +0200 Subject: [PATCH] IDEA-67335: XPath 2: function arguments of wrong non-number type are green --- .../functions/FunctionDeclarationParsing.java | 2 +- .../lang/xpath/XPath2StaticTypeTest.java | 38 ++++++++++++++++--- .../intellij/lang/xpath/XPath2TypeTest.java | 4 ++ .../types/toNumericIDEA67335.xpath2 | 1 + 4 files changed, 38 insertions(+), 7 deletions(-) create mode 100644 plugins/xpath/xpath-lang/testData/xpath/highlighting/types/toNumericIDEA67335.xpath2 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