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

  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. /* Base class for parameters, local variables, global variables and class members. Used at compile time for symbol table entries.
  16. Only one of these should be allocated per source entity. Heavyweight because of the compile time info. */
  17. namespace Microsoft.JScript
  18. {
  19.    
  20.     using System;
  21.     using System.Collections;
  22.     using System.Reflection;
  23.     using System.Reflection.Emit;
  24.    
  25.     public abstract class JSVariableField : JSField
  26.     {
  27.         internal ScriptObject obj;
  28.         private string name;
  29.         internal string debuggerName;
  30.         internal object metaData;
  31.         internal TypeExpression type;
  32.         //Records the programmer provided type of the field. null == omitted == Object.
  33.         internal FieldAttributes attributeFlags;
  34.         private MethodInfo method;
  35.         private ConstructorInfo cons;
  36.         internal object value;
  37.         internal CustomAttributeList customAttributes;
  38.         internal Context originalContext;
  39.         // never change this context. It is shared
  40.         internal CLSComplianceSpec clsCompliance;
  41.        
  42.         internal JSVariableField(string name, ScriptObject obj, FieldAttributes attributeFlags)
  43.         {
  44.             this.obj = obj;
  45.             this.name = name;
  46.             this.debuggerName = name;
  47.             this.metaData = null;
  48.             if ((attributeFlags & FieldAttributes.FieldAccessMask) == (FieldAttributes)0)
  49.                 attributeFlags |= FieldAttributes.Public;
  50.             //Fields not marked otherwise, are public
  51.             this.attributeFlags = attributeFlags;
  52.             this.type = null;
  53.             this.method = null;
  54.             this.cons = null;
  55.             this.value = null;
  56.             this.originalContext = null;
  57.             this.clsCompliance = CLSComplianceSpec.NotAttributed;
  58.         }
  59.        
  60.         public override FieldAttributes Attributes {
  61.             get { return this.attributeFlags; }
  62.         }
  63.        
  64.         internal void CheckCLSCompliance(bool classIsCLSCompliant)
  65.         {
  66.             if (this.customAttributes != null) {
  67.                 CustomAttribute clsAttr = this.customAttributes.GetAttribute(Typeob.CLSCompliantAttribute);
  68.                 if (clsAttr != null) {
  69.                     this.clsCompliance = clsAttr.GetCLSComplianceValue();
  70.                     this.customAttributes.Remove(clsAttr);
  71.                 }
  72.             }
  73.             if (classIsCLSCompliant) {
  74.                 if (this.clsCompliance != CLSComplianceSpec.NonCLSCompliant)
  75.                     if (type != null && !type.IsCLSCompliant()) {
  76.                         this.clsCompliance = CLSComplianceSpec.NonCLSCompliant;
  77.                         if (this.originalContext != null)
  78.                             this.originalContext.HandleError(JSError.NonCLSCompliantMember);
  79.                     }
  80.             }
  81.             else if (this.clsCompliance == CLSComplianceSpec.CLSCompliant)
  82.                 this.originalContext.HandleError(JSError.MemberTypeCLSCompliantMismatch);
  83.         }
  84.        
  85.         public override Type DeclaringType {
  86.             get {
  87.                 if (this.obj is ClassScope)
  88.                     return ((ClassScope)(this.obj)).GetTypeBuilderOrEnumBuilder();
  89.                 else
  90.                     return null;
  91.             }
  92.         }
  93.        
  94.         public override Type FieldType {
  95.             get {
  96.                 Type result = Typeob.Object;
  97.                 if (this.type != null) {
  98.                     result = this.type.ToType();
  99.                     if (result == Typeob.Void)
  100.                         result = Typeob.Object;
  101.                 }
  102.                 return result;
  103.             }
  104.         }
  105.        
  106.        
  107.         internal MethodInfo GetAsMethod(object obj)
  108.         {
  109.             if (this.method == null)
  110.                 this.method = new JSFieldMethod(this, obj);
  111.             return this.method;
  112.         }
  113.        
  114.         internal override string GetClassFullName()
  115.         {
  116.             if (this.obj is ClassScope) {
  117.                 return ((ClassScope)this.obj).GetFullName();
  118.             }
  119.             throw new JScriptException(JSError.InternalError);
  120.         }
  121.        
  122.         public override object[] GetCustomAttributes(bool inherit)
  123.         {
  124.             if (this.customAttributes != null)
  125.                 return (object[])this.customAttributes.Evaluate();
  126.             return new object[0];
  127.         }
  128.        
  129.         internal virtual IReflect GetInferredType(JSField inference_target)
  130.         {
  131.             if (this.type != null)
  132.                 return this.type.ToIReflect();
  133.             else
  134.                 return Typeob.Object;
  135.         }
  136.        
  137.         internal override object GetMetaData()
  138.         {
  139.             return this.metaData;
  140.         }
  141.        
  142.         internal override PackageScope GetPackage()
  143.         {
  144.             if (this.obj is ClassScope) {
  145.                 return ((ClassScope)this.obj).GetPackage();
  146.             }
  147.             throw new JScriptException(JSError.InternalError);
  148.         }
  149.        
  150.         public override string Name {
  151.             get { return this.name; }
  152.         }
  153.        
  154.         internal void WriteCustomAttribute(bool doCRS)
  155.         {
  156.             if (this.metaData is FieldBuilder) {
  157.                 FieldBuilder fb = (FieldBuilder)this.metaData;
  158.                 if (this.customAttributes != null) {
  159.                     CustomAttributeBuilder[] fieldCustomAttributes = this.customAttributes.GetCustomAttributeBuilders(false);
  160.                     for (int attIndex = 0int attLength = fieldCustomAttributes.Length; attIndex < attLength; attIndex++)
  161.                         fb.SetCustomAttribute(fieldCustomAttributes[attIndex]);
  162.                 }
  163.                 if (this.clsCompliance == CLSComplianceSpec.CLSCompliant)
  164.                     fb.SetCustomAttribute(new CustomAttributeBuilder(CompilerGlobals.clsCompliantAttributeCtor, new object[] {true}));
  165.                 else if (this.clsCompliance == CLSComplianceSpec.NonCLSCompliant)
  166.                     fb.SetCustomAttribute(new CustomAttributeBuilder(CompilerGlobals.clsCompliantAttributeCtor, new object[] {false}));
  167.                 if (doCRS) {
  168.                     if (this.IsStatic)
  169.                         fb.SetCustomAttribute(new CustomAttributeBuilder(CompilerGlobals.contextStaticAttributeCtor, new object[] {}));
  170.                 }
  171.             }
  172.         }
  173.        
  174.     }
  175. }

Developer Fusion