Skip to content

Commit 8de3883

Browse files
add method running to return statement
1 parent c4eed50 commit 8de3883

File tree

1 file changed

+35
-9
lines changed

1 file changed

+35
-9
lines changed

Code/ContextSystem/Contexts/Control/ReturnContext.cs

Lines changed: 35 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,21 @@
1-
using SER.Code.ContextSystem.BaseContexts;
1+
using JetBrains.Annotations;
2+
using SER.Code.ContextSystem.BaseContexts;
23
using SER.Code.ContextSystem.Interfaces;
34
using SER.Code.ContextSystem.Structures;
45
using SER.Code.Helpers.Exceptions;
56
using SER.Code.Helpers.ResultSystem;
7+
using SER.Code.TokenSystem.Structures;
68
using SER.Code.TokenSystem.Tokens;
79
using SER.Code.TokenSystem.Tokens.Interfaces;
10+
using SER.Code.ValueSystem;
811

912
namespace SER.Code.ContextSystem.Contexts.Control;
1013

14+
[UsedImplicitly]
1115
public class ReturnContext : StandardContext, IKeywordContext
1216
{
1317
private IValueToken? _returnValueToken;
18+
private (Context main, IMayReturnValueContext returner)? _returnContext = null;
1419

1520
public string KeywordName => "return";
1621
public string Description => "Returns value when in a function.";
@@ -20,28 +25,49 @@ public class ReturnContext : StandardContext, IKeywordContext
2025

2126
public override TryAddTokenRes TryAddToken(BaseToken token)
2227
{
23-
if (token is not IValueToken valToken)
28+
if (_returnContext.HasValue)
2429
{
25-
return TryAddTokenRes.Error(
26-
$"Expected to receive a value, but received '{token.RawRep}' instead."
27-
);
30+
return _returnContext.Value.main.TryAddToken(token);
2831
}
2932

30-
_returnValueToken = valToken;
31-
return TryAddTokenRes.End();
33+
switch (token)
34+
{
35+
case IContextableToken contextable when
36+
contextable.GetContext(Script) is { } mainContext and IMayReturnValueContext returnValueContext:
37+
{
38+
_returnContext = (mainContext, returnValueContext);
39+
return TryAddTokenRes.Continue();
40+
}
41+
case IValueToken valToken:
42+
{
43+
_returnValueToken = valToken;
44+
return TryAddTokenRes.End();
45+
}
46+
default:
47+
return TryAddTokenRes.Error($"Expected to receive a value or method, but received '{token.RawRep}' instead.");
48+
}
3249
}
3350

3451
public override Result VerifyCurrentState()
3552
{
3653
return Result.Assert(
37-
_returnValueToken != null,
54+
_returnValueToken != null || _returnContext.HasValue,
3855
"Return value was not provided."
3956
);
4057
}
4158

4259
protected override void Execute()
4360
{
44-
if (_returnValueToken!.Value().HasErrored(out var error, out var value))
61+
Value value;
62+
if (_returnContext.HasValue)
63+
{
64+
value = _returnContext.Value.returner.ReturnedValue
65+
?? throw new ScriptRuntimeError(this,
66+
$"{_returnContext.Value.main} has not returned a value. " +
67+
$"{_returnContext.Value.returner.MissingValueHint}"
68+
);
69+
}
70+
else if (_returnValueToken!.Value().HasErrored(out var error, out value!))
4571
{
4672
throw new ScriptRuntimeError(this, error);
4773
}

0 commit comments

Comments
 (0)