Skip to content

Commit 706b977

Browse files
committed
2 parents b0c2cde + ec55a51 commit 706b977

File tree

37 files changed

+343
-139
lines changed

37 files changed

+343
-139
lines changed

Code/ArgumentSystem/Arguments/BoolArgument.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public DynamicTryGet<bool> GetConvertSolution(BaseToken token)
3434
}
3535

3636
return valueToken.IsConstant
37-
? new(get().OnSuccess(v => v.Value))
38-
: new(() => get().OnSuccess(v => v.Value));
37+
? new(get().OnSuccess(v => v.Value, error))
38+
: new(() => get().OnSuccess(v => v.Value, error));
3939
}
4040
}

Code/ArgumentSystem/Arguments/DurationArgument.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,17 @@ public class DurationArgument(string name) : Argument(name)
1515
[UsedImplicitly]
1616
public DynamicTryGet<TimeSpan> GetConvertSolution(BaseToken token)
1717
{
18+
Result rs = $"Value '{token.RawRep}' is not a duration.";
1819
if (token is not IValueToken valueToken || !valueToken.CanReturn<DurationValue>(out var get))
1920
{
20-
return $"Value '{token.RawRep}' is not a duration.";
21+
return rs;
2122
}
2223

2324
if (valueToken.IsConstant)
2425
{
25-
return get().OnSuccess(v => v.Value);
26+
return get().OnSuccess(v => v.Value, rs);
2627
}
2728

28-
return new(() => get().OnSuccess(v => v.Value));
29+
return new(() => get().OnSuccess(v => v.Value, rs));
2930
}
3031
}

Code/ArgumentSystem/Arguments/FloatArgument.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public DynamicTryGet<float> GetConvertSolution(BaseToken token)
5858
return VerifyRange(number.Value.Value);
5959
}
6060

61-
return new(() => token.TryGetLiteralValue<NumberValue>().OnSuccess(VerifyRange));
61+
return new(() => token.TryGetLiteralValue<NumberValue>().OnSuccess(VerifyRange, null));
6262
}
6363

6464
private TryGet<float> VerifyRange(NumberValue value)

Code/ArgumentSystem/Arguments/IntArgument.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public DynamicTryGet<int> GetConvertSolution(BaseToken token)
5656
{
5757
return VerifyRange(number.Value.Value);
5858
}
59-
return new(() => token.TryGetLiteralValue<NumberValue>().OnSuccess(VerifyRange));
59+
return new(() => token.TryGetLiteralValue<NumberValue>().OnSuccess(VerifyRange, null));
6060
}
6161

6262
private TryGet<int> VerifyRange(NumberValue value)

Code/ArgumentSystem/Arguments/IsValidReferenceArgument.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,6 @@ public DynamicTryGet<bool> GetConvertSolution(BaseToken token)
1919
return $"Value '{token.RawRep}' is not a reference.";
2020
}
2121

22-
return new(() => func().OnSuccess(v => v.IsValid));
22+
return new(() => func().OnSuccess(v => v.IsValid, null));
2323
}
2424
}

Code/ArgumentSystem/Arguments/PlayersArgument.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public DynamicTryGet<Player[]> GetConvertSolution(BaseToken token)
2727
return $"Value '{token.RawRep}' does not represent a valid player variable.";
2828
}
2929

30-
return new(() => get().OnSuccess(v => v.Players));
30+
return new(() => get().OnSuccess(v => v.Players, null));
3131
}
3232
}
3333

Code/ArgumentSystem/Arguments/ReferenceArgument.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public DynamicTryGet<TValue> GetConvertSolution(BaseToken token)
2020
return $"Value '{token.RawRep}' does not represent a valid reference.";
2121
}
2222

23-
return new(() => get().OnSuccess(TryParse));
23+
return new(() => get().OnSuccess(TryParse, null));
2424
}
2525

2626
public static TryGet<TValue> TryParse(ReferenceValue value)

Code/ArgumentSystem/Arguments/TextArgument.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ public DynamicTryGet<string> GetConvertSolution(BaseToken token)
2727

2828
if (valToken.IsConstant)
2929
{
30-
return get().OnSuccess(v => v.StringRep);
30+
return get().OnSuccess(v => v.StringRep, null);
3131
}
3232

33-
return new(() => get().OnSuccess(v => v.StringRep));
33+
return new(() => get().OnSuccess(v => v.StringRep, null));
3434
}
3535
}

Code/ContextSystem/BaseContexts/YieldingContext.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,15 @@
1-
namespace SER.Code.ContextSystem.BaseContexts;
1+
using SER.Code.Helpers;
2+
3+
namespace SER.Code.ContextSystem.BaseContexts;
24

35
public abstract class YieldingContext : Context
46
{
57
public IEnumerator<float> Run()
68
{
9+
var prof = Script.Profile is not null
10+
? new Profile(Script.Profile, $"running YieldingContext {Name}")
11+
: null;
12+
713
if (LineNum.HasValue)
814
{
915
Script.CurrentLine = LineNum.Value;
@@ -14,6 +20,8 @@ public IEnumerator<float> Run()
1420
{
1521
yield return enumerator.Current;
1622
}
23+
24+
prof?.Stop();
1725
}
1826

1927
protected abstract IEnumerator<float> Execute();

Code/ContextSystem/Contexts/Control/ElifStatementContext.cs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using SER.Code.ContextSystem.Structures;
44
using SER.Code.Helpers;
55
using SER.Code.Helpers.Exceptions;
6+
using SER.Code.Helpers.Extensions;
67
using SER.Code.Helpers.ResultSystem;
78
using SER.Code.TokenSystem.Tokens;
89

@@ -22,6 +23,8 @@ public class ElifStatementContext : StatementContext, IStatementExtender, IExten
2223

2324
private readonly List<BaseToken> _condition = [];
2425

26+
private NumericExpressionReslover.CompiledExpression _expression;
27+
2528
public override TryAddTokenRes TryAddToken(BaseToken token)
2629
{
2730
_condition.Add(token);
@@ -30,16 +33,29 @@ public override TryAddTokenRes TryAddToken(BaseToken token)
3033

3134
public override Result VerifyCurrentState()
3235
{
36+
if (NumericExpressionReslover.CompileExpression(_condition.ToArray())
37+
.HasErrored(out var error, out var cond))
38+
{
39+
return error;
40+
}
41+
42+
_expression = cond;
43+
3344
return Result.Assert(
3445
_condition.Count > 0,
3546
"An elif statement expects to have a condition, but none was provided!");
3647
}
3748

3849
protected override IEnumerator<float> Execute()
3950
{
40-
if (NumericExpressionReslover.EvalCondition(_condition.ToArray(), Script).HasErrored(out var error, out var result))
51+
if (_expression.Evaluate().HasErrored(out var error, out var objResult))
52+
{
53+
throw new ScriptRuntimeError(error);
54+
}
55+
56+
if (objResult is not bool result)
4157
{
42-
throw new ScriptRuntimeError($"'elif' statement condition error: {error}");
58+
throw new ScriptRuntimeError($"An elif statement condition must evaluate to a boolean value, but received {objResult.FriendlyTypeName()}");
4359
}
4460

4561
if (!result)

0 commit comments

Comments
 (0)