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

  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.Collections;
  20.     using System.Reflection.Emit;
  21.    
  22.     internal sealed class CustomAttributeList : AST
  23.     {
  24.         private ArrayList list;
  25.         private ArrayList customAttributes;
  26.         private bool alreadyPartiallyEvaluated;
  27.        
  28.         internal CustomAttributeList(Context context) : base(context)
  29.         {
  30.             this.list = new ArrayList();
  31.             this.customAttributes = null;
  32.             this.alreadyPartiallyEvaluated = false;
  33.         }
  34.        
  35.         internal void Append(CustomAttribute elem)
  36.         {
  37.             this.list.Add(elem);
  38.             this.context.UpdateWith(elem.context);
  39.         }
  40.        
  41.         internal bool ContainsExpandoAttribute()
  42.         {
  43.             //Use only before partial evaluation has been done
  44.             for (int i = 0int n = this.list.Count; i < n; i++) {
  45.                 CustomAttribute ca = (CustomAttribute)this.list[i];
  46.                 if (ca == null)
  47.                     continue;
  48.                 if (ca.IsExpandoAttribute())
  49.                     return true;
  50.             }
  51.             return false;
  52.         }
  53.        
  54.         // Assume the custom attribute list has been partially evaluated already
  55.         internal CustomAttribute GetAttribute(Type attributeClass)
  56.         {
  57.             for (int i = 0int n = this.list.Count; i < n; i++) {
  58.                 CustomAttribute ca = (CustomAttribute)this.list[i];
  59.                 if (ca == null)
  60.                     continue;
  61.                 object type = ca.type;
  62.                 if (type is Type)
  63.                     if (type == attributeClass)
  64.                         return (CustomAttribute)this.list[i];
  65.             }
  66.             return null;
  67.         }
  68.        
  69.         internal override object Evaluate()
  70.         {
  71.             return this.Evaluate(false);
  72.         }
  73.        
  74.         internal object Evaluate(bool getForProperty)
  75.         {
  76.             int n = this.list.Count;
  77.             ArrayList attrValues = new ArrayList(n);
  78.             for (int i = 0; i < n; i++) {
  79.                 CustomAttribute ca = (CustomAttribute)this.list[i];
  80.                 if (ca == null)
  81.                     continue;
  82.                 if (ca.raiseToPropertyLevel) {
  83.                     if (!getForProperty)
  84.                         continue;
  85.                 }
  86.                 else if (getForProperty)
  87.                     continue;
  88.                 attrValues.Add(ca.Evaluate());
  89.             }
  90.             object[] result = new object[attrValues.Count];
  91.             attrValues.CopyTo(result);
  92.             return result;
  93.         }
  94.        
  95.         internal CustomAttributeBuilder[] GetCustomAttributeBuilders(bool getForProperty)
  96.         {
  97.             this.customAttributes = new ArrayList(this.list.Count);
  98.             for (int i = 0int n = this.list.Count; i < n; i++) {
  99.                 CustomAttribute ca = (CustomAttribute)this.list[i];
  100.                 if (ca == null)
  101.                     continue;
  102.                 if (ca.raiseToPropertyLevel) {
  103.                     if (!getForProperty)
  104.                         continue;
  105.                 }
  106.                 else if (getForProperty)
  107.                     continue;
  108.                 CustomAttributeBuilder attribute = ca.GetCustomAttribute();
  109.                 if (attribute != null)
  110.                     this.customAttributes.Add(attribute);
  111.             }
  112.             CustomAttributeBuilder[] result = new CustomAttributeBuilder[this.customAttributes.Count];
  113.             this.customAttributes.CopyTo(result);
  114.             return result;
  115.         }
  116.        
  117.         internal override AST PartiallyEvaluate()
  118.         {
  119.             if (this.alreadyPartiallyEvaluated)
  120.                 return this;
  121.             this.alreadyPartiallyEvaluated = true;
  122.             for (int i = 0int n = this.list.Count; i < n; i++)
  123.                 this.list[i] = ((CustomAttribute)this.list[i]).PartiallyEvaluate();
  124.             for (int i = 0int n = this.list.Count; i < n; i++) {
  125.                 CustomAttribute ca = (CustomAttribute)this.list[i];
  126.                 if (ca == null)
  127.                     continue;
  128.                 //Already found to be invalid
  129.                 object caType = ca.GetTypeIfAttributeHasToBeUnique();
  130.                 if (caType == null)
  131.                     continue;
  132.                 for (int j = i + 1; j < n; j++) {
  133.                     CustomAttribute caj = (CustomAttribute)this.list[j];
  134.                     if (caj == null)
  135.                         continue;
  136.                     if (caType == caj.type) {
  137.                         caj.context.HandleError(JSError.CustomAttributeUsedMoreThanOnce);
  138.                         this.list[j] = null;
  139.                         //Remove duplicate
  140.                     }
  141.                 }
  142.             }
  143.             return this;
  144.         }
  145.        
  146.         internal void Remove(CustomAttribute elem)
  147.         {
  148.             this.list.Remove(elem);
  149.         }
  150.        
  151.         internal void SetTarget(AST target)
  152.         {
  153.             for (int i = 0int n = this.list.Count; i < n; i++)
  154.                 ((CustomAttribute)this.list[i]).SetTarget(target);
  155.         }
  156.        
  157.         internal override void TranslateToIL(ILGenerator il, Type rtype)
  158.         {
  159.         }
  160.        
  161.         internal override void TranslateToILInitializer(ILGenerator il)
  162.         {
  163.         }
  164.        
  165.     }
  166.    
  167. }

Developer Fusion