Guest User

Expose.cs

a guest
Oct 24th, 2017
254
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection;
  5. using Ludiq;
  6. using UnityEngine;
  7.  
  8. namespace Bolt
  9. {
  10.     /// <summary>
  11.     /// Exposes all members of the type.
  12.     /// </summary>
  13.     [SpecialUnit]
  14.     public sealed class Expose : Unit, ICanCopyFrom<Expose>, IAotStubbable
  15.     {
  16.         public Expose() : base() { }
  17.  
  18.         public Expose(Type type) : base()
  19.         {
  20.             this.type = type;
  21.         }
  22.  
  23.         [Serialize, Inspectable, Ludiq.TypeFilter(Enums = false)]
  24.         public Type type { get; set; }
  25.  
  26.         [Serialize, Inspectable, UnitHeaderInspectable("Instance"), InspectorToggleLeft]
  27.         public bool instance { get; set; } = true;
  28.  
  29.         [Serialize, Inspectable, UnitHeaderInspectable("Static"), InspectorToggleLeft]
  30.         public bool @static { get; set; } = true;
  31.  
  32.         [DoNotSerialize]
  33.         public Dictionary<ValueOutput, Member> members { get; private set; }
  34.  
  35.         /// <summary>
  36.         /// The instance of the exposed type.
  37.         /// </summary>
  38.         [DoNotSerialize]
  39.         [PortLabelHidden]
  40.         [NullMeansSelf]
  41.         public ValueInput target { get; private set; }
  42.  
  43.         public override bool isProperlyConfigured => type != null;
  44.  
  45.         IEnumerable<object> IAotStubbable.aotStubs
  46.         {
  47.             get
  48.             {
  49.                 foreach (var member in members.Values)
  50.                 {
  51.                     yield return member.info;
  52.                 }
  53.             }
  54.         }
  55.  
  56.         protected override void Definition()
  57.         {
  58.             members = new Dictionary<ValueOutput, Member>();
  59.  
  60.             var requiresTarget = false;
  61.  
  62.             foreach (var member in type.GetMembers()
  63.                                        .Where(m => m is FieldInfo || m is PropertyInfo)
  64.                                        .Select(m => m.ToManipulator())
  65.                                        .DistinctBy(m => m.name) // To account for "new" duplicates
  66.                                        .Where(Include)
  67.                                        .OrderBy(m => m.requiresTarget ? 0 : 1)
  68.                                        .ThenBy(m => m.order))
  69.             {
  70.                 var memberPort = ValueOutput(member.type, member.name, (recursion) => GetValue(recursion, member));
  71.  
  72.                 if (member.isPredictable)
  73.                 {
  74.                     memberPort.Predictable();
  75.                 }
  76.  
  77.                 members.Add(memberPort, member);
  78.  
  79.                 if (member.requiresTarget)
  80.                 {
  81.                     requiresTarget = true;
  82.                 }
  83.             }
  84.  
  85.             if (requiresTarget)
  86.             {
  87.                 target = ValueInput(type, nameof(target)).NullMeansSelf();
  88.  
  89.                 target.SetDefaultValue(type.Default());
  90.  
  91.                 foreach (var member in members.Keys)
  92.                 {
  93.                     if (members[member].requiresTarget)
  94.                     {
  95.                         Relation(target, member);
  96.                     }
  97.                 }
  98.             }
  99.         }
  100.  
  101.         private bool Include(Member member)
  102.         {
  103.             if (!instance && member.requiresTarget)
  104.             {
  105.                 return false;
  106.             }
  107.  
  108.             if (!@static && !member.requiresTarget)
  109.             {
  110.                 return false;
  111.             }
  112.  
  113.             return member.isPubliclyGettable && !member.info.HasAttribute<ObsoleteAttribute>() && !member.isIndexer;
  114.         }
  115.  
  116.         private object GetValue(Recursion recursion, Member member)
  117.         {
  118.             if (member.requiresTarget)
  119.             {
  120.                 member.target = target.GetValue(recursion, member.targetType);
  121.             }
  122.  
  123.             return member.Get();
  124.         }
  125.  
  126.         public void CopyFrom(Expose source)
  127.         {
  128.             base.CopyFrom(source);
  129.             type = source.type;
  130.         }
  131.     }
  132. }
RAW Paste Data