1- using SER . Code . ContextSystem . BaseContexts ;
1+ using JetBrains . Annotations ;
2+ using SER . Code . ContextSystem . BaseContexts ;
23using SER . Code . ContextSystem . Interfaces ;
34using SER . Code . ContextSystem . Structures ;
45using SER . Code . Helpers . Exceptions ;
56using SER . Code . Helpers . ResultSystem ;
7+ using SER . Code . TokenSystem . Structures ;
68using SER . Code . TokenSystem . Tokens ;
79using SER . Code . TokenSystem . Tokens . Interfaces ;
10+ using SER . Code . ValueSystem ;
811
912namespace SER . Code . ContextSystem . Contexts . Control ;
1013
14+ [ UsedImplicitly ]
1115public 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