The Labs \ Source Viewer \ SSCLI \ Microsoft.JScript \ DeclaredEnumValue

  1. // ==++==
  2. //
  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. //
  14. // ==--==
  15. namespace Microsoft.JScript
  16. {
  17.    
  18.     using System;
  19.     using System.Reflection;
  20.     using System.Reflection.Emit;
  21.    
  22.     internal abstract class EnumWrapper : IConvertible
  23.     {
  24.         internal abstract object value {
  25.             get;
  26.         }
  27.        
  28.         internal abstract Type type {
  29.             get;
  30.         }
  31.        
  32.         internal abstract string name {
  33.             get;
  34.         }
  35.        
  36.         internal virtual IReflect classScopeOrType {
  37.             get { return this.type; }
  38.         }
  39.        
  40.         TypeCode IConvertible.GetTypeCode()
  41.         {
  42.             return Convert.GetTypeCode(this.value);
  43.         }
  44.        
  45.         bool IConvertible.ToBoolean(IFormatProvider provider)
  46.         {
  47.             return ((IConvertible)this.value).ToBoolean(provider);
  48.         }
  49.        
  50.         char IConvertible.ToChar(IFormatProvider provider)
  51.         {
  52.             return ((IConvertible)this.value).ToChar(provider);
  53.         }
  54.        
  55.         sbyte IConvertible.ToSByte(IFormatProvider provider)
  56.         {
  57.             return ((IConvertible)this.value).ToSByte(provider);
  58.         }
  59.        
  60.         byte IConvertible.ToByte(IFormatProvider provider)
  61.         {
  62.             return ((IConvertible)this.value).ToByte(provider);
  63.         }
  64.        
  65.         short IConvertible.ToInt16(IFormatProvider provider)
  66.         {
  67.             return ((IConvertible)this.value).ToInt16(provider);
  68.         }
  69.        
  70.         ushort IConvertible.ToUInt16(IFormatProvider provider)
  71.         {
  72.             return ((IConvertible)this.value).ToUInt16(provider);
  73.         }
  74.        
  75.         int IConvertible.ToInt32(IFormatProvider provider)
  76.         {
  77.             return ((IConvertible)this.value).ToInt32(provider);
  78.         }
  79.        
  80.         uint IConvertible.ToUInt32(IFormatProvider provider)
  81.         {
  82.             return ((IConvertible)this.value).ToUInt32(provider);
  83.         }
  84.        
  85.         long IConvertible.ToInt64(IFormatProvider provider)
  86.         {
  87.             return ((IConvertible)this.value).ToInt64(provider);
  88.         }
  89.        
  90.         ulong IConvertible.ToUInt64(IFormatProvider provider)
  91.         {
  92.             return ((IConvertible)this.value).ToUInt64(provider);
  93.         }
  94.        
  95.         float IConvertible.ToSingle(IFormatProvider provider)
  96.         {
  97.             return ((IConvertible)this.value).ToSingle(provider);
  98.         }
  99.        
  100.         double IConvertible.ToDouble(IFormatProvider provider)
  101.         {
  102.             return ((IConvertible)this.value).ToDouble(provider);
  103.         }
  104.        
  105.         decimal IConvertible.ToDecimal(IFormatProvider provider)
  106.         {
  107.             return ((IConvertible)this.value).ToDecimal(provider);
  108.         }
  109.        
  110.         DateTime IConvertible.ToDateTime(IFormatProvider provider)
  111.         {
  112.             return ((IConvertible)this.value).ToDateTime(provider);
  113.         }
  114.        
  115.         string IConvertible.ToString(IFormatProvider provider)
  116.         {
  117.             return ((IConvertible)this.value).ToString(provider);
  118.         }
  119.        
  120.         object IConvertible.ToType(Type conversionType, IFormatProvider provider)
  121.         {
  122.             return ((IConvertible)this.value).ToType(conversionType, provider);
  123.         }
  124.        
  125.         internal object ToNumericValue()
  126.         {
  127.             return this.value;
  128.         }
  129.        
  130.         public override string ToString()
  131.         {
  132.             if (this.name != null)
  133.                 return this.name;
  134.             FieldInfo[] fields = this.type.GetFields(BindingFlags.Static | BindingFlags.Public);
  135.             foreach (FieldInfo field in fields)
  136.                 if (StrictEquality.JScriptStrictEquals(this.value, field.GetValue(null)))
  137.                     return field.Name;
  138.             return Convert.ToString(this.value);
  139.         }
  140.     }
  141.    
  142.    
  143.     internal sealed class DeclaredEnumValue : EnumWrapper
  144.     {
  145.         private string _name;
  146.         internal ClassScope _classScope;
  147.         internal object _value;
  148.        
  149.         internal DeclaredEnumValue(object value, string name, ClassScope classScope)
  150.         {
  151.             this._name = name;
  152.             this._classScope = classScope;
  153.             this._value = value;
  154.         }
  155.        
  156.         internal override object value {
  157.             get { return this._value; }
  158.         }
  159.        
  160.         internal override Type type {
  161.             get { return this._classScope.GetTypeBuilderOrEnumBuilder(); }
  162.         }
  163.        
  164.         internal override string name {
  165.             get { return this._name; }
  166.         }
  167.        
  168.         internal override IReflect classScopeOrType {
  169.             get { return this._classScope; }
  170.         }
  171.        
  172.         internal void CoerceToBaseType(Type bt, Context errCtx)
  173.         {
  174.             object val = 0;
  175.             AST pval = ((AST)this.value).PartiallyEvaluate();
  176.             if (pval is ConstantWrapper)
  177.                 val = ((ConstantWrapper)pval).Evaluate();
  178.             else
  179.                 pval.context.HandleError(JSError.NotConst);
  180.             try {
  181.                 this._value = Convert.CoerceT(val, bt);
  182.             }
  183.             catch {
  184.                 errCtx.HandleError(JSError.TypeMismatch);
  185.                 this._value = Convert.CoerceT(0, bt);
  186.             }
  187.         }
  188.        
  189.     }
  190.    
  191.     internal sealed class MetadataEnumValue : EnumWrapper
  192.     {
  193.         private Type _type;
  194.         private object _value;
  195.        
  196.         static internal object GetEnumValue(Type type, object value)
  197.         {
  198.             Debug.Assert(type.IsEnum);
  199.             if (!type.Assembly.ReflectionOnly)
  200.                 return Enum.ToObject(type, value);
  201.             return new MetadataEnumValue(type, value);
  202.         }
  203.        
  204.         private MetadataEnumValue(Type type, object value)
  205.         {
  206.             this._type = type;
  207.             this._value = value;
  208.         }
  209.        
  210.         internal override object value {
  211.             get { return this._value; }
  212.         }
  213.        
  214.         internal override Type type {
  215.             get { return this._type; }
  216.         }
  217.        
  218.         internal override string name {
  219.             get {
  220.                 string name = Enum.GetName(this._type, this._value);
  221.                 if (name == null)
  222.                     name = this._value.ToString();
  223.                 return name;
  224.             }
  225.         }
  226.     }
  227. }

Developer Fusion