| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- // mono reader-method-gen.exe > System.Xml/XmlDictionaryReaderAutoGen.cs
- using System;
- using System.Globalization;
- using System.CodeDom;
- using System.CodeDom.Compiler;
- using System.Reflection;
- using System.Xml;
- using Microsoft.CSharp;
- public class Generator
- {
- public static void Main ()
- {
- Console.Out.NewLine = "\n";
- Type [] types = new Type [] {
- typeof (bool), typeof (DateTime), typeof (decimal), typeof (double),
- typeof (Guid), typeof (short), typeof (int), typeof (long), typeof (float), typeof (TimeSpan) };
- Console.WriteLine (@"
- #pragma warning disable 612
- using System;
- using System.Collections.Generic;
- namespace System.Xml
- {
- public abstract partial class XmlDictionaryReader : XmlReader
- {
- static readonly char [] wsChars = new char [] {' ', '\t', '\n', '\r'};
- void CheckReadArrayArguments (Array array, int offset, int length)
- {
- if (array == null)
- throw new ArgumentNullException (""array"");
- if (offset < 0)
- throw new ArgumentOutOfRangeException (""offset is negative"");
- if (offset > array.Length)
- throw new ArgumentOutOfRangeException (""offset exceeds the length of the destination array"");
- if (length < 0)
- throw new ArgumentOutOfRangeException (""length is negative"");
- if (length > array.Length - offset)
- throw new ArgumentOutOfRangeException (""length + offset exceeds the length of the destination array"");
- }
- void CheckDictionaryStringArgs (XmlDictionaryString localName, XmlDictionaryString namespaceUri)
- {
- if (localName == null)
- throw new ArgumentNullException (""localName"");
- if (namespaceUri == null)
- throw new ArgumentNullException (""namespaceUri"");
- }
- ");
- foreach (Type type in types) {
- Console.WriteLine (@"
- public virtual int ReadArray (XmlDictionaryString localName, XmlDictionaryString namespaceUri, {0} [] array, int offset, int length)
- {{
- CheckDictionaryStringArgs (localName, namespaceUri);
- return ReadArray (localName.Value, namespaceUri.Value, array, offset, length);
- }}
- public virtual int ReadArray (string localName, string namespaceUri, {0} [] array, int offset, int length)
- {{
- CheckReadArrayArguments (array, offset, length);
- for (int i = 0; i < length; i++) {{
- MoveToContent ();
- if (NodeType != XmlNodeType.Element)
- return i;
- ReadStartElement (localName, namespaceUri);
- array [offset + i] = XmlConvert.To{1} (ReadContentAsString ());
- ReadEndElement ();
- }}
- return length;
- }}
- public virtual {0} [] Read{1}Array (string localName, string namespaceUri)
- {{
- List<{0}> list = new List<{0}> ();
- while (true) {{
- MoveToContent ();
- if (NodeType != XmlNodeType.Element)
- break;
- ReadStartElement (localName, namespaceUri);
- list.Add (XmlConvert.To{1} (ReadContentAsString ()));
- ReadEndElement ();
- if (list.Count == Quotas.MaxArrayLength)
- // FIXME: check if raises an error or not
- break;
- }}
- return list.ToArray ();
- }}
- public virtual {0} [] Read{1}Array (XmlDictionaryString localName, XmlDictionaryString namespaceUri)
- {{
- CheckDictionaryStringArgs (localName, namespaceUri);
- return Read{1}Array (localName.Value, namespaceUri.Value);
- }}", ToCSharp (type), type.Name);
- }
- Type xr = typeof (XmlReader);
- string name = "ReadElementContentAs";
- foreach (MethodInfo mi in xr.GetMethods ()) {
- if (!mi.Name.StartsWith (name))
- continue;
- ParameterInfo [] pl = mi.GetParameters ();
- if (pl.Length != 2 || pl [0].ParameterType != typeof (string))
- continue;
- if (mi.Name.EndsWith ("AsObject"))
- continue; // special case to filter out.
- if (mi.Name.EndsWith ("AsString"))
- continue; // special case to filter out.
- bool isOverride = xr.GetMethod (mi.Name, Type.EmptyTypes) != null;
- Console.WriteLine (@"
- public {3}{0} {1} ()
- {{
- ReadStartElement (LocalName, NamespaceURI);
- {0} ret = {2} ();
- ReadEndElement ();
- return ret;
- }}",
- ToCSharp (mi.ReturnType),
- mi.Name,
- mi.Name.Replace ("Element", String.Empty),
- isOverride ? "override " : null);
- }
- Console.WriteLine (@"
- }
- }");
- }
- static CodeDomProvider cs = new CSharpCodeProvider ();
- static string ToCSharp (Type type)
- {
- string r = cs.GetTypeOutput (new CodeTypeReference (type));
- return r != type.FullName ? r : type.Name;
- }
- static string ToOldName (Type type)
- {
- switch (type.Name) {
- case "Single":
- return "Float";
- case "Int32":
- return "Int";
- case "Int64":
- return "Long";
- case "Int16":
- return "Short";
- default:
- return type.Name;
- }
- }
- }
|