Files
2020-12-03 23:24:44 +00:00

95 lines
2.7 KiB
C#

using Advanced_Software_Engineering.Verbs.Value;
using System.Collections.Generic;
using System.Drawing;
namespace Advanced_Software_Engineering.Verbs.Flow {
public class MethodChunk : VerbChunk, IVerb, IValue {
private readonly ValueStorage valueStorage;
private readonly DeclareVariable[] variables;
private UpdateVariable[] updateVariables;
private bool init = false;
private IValue result;
public MethodChunk(ValueStorage valueStorage, DeclareVariable[] variables) : base() {
this.valueStorage = valueStorage;
this.variables = variables;
}
public List<string> GetVariableNames() {
List<string> VariableNames = new List<string>();
foreach (DeclareVariable variable in variables) VariableNames.Add(variable.GetName());
return VariableNames;
}
public DeclareVariable[] GetVariables() {
return variables;
}
public void SetVariableValues(UpdateVariable[] updateVariables) {
this.updateVariables = updateVariables;
}
public MethodChunk DuplicateForExecution() {
MethodChunk method = new MethodChunk(valueStorage, variables);
method.SetVariableValues(updateVariables);
foreach (IVerb verb in base.GetVerbs()) method.AddVerb(verb);
return method;
}
public new void ExecuteVerb() {
init = false;
result = null;
valueStorage.IncreaseStack();
//Declare everything
foreach (DeclareVariable variable in variables) variable.ExecuteVerb();
//Set the values of everything
foreach (UpdateVariable variable in updateVariables) variable.ExecuteVerb();
//Run code
base.ExecuteVerb();
if (valueStorage.CheckVariableExists("ret")) {
result = valueStorage.GetVariable("ret");
init = true;
}
valueStorage.DecreaseStack();
}
public IValue GetResult() {
return result;
}
public IValue Clone() {
return GetResult().Clone();
}
public string GetOriginalType() {
return GetResult().GetOriginalType();
}
public bool isInitialised() {
return init;
}
public bool ToBool() {
return GetResult().ToBool();
}
public Color ToColor() {
return GetResult().ToColor();
}
public double ToDouble() {
return GetResult().ToDouble();
}
public int ToInt() {
return GetResult().ToInt();
}
}
}