Neuron®
The Neuron® is the basis for the creation of open and secure federated networks for smart societies.
Loading...
Searching...
No Matches
DynamicMember.cs
2using System.Threading.Tasks;
7
9{
14 {
24 public DynamicMember(ScriptNode Left, ScriptNode Right, bool NullCheck, int Start, int Length, Expression Expression)
25 : base(Left, Right, NullCheck, Start, Length, Expression)
26 {
27 this.isAsync = true;
28 }
29
34 public override bool IsAsynchronous => true;
35
42 {
43 return this.EvaluateAsync(Variables).Result;
44 }
45
51 public override async Task<IElement> EvaluateAsync(Variables Variables)
52 {
53 IElement Operand = this.left.Evaluate(Variables);
54 if (this.nullCheck && Operand.AssociatedObjectValue is null)
55 return Operand;
56
57 IElement Name = this.right.Evaluate(Variables);
58
59 return await EvaluateDynamicMember(Operand, Name, this.nullCheck, this);
60 }
61
70 public static async Task<IElement> EvaluateDynamicMember(IElement Operand, IElement Member, bool NullCheck, ScriptNode Node)
71 {
72 if (Member.IsScalar)
73 {
74 if (!(Member.AssociatedObjectValue is string s))
75 throw new ScriptRuntimeException("Member names must be strings.", Node);
76
77 return await NamedMember.EvaluateDynamic(Operand, s, NullCheck, Node);
78 }
79 else
80 {
81 if (Operand.IsScalar)
82 {
84
85 foreach (IElement E in Member.ChildElements)
86 Elements.Add(await EvaluateDynamicMember(Operand, E, NullCheck, Node));
87
88 return Member.Encapsulate(Elements, Node);
89 }
90 else
91 {
92 ICollection <IElement> OperandElements = Operand.ChildElements;
93 ICollection<IElement> MemberElements = Member.ChildElements;
94
95 if (OperandElements.Count == MemberElements.Count)
96 {
98 IEnumerator<IElement> eOperand = OperandElements.GetEnumerator();
99 IEnumerator<IElement> eMember = MemberElements.GetEnumerator();
100
101 try
102 {
103 while (eOperand.MoveNext() && eMember.MoveNext())
104 Elements.Add(await EvaluateDynamicMember(eOperand.Current, eMember.Current, NullCheck, Node));
105 }
106 finally
107 {
108 eOperand.Dispose();
109 eMember.Dispose();
110 }
111
112 return Operand.Encapsulate(Elements, Node);
113 }
114 else
115 {
116 ChunkedList <IElement> OperandResult = new ChunkedList<IElement>();
117
118 foreach (IElement OperandChild in OperandElements)
119 {
120 ChunkedList<IElement> MemberResult = new ChunkedList<IElement>();
121
122 foreach (IElement MemberChild in MemberElements)
123 MemberResult.Add(await EvaluateDynamicMember (OperandChild, MemberChild, NullCheck, Node));
124
125 OperandResult.Add(Member.Encapsulate(MemberResult, Node));
126 }
127
128 return Operand.Encapsulate(OperandResult, Node);
129 }
130 }
131 }
132 }
133
134 }
135}
A chunked list is a linked list of chunks of objects of type T .
Definition: ChunkedList.cs:54
void Add(T Item)
Adds an item to the collection.
Definition: ChunkedList.cs:272
Class managing a script expression.
Definition: Expression.cs:41
ScriptNode right
Right operand.
ScriptNode left
Left operand.
Base class for all unary operators performing operand null checks.
readonly bool nullCheck
If null should be returned if operand is null.
Base class for all nodes in a parsed script tree.
Definition: ScriptNode.cs:69
int Length
Length of expression covered by node.
Definition: ScriptNode.cs:101
int Start
Start position in script expression.
Definition: ScriptNode.cs:92
abstract IElement Evaluate(Variables Variables)
Evaluates the node, using the variables provided in the Variables collection. This method should be ...
override async Task< IElement > EvaluateAsync(Variables Variables)
Evaluates the node, using the variables provided in the Variables collection.
DynamicMember(ScriptNode Left, ScriptNode Right, bool NullCheck, int Start, int Length, Expression Expression)
Dynamic member operator
override bool IsAsynchronous
If the node (or its decendants) include asynchronous evaluation. Asynchronous nodes should be evaluat...
override IElement Evaluate(Variables Variables)
Evaluates the node, using the variables provided in the Variables collection.
static async Task< IElement > EvaluateDynamicMember(IElement Operand, IElement Member, bool NullCheck, ScriptNode Node)
Evaluates a dynamic member.
static async Task< IElement > EvaluateDynamic(IElement Operand, string Name, bool NullCheck, ScriptNode Node)
Evaluates the member operator dynamically on an operand.
Definition: NamedMember.cs:232
Collection of variables.
Definition: Variables.cs:25
Basic interface for all types of elements.
Definition: IElement.cs:21
object AssociatedObjectValue
Associated object value.
Definition: IElement.cs:34
ICollection< IElement > ChildElements
An enumeration of child elements. If the element is a scalar, this property will return null.
Definition: IElement.cs:50
IElement Encapsulate(ChunkedList< IElement > Elements, ScriptNode Node)
Encapsulates a set of elements into a similar structure as that provided by the current element.
bool IsScalar
If the element represents a scalar value.
Definition: IElement.cs:42