The Labs \ Source Viewer \ SSCLI \ System.Xml.Xsl.IlGen \ XmlILTypeHelper

  1. //------------------------------------------------------------------------------
  2. // <copyright file="XmlIlTypeHelper.cs" company="Microsoft">
  3. //
  4. // Copyright (c) 2006 Microsoft Corporation. All rights reserved.
  5. //
  6. // The use and distribution terms for this software are contained in the file
  7. // named license.txt, which can be found in the root of this distribution.
  8. // By using this software in any fashion, you are agreeing to be bound by the
  9. // terms of this license.
  10. //
  11. // You must not remove this notice, or any other, from this software.
  12. //
  13. // </copyright>
  14. //------------------------------------------------------------------------------
  15. using System;
  16. using System.Collections.Generic;
  17. using System.IO;
  18. using System.Text;
  19. using System.Diagnostics;
  20. using System.Xml;
  21. using System.Xml.XPath;
  22. using System.Xml.Schema;
  23. using System.Xml.Xsl.Runtime;
  24. namespace System.Xml.Xsl.IlGen
  25. {
  26.    
  27.     /// <summary>
  28.     /// Static QilExpression type helper methods.
  29.     /// </summary>
  30.     internal class XmlILTypeHelper
  31.     {
  32.        
  33.         // Not creatable
  34.         private XmlILTypeHelper()
  35.         {
  36.         }
  37.        
  38.         /// <summary>
  39.         /// Return the default Clr data type that will be used to store instances of the QilNode's type.
  40.         /// </summary>
  41.         public static Type GetStorageType(XmlQueryType qyTyp)
  42.         {
  43.             Type storageType;
  44.            
  45.             if (qyTyp.IsSingleton) {
  46.                 storageType = TypeCodeToStorage[(int)qyTyp.TypeCode];
  47.                
  48.                 // Non-strict items must store the type along with the value, so use XPathItem
  49.                 if (!qyTyp.IsStrict && storageType != typeof(XPathNavigator))
  50.                     return typeof(XPathItem);
  51.             }
  52.             else {
  53.                 storageType = TypeCodeToCachedStorage[(int)qyTyp.TypeCode];
  54.                
  55.                 // Non-strict items must store the type along with the value, so use XPathItem
  56.                 if (!qyTyp.IsStrict && storageType != typeof(IList<XPathNavigator>))
  57.                     return typeof(IList<XPathItem>);
  58.             }
  59.            
  60.             return storageType;
  61.         }
  62.        
  63.         private static readonly Type[] TypeCodeToStorage = {typeof(XPathItem), typeof(XPathItem), typeof(XPathNavigator), typeof(XPathNavigator), typeof(XPathNavigator), typeof(XPathNavigator), typeof(XPathNavigator), typeof(XPathNavigator), typeof(XPathNavigator), typeof(XPathNavigator),
  64.         typeof(XPathItem), typeof(string), typeof(string), typeof(bool), typeof(decimal), typeof(float), typeof(double), typeof(string), typeof(DateTime), typeof(DateTime),
  65.         typeof(DateTime), typeof(DateTime), typeof(DateTime), typeof(DateTime), typeof(DateTime), typeof(DateTime), typeof(byte[]), typeof(byte[]), typeof(string), typeof(XmlQualifiedName),
  66.         typeof(XmlQualifiedName), typeof(string), typeof(string), typeof(string), typeof(string), typeof(string), typeof(string), typeof(string), typeof(string), typeof(string),
  67.         typeof(long), typeof(decimal), typeof(decimal), typeof(long), typeof(int), typeof(int), typeof(int), typeof(decimal), typeof(decimal), typeof(long),
  68.             // XmlTypeCode.None
  69.             // XmlTypeCode.Item
  70.             // XmlTypeCode.Node
  71.             // XmlTypeCode.Document
  72.             // XmlTypeCode.Element
  73.             // XmlTypeCode.Attribute
  74.             // XmlTypeCode.Namespace
  75.             // XmlTypeCode.ProcessingInstruction
  76.             // XmlTypeCode.Comment
  77.             // XmlTypeCode.Text
  78.             // XmlTypeCode.AnyAtomicType
  79.             // XmlTypeCode.UntypedAtomic
  80.             // XmlTypeCode.String
  81.             // XmlTypeCode.Boolean
  82.             // XmlTypeCode.Decimal
  83.             // XmlTypeCode.Float
  84.             // XmlTypeCode.Double
  85.             // XmlTypeCode.Duration
  86.             // XmlTypeCode.DateTime
  87.             // XmlTypeCode.Time
  88.             // XmlTypeCode.Date
  89.             // XmlTypeCode.GYearMonth
  90.             // XmlTypeCode.GYear
  91.             // XmlTypeCode.GMonthDay
  92.             // XmlTypeCode.GDay
  93.             // XmlTypeCode.GMonth
  94.             // XmlTypeCode.HexBinary
  95.             // XmlTypeCode.Base64Binary
  96.             // XmlTypeCode.AnyUri
  97.             // XmlTypeCode.QName
  98.             // XmlTypeCode.Notation
  99.             // XmlTypeCode.NormalizedString
  100.             // XmlTypeCode.Token
  101.             // XmlTypeCode.Language
  102.             // XmlTypeCode.NmToken
  103.             // XmlTypeCode.Name
  104.             // XmlTypeCode.NCName
  105.             // XmlTypeCode.Id
  106.             // XmlTypeCode.Idref
  107.             // XmlTypeCode.Entity
  108.             // XmlTypeCode.Integer
  109.             // XmlTypeCode.NonPositiveInteger
  110.             // XmlTypeCode.NegativeInteger
  111.             // XmlTypeCode.Long
  112.             // XmlTypeCode.Int
  113.             // XmlTypeCode.Short
  114.             // XmlTypeCode.Byte
  115.             // XmlTypeCode.NonNegativeInteger
  116.             // XmlTypeCode.UnsignedLong
  117.             // XmlTypeCode.UnsignedInt
  118.             // XmlTypeCode.UnsignedShort
  119.             // XmlTypeCode.UnsignedByte
  120.             // XmlTypeCode.PositiveInteger
  121.             // XmlTypeCode.YearMonthDuration
  122.             // XmlTypeCode.DayTimeDuration
  123.         typeof(int), typeof(int), typeof(decimal), typeof(TimeSpan), typeof(TimeSpan)};
  124.        
  125.         private static readonly Type[] TypeCodeToCachedStorage = {typeof(IList<XPathItem>), typeof(IList<XPathItem>), typeof(IList<XPathNavigator>), typeof(IList<XPathNavigator>), typeof(IList<XPathNavigator>), typeof(IList<XPathNavigator>), typeof(IList<XPathNavigator>), typeof(IList<XPathNavigator>), typeof(IList<XPathNavigator>), typeof(IList<XPathNavigator>),
  126.         typeof(IList<XPathItem>), typeof(IList<string>), typeof(IList<string>), typeof(IList<bool>), typeof(IList<decimal>), typeof(IList<float>), typeof(IList<double>), typeof(IList<string>), typeof(IList<DateTime>), typeof(IList<DateTime>),
  127.         typeof(IList<DateTime>), typeof(IList<DateTime>), typeof(IList<DateTime>), typeof(IList<DateTime>), typeof(IList<DateTime>), typeof(IList<DateTime>), typeof(IList<byte[]>), typeof(IList<byte[]>), typeof(IList<string>), typeof(IList<XmlQualifiedName>),
  128.         typeof(IList<XmlQualifiedName>), typeof(IList<string>), typeof(IList<string>), typeof(IList<string>), typeof(IList<string>), typeof(IList<string>), typeof(IList<string>), typeof(IList<string>), typeof(IList<string>), typeof(IList<string>),
  129.         typeof(IList<long>), typeof(IList<decimal>), typeof(IList<decimal>), typeof(IList<long>), typeof(IList<int>), typeof(IList<int>), typeof(IList<int>), typeof(IList<decimal>), typeof(IList<decimal>), typeof(IList<long>),
  130.             // XmlTypeCode.None
  131.             // XmlTypeCode.Item
  132.             // XmlTypeCode.Node
  133.             // XmlTypeCode.Document
  134.             // XmlTypeCode.Element
  135.             // XmlTypeCode.Attribute
  136.             // XmlTypeCode.Namespace
  137.             // XmlTypeCode.ProcessingInstruction
  138.             // XmlTypeCode.Comment
  139.             // XmlTypeCode.Text
  140.             // XmlTypeCode.AnyAtomicType
  141.             // XmlTypeCode.UntypedAtomic
  142.             // XmlTypeCode.String
  143.             // XmlTypeCode.Boolean
  144.             // XmlTypeCode.Decimal
  145.             // XmlTypeCode.Float
  146.             // XmlTypeCode.Double
  147.             // XmlTypeCode.Duration
  148.             // XmlTypeCode.DateTime
  149.             // XmlTypeCode.Time
  150.             // XmlTypeCode.Date
  151.             // XmlTypeCode.GYearMonth
  152.             // XmlTypeCode.GYear
  153.             // XmlTypeCode.GMonthDay
  154.             // XmlTypeCode.GDay
  155.             // XmlTypeCode.GMonth
  156.             // XmlTypeCode.HexBinary
  157.             // XmlTypeCode.Base64Binary
  158.             // XmlTypeCode.AnyUri
  159.             // XmlTypeCode.QName
  160.             // XmlTypeCode.Notation
  161.             // XmlTypeCode.NormalizedString
  162.             // XmlTypeCode.Token
  163.             // XmlTypeCode.Language
  164.             // XmlTypeCode.NmToken
  165.             // XmlTypeCode.Name
  166.             // XmlTypeCode.NCName
  167.             // XmlTypeCode.Id
  168.             // XmlTypeCode.Idref
  169.             // XmlTypeCode.Entity
  170.             // XmlTypeCode.Integer
  171.             // XmlTypeCode.NonPositiveInteger
  172.             // XmlTypeCode.NegativeInteger
  173.             // XmlTypeCode.Long
  174.             // XmlTypeCode.Int
  175.             // XmlTypeCode.Short
  176.             // XmlTypeCode.Byte
  177.             // XmlTypeCode.NonNegativeInteger
  178.             // XmlTypeCode.UnsignedLong
  179.             // XmlTypeCode.UnsignedInt
  180.             // XmlTypeCode.UnsignedShort
  181.             // XmlTypeCode.UnsignedByte
  182.             // XmlTypeCode.PositiveInteger
  183.             // XmlTypeCode.YearMonthDuration
  184.             // XmlTypeCode.DayTimeDuration
  185.         typeof(IList<int>), typeof(IList<int>), typeof(IList<decimal>), typeof(IList<TimeSpan>), typeof(IList<TimeSpan>)};
  186.     }
  187. }

Developer Fusion