Neuron®
The Neuron® is the basis for the creation of open and secure federated networks for smart societies.
Loading...
Searching...
No Matches
DynamicMember.cs
1using System;
2using System.Collections.Generic;
3using System.Threading.Tasks;
8
10{
15 {
25 public DynamicMember(ScriptNode Left, ScriptNode Right, bool NullCheck, int Start, int Length, Expression Expression)
26 : base(Left, Right, NullCheck, Start, Length, Expression)
27 {
28 this.isAsync = true;
29 }
30
35 public override bool IsAsynchronous => true;
36
43 {
44 return this.EvaluateAsync(Variables).Result;
45 }
46
52 public override async Task<IElement> EvaluateAsync(Variables Variables)
53 {
54 IElement Operand = this.left.Evaluate(Variables);
55 if (this.nullCheck && Operand.AssociatedObjectValue is null)
56 return Operand;
57
58 IElement Name = this.right.Evaluate(Variables);
59
60 return await EvaluateDynamicMember(Operand, Name, this.nullCheck, this);
61 }
62
71 public static async Task<IElement> EvaluateDynamicMember(IElement Operand, IElement Member, bool NullCheck, ScriptNode Node)
72 {
73 if (Member.IsScalar)
74 {
75 if (!(Member.AssociatedObjectValue is string s))
76 throw new ScriptRuntimeException("Member names must be strings.", Node);
77
78 return await NamedMember.EvaluateDynamic(Operand, s, NullCheck, Node);
79 }
80 else
81 {
82 if (Operand.IsScalar)
83 {
84 LinkedList<IElement> Elements = new LinkedList<IElement>();
85
86 foreach (IElement E in Member.ChildElements)
87 Elements.AddLast(await EvaluateDynamicMember(Operand, E, NullCheck, Node));
88
89 return Member.Encapsulate(Elements, Node);
90 }
91 else
92 {
93 ICollection <IElement> OperandElements = Operand.ChildElements;
94 ICollection<IElement> MemberElements = Member.ChildElements;
95
96 if (OperandElements.Count == MemberElements.Count)
97 {
98 LinkedList<IElement> Elements = new LinkedList<IElement>();
99 IEnumerator<IElement> eOperand = OperandElements.GetEnumerator();
100 IEnumerator<IElement> eMember = MemberElements.GetEnumerator();
101
102 try
103 {
104 while (eOperand.MoveNext() && eMember.MoveNext())
105 Elements.AddLast(await EvaluateDynamicMember(eOperand.Current, eMember.Current, NullCheck, Node));
106 }
107 finally
108 {
109 eOperand.Dispose();
110 eMember.Dispose();
111 }
112
113 return Operand.Encapsulate(Elements, Node);
114 }
115 else
116 {
117 LinkedList<IElement> OperandResult = new LinkedList<IElement>();
118
119 foreach (IElement OperandChild in OperandElements)
120 {
121 LinkedList<IElement> MemberResult = new LinkedList<IElement>();
122
123 foreach (IElement MemberChild in MemberElements)
124 MemberResult.AddLast(await EvaluateDynamicMember (OperandChild, MemberChild, NullCheck, Node));
125
126 OperandResult.AddLast(Member.Encapsulate(MemberResult, Node));
127 }
128
129 return Operand.Encapsulate(OperandResult, Node);
130 }
131 }
132 }
133 }
134
135 }
136}
Class managing a script expression.
Definition: Expression.cs:39
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:227
Collection of variables.
Definition: Variables.cs:25
Basic interface for all types of elements.
Definition: IElement.cs:20
object AssociatedObjectValue
Associated object value.
Definition: IElement.cs:33
ICollection< IElement > ChildElements
An enumeration of child elements. If the element is a scalar, this property will return null.
Definition: IElement.cs:49
IElement Encapsulate(ICollection< 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:41