-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathFinalTransition.cs
More file actions
41 lines (33 loc) · 1.15 KB
/
FinalTransition.cs
File metadata and controls
41 lines (33 loc) · 1.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System.Linq.Expressions;
using static System.Linq.Expressions.Expression;
namespace Hyperbee.Expressions.CompilerServices.Transitions;
internal class FinalTransition : Transition
{
internal override StateNode FallThroughNode => null;
internal override void Optimize( HashSet<LabelTarget> references )
{
// nop
}
public override void AddExpressions( List<Expression> expressions, StateMachineContext context )
{
var (variable, value) = context.StateNode.Result;
if ( variable == null )
{
return;
}
if ( expressions.Count <= 1 || expressions[^1].Type == typeof( void ) )
{
value ??= Constant( null, typeof( IVoidResult ) );
expressions.Add( Assign( variable, EnsureConvert( value, variable.Type ) ) );
return;
}
if ( expressions.Count > 1 )
{
var lastExpression = expressions[^1];
if ( variable.Type.IsAssignableFrom( lastExpression.Type ) )
{
expressions[^1] = Assign( variable, EnsureConvert( lastExpression, variable.Type ) );
}
}
}
}