Procházet zdrojové kódy

Can now scan most location paths (without predicates).

svn path=/trunk/mcs/; revision=3351
Jason Diamond před 24 roky
rodič
revize
e953522577

+ 5 - 0
mcs/class/System.XML/System.Xml.XPath/ChangeLog

@@ -1,3 +1,8 @@
+2002-03-26  Jason Diamond  <[email protected]>
+
+	* XPathScanner.cs: Now handles name tests with wildacards. Abbreviated 
+	steps. Both absolution and relative abbreviated location paths.
+
 2002-03-25  Jason Diamond  <[email protected]>
 
 	* XPathScanner.cs: Added new file. This class is supposed to be internal

+ 21 - 4
mcs/class/System.XML/System.Xml.XPath/XPathScanner.cs

@@ -151,6 +151,12 @@ namespace System.Xml.XPath
 							builder.Append ((char) Read ());
 						}
 						tokenType = XPathTokenType.NameTest;
+					} else if (Peek () == '*') {
+						builder.Append (':');
+						builder.Append ((char) Read ());
+						tokenType = XPathTokenType.NameTest;
+						value = builder.ToString ();
+						return tokenType;
 					} else {
 						tokenType = XPathTokenType.Error;
 						return tokenType;
@@ -196,15 +202,18 @@ namespace System.Xml.XPath
 					tokenType = XPathTokenType.RightBracket;
 					break;
 				case '.':
-					if (Peek () != '.')
+					if (Peek () != '.') {
 						tokenType = XPathTokenType.Dot;
-					else {
+						value = ".";
+					} else {
 						Read ();
 						tokenType = XPathTokenType.DotDot;
+						value = "..";
 					}
 					break;
 				case '@':
 					tokenType = XPathTokenType.At;
+					value = "@";
 					break;
 				case ',':
 					tokenType = XPathTokenType.Comma;
@@ -218,7 +227,7 @@ namespace System.Xml.XPath
 						tokenType = XPathTokenType.Error;
 					break;
 				case '*':
-					if (precedingTokenType != XPathTokenType.Error &&
+					if (precedingTokenType != XPathTokenType.Start &&
 						precedingTokenType != XPathTokenType.At &&
 						precedingTokenType != XPathTokenType.ColonColon &&
 						precedingTokenType != XPathTokenType.LeftParen &&
@@ -226,12 +235,20 @@ namespace System.Xml.XPath
 						precedingTokenType != XPathTokenType.Operator) {
 						tokenType = XPathTokenType.Operator;
 						value = "*";
+					} else {
+						tokenType = XPathTokenType.NameTest;
+						value = "*";
 					}
 					break;
 				default:
 					if (c == '/') {
 						tokenType = XPathTokenType.Operator;
-						value = "/";
+						if (Peek () != '/')
+							value = "/";
+						else {
+							Read ();
+							value = "//";
+						}
 					}
 					break;
 				}

+ 4 - 0
mcs/class/System.XML/Test/ChangeLog

@@ -1,3 +1,7 @@
+2002-03-26  Jason Diamond  <[email protected]>
+
+	* XPathScannerTests.cs: More location path tests.
+
 2002-03-25  Jason Diamond  <[email protected]>
 
 	* AllTests.cs: 

+ 174 - 12
mcs/class/System.XML/Test/XPathScannerTests.cs

@@ -19,7 +19,7 @@ namespace Ximian.Mono.Tests
 		public XPathScannerTests () : base ("Ximian.Mono.Tests.XPathScannerTests testsuite") { }
 		public XPathScannerTests (string name) : base (name) { }
 
-		public void TestLocationPathWithOneNameTest()
+		public void TestLocationPathWithOneNameTest ()
 		{
 			XPathScanner scanner = new XPathScanner ("foo");
 			AssertEquals (XPathTokenType.NameTest, scanner.Scan ());
@@ -28,7 +28,7 @@ namespace Ximian.Mono.Tests
 			AssertNull (scanner.Value);
 		}
 
-		public void TestLocationPathWithTwoNameTests()
+		public void TestLocationPathWithTwoNameTests ()
 		{
 			XPathScanner scanner = new XPathScanner ("foo/bar");
 			AssertEquals (XPathTokenType.NameTest, scanner.Scan ());
@@ -41,7 +41,7 @@ namespace Ximian.Mono.Tests
 			AssertNull (scanner.Value);
 		}
 
-		public void TestLocationPathWithOneQualifiedNameTest()
+		public void TestLocationPathWithOneQualifiedNameTest ()
 		{
 			XPathScanner scanner = new XPathScanner ("foo:bar");
 			AssertEquals (XPathTokenType.NameTest, scanner.Scan ());
@@ -50,7 +50,7 @@ namespace Ximian.Mono.Tests
 			AssertNull (scanner.Value);
 		}
 
-		public void TestLocationPathWithTwoQualifiedNameTests()
+		public void TestLocationPathWithTwoQualifiedNameTests ()
 		{
 			XPathScanner scanner = new XPathScanner ("foo:bar/baz:quux");
 			AssertEquals (XPathTokenType.NameTest, scanner.Scan ());
@@ -63,7 +63,7 @@ namespace Ximian.Mono.Tests
 			AssertNull (scanner.Value);
 		}
 
-		public void TestLocationPathWithOneNameTestWithAxisName()
+		public void TestLocationPathWithOneNameTestWithAxisName ()
 		{
 			XPathScanner scanner = new XPathScanner ("child::foo");
 			AssertEquals (XPathTokenType.AxisName, scanner.Scan ());
@@ -76,7 +76,7 @@ namespace Ximian.Mono.Tests
 			AssertNull (scanner.Value);
 		}
 
-		public void TestLocationPathWithTwoNameTestsWithAxisNames()
+		public void TestLocationPathWithTwoNameTestsWithAxisNames ()
 		{
 			XPathScanner scanner = new XPathScanner ("child::foo/preceding-sibling::bar");
 			AssertEquals (XPathTokenType.AxisName, scanner.Scan ());
@@ -97,7 +97,7 @@ namespace Ximian.Mono.Tests
 			AssertNull (scanner.Value);
 		}
 
-		public void TestCommentNodeType()
+		public void TestCommentNodeType ()
 		{
 			XPathScanner scanner = new XPathScanner ("comment()");
 			AssertEquals (XPathTokenType.NodeType, scanner.Scan ());
@@ -110,7 +110,7 @@ namespace Ximian.Mono.Tests
 			AssertNull (scanner.Value);
 		}
 
-		public void TestNodeNodeType()
+		public void TestNodeNodeType ()
 		{
 			XPathScanner scanner = new XPathScanner ("node()");
 			AssertEquals (XPathTokenType.NodeType, scanner.Scan ());
@@ -123,7 +123,7 @@ namespace Ximian.Mono.Tests
 			AssertNull (scanner.Value);
 		}
 
-		public void TestProcessingInstructionNodeType()
+		public void TestProcessingInstructionNodeType ()
 		{
 			XPathScanner scanner = new XPathScanner ("processing-instruction()");
 			AssertEquals (XPathTokenType.NodeType, scanner.Scan ());
@@ -136,7 +136,7 @@ namespace Ximian.Mono.Tests
 			AssertNull (scanner.Value);
 		}
 
-		public void TestTextNodeType()
+		public void TestTextNodeType ()
 		{
 			XPathScanner scanner = new XPathScanner ("text()");
 			AssertEquals (XPathTokenType.NodeType, scanner.Scan ());
@@ -149,7 +149,7 @@ namespace Ximian.Mono.Tests
 			AssertNull (scanner.Value);
 		}
 
-		public void TestFunctionName()
+		public void TestFunctionName ()
 		{
 			XPathScanner scanner = new XPathScanner ("foo()");
 			AssertEquals (XPathTokenType.FunctionName, scanner.Scan ());
@@ -162,7 +162,7 @@ namespace Ximian.Mono.Tests
 			AssertNull (scanner.Value);
 		}
 
-		public void TestQualifiedFunctionName()
+		public void TestQualifiedFunctionName ()
 		{
 			XPathScanner scanner = new XPathScanner ("foo:bar()");
 			AssertEquals (XPathTokenType.FunctionName, scanner.Scan ());
@@ -174,5 +174,167 @@ namespace Ximian.Mono.Tests
 			AssertEquals (XPathTokenType.End, scanner.Scan ());
 			AssertNull (scanner.Value);
 		}
+
+		public void TestWildcardNameTest ()
+		{
+			XPathScanner scanner = new XPathScanner ("*");
+			AssertEquals (XPathTokenType.NameTest, scanner.Scan ());
+			AssertEquals ("*", scanner.Value);
+			AssertEquals (XPathTokenType.End, scanner.Scan ());
+			AssertNull (scanner.Value);
+		}
+
+		public void TestQualifiedWildcardNameTest ()
+		{
+			XPathScanner scanner = new XPathScanner ("foo:*");
+			AssertEquals (XPathTokenType.NameTest, scanner.Scan ());
+			AssertEquals ("foo:*", scanner.Value);
+			AssertEquals (XPathTokenType.End, scanner.Scan ());
+			AssertNull (scanner.Value);
+		}
+
+		public void TestTwoWildcardNameTests ()
+		{
+			XPathScanner scanner = new XPathScanner ("*/*");
+			AssertEquals (XPathTokenType.NameTest, scanner.Scan ());
+			AssertEquals ("*", scanner.Value);
+			AssertEquals (XPathTokenType.Operator, scanner.Scan ());
+			AssertEquals ("/", scanner.Value);
+			AssertEquals (XPathTokenType.NameTest, scanner.Scan ());
+			AssertEquals ("*", scanner.Value);
+			AssertEquals (XPathTokenType.End, scanner.Scan ());
+			AssertNull (scanner.Value);
+		}
+
+		public void TestTwoQualifiedWildcardNameTests ()
+		{
+			XPathScanner scanner = new XPathScanner ("foo:*/bar:*");
+			AssertEquals (XPathTokenType.NameTest, scanner.Scan ());
+			AssertEquals ("foo:*", scanner.Value);
+			AssertEquals (XPathTokenType.Operator, scanner.Scan ());
+			AssertEquals ("/", scanner.Value);
+			AssertEquals (XPathTokenType.NameTest, scanner.Scan ());
+			AssertEquals ("bar:*", scanner.Value);
+			AssertEquals (XPathTokenType.End, scanner.Scan ());
+			AssertNull (scanner.Value);
+		}
+
+		public void TestAttributeNameTest ()
+		{
+			XPathScanner scanner = new XPathScanner ("@foo");
+			AssertEquals (XPathTokenType.At, scanner.Scan ());
+			AssertEquals ("@", scanner.Value);
+			AssertEquals (XPathTokenType.NameTest, scanner.Scan ());
+			AssertEquals ("foo", scanner.Value);
+			AssertEquals (XPathTokenType.End, scanner.Scan ());
+			AssertNull (scanner.Value);
+		}
+
+		public void TestNameTestAndAttributeNameTest ()
+		{
+			XPathScanner scanner = new XPathScanner ("foo/@bar");
+			AssertEquals (XPathTokenType.NameTest, scanner.Scan ());
+			AssertEquals ("foo", scanner.Value);
+			AssertEquals (XPathTokenType.Operator, scanner.Scan ());
+			AssertEquals ("/", scanner.Value);
+			AssertEquals (XPathTokenType.At, scanner.Scan ());
+			AssertEquals ("@", scanner.Value);
+			AssertEquals (XPathTokenType.NameTest, scanner.Scan ());
+			AssertEquals ("bar", scanner.Value);
+			AssertEquals (XPathTokenType.End, scanner.Scan ());
+			AssertNull (scanner.Value);
+		}
+
+		public void TestAttributeAxis ()
+		{
+			XPathScanner scanner = new XPathScanner ("attribute::foo");
+			AssertEquals (XPathTokenType.AxisName, scanner.Scan ());
+			AssertEquals ("attribute", scanner.Value);
+			AssertEquals (XPathTokenType.ColonColon, scanner.Scan ());
+			AssertEquals ("::", scanner.Value);
+			AssertEquals (XPathTokenType.NameTest, scanner.Scan ());
+			AssertEquals ("foo", scanner.Value);
+			AssertEquals (XPathTokenType.End, scanner.Scan ());
+			AssertNull (scanner.Value);
+		}
+
+		public void TestNameTestAndAttributeAxis ()
+		{
+			XPathScanner scanner = new XPathScanner ("foo/attribute::bar");
+			AssertEquals (XPathTokenType.NameTest, scanner.Scan ());
+			AssertEquals ("foo", scanner.Value);
+			AssertEquals (XPathTokenType.Operator, scanner.Scan ());
+			AssertEquals ("/", scanner.Value);
+			AssertEquals (XPathTokenType.AxisName, scanner.Scan ());
+			AssertEquals ("attribute", scanner.Value);
+			AssertEquals (XPathTokenType.ColonColon, scanner.Scan ());
+			AssertEquals ("::", scanner.Value);
+			AssertEquals (XPathTokenType.NameTest, scanner.Scan ());
+			AssertEquals ("bar", scanner.Value);
+			AssertEquals (XPathTokenType.End, scanner.Scan ());
+			AssertNull (scanner.Value);
+		}
+
+		public void TestRoot ()
+		{
+			XPathScanner scanner = new XPathScanner ("/");
+			AssertEquals (XPathTokenType.Operator, scanner.Scan ());
+			AssertEquals ("/", scanner.Value);
+			AssertEquals (XPathTokenType.End, scanner.Scan ());
+			AssertNull (scanner.Value);
+		}
+
+		public void TestAbsoluteNameTest ()
+		{
+			XPathScanner scanner = new XPathScanner ("/foo");
+			AssertEquals (XPathTokenType.Operator, scanner.Scan ());
+			AssertEquals ("/", scanner.Value);
+			AssertEquals (XPathTokenType.NameTest, scanner.Scan ());
+			AssertEquals ("foo", scanner.Value);
+			AssertEquals (XPathTokenType.End, scanner.Scan ());
+			AssertNull (scanner.Value);
+		}
+
+		public void TestAbbreviatedAbsoluteLocationPathWithNameTest ()
+		{
+			XPathScanner scanner = new XPathScanner ("//foo");
+			AssertEquals (XPathTokenType.Operator, scanner.Scan ());
+			AssertEquals ("//", scanner.Value);
+			AssertEquals (XPathTokenType.NameTest, scanner.Scan ());
+			AssertEquals ("foo", scanner.Value);
+			AssertEquals (XPathTokenType.End, scanner.Scan ());
+			AssertNull (scanner.Value);
+		}
+
+		public void TestAbbreviatedRelativeLocationPathWithNameTest ()
+		{
+			XPathScanner scanner = new XPathScanner ("foo//bar");
+			AssertEquals (XPathTokenType.NameTest, scanner.Scan ());
+			AssertEquals ("foo", scanner.Value);
+			AssertEquals (XPathTokenType.Operator, scanner.Scan ());
+			AssertEquals ("//", scanner.Value);
+			AssertEquals (XPathTokenType.NameTest, scanner.Scan ());
+			AssertEquals ("bar", scanner.Value);
+			AssertEquals (XPathTokenType.End, scanner.Scan ());
+			AssertNull (scanner.Value);
+		}
+
+		public void TestAbbreviatedStepSelf ()
+		{
+			XPathScanner scanner = new XPathScanner (".");
+			AssertEquals (XPathTokenType.Dot, scanner.Scan ());
+			AssertEquals (".", scanner.Value);
+			AssertEquals (XPathTokenType.End, scanner.Scan ());
+			AssertNull (scanner.Value);
+		}
+
+		public void TestAbbreviatedStepParent ()
+		{
+			XPathScanner scanner = new XPathScanner ("..");
+			AssertEquals (XPathTokenType.DotDot, scanner.Scan ());
+			AssertEquals ("..", scanner.Value);
+			AssertEquals (XPathTokenType.End, scanner.Scan ());
+			AssertNull (scanner.Value);
+		}
 	}
 }