@@ -4,28 +4,33 @@ namespace Fluid.Ast
4
4
{
5
5
public sealed class MemberExpression : Expression
6
6
{
7
- public MemberExpression ( MemberSegment segment )
7
+ private readonly MemberSegment [ ] _segments ;
8
+
9
+ public MemberExpression ( MemberSegment segment ) : this ( [ segment ] )
10
+ {
11
+ }
12
+
13
+ public MemberExpression ( IReadOnlyList < MemberSegment > segments ) : this ( segments as MemberSegment [ ] ?? segments . ToArray ( ) )
8
14
{
9
- Segments = [ segment ] ;
10
15
}
11
16
12
- public MemberExpression ( IReadOnlyList < MemberSegment > segments )
17
+ internal MemberExpression ( MemberSegment [ ] segments )
13
18
{
14
- Segments = segments ?? [ ] ;
19
+ _segments = segments ?? [ ] ;
15
20
16
- if ( Segments . Count == 0 )
21
+ if ( _segments . Length == 0 )
17
22
{
18
- throw new ArgumentException ( "At least one segment is required in a MemberExpression" ) ;
23
+ ExceptionHelper . ThrowArgumentNullException ( nameof ( segments ) , "At least one segment is required in a MemberExpression" ) ;
19
24
}
20
25
}
21
26
22
- public IReadOnlyList < MemberSegment > Segments { get ; }
27
+ public IReadOnlyList < MemberSegment > Segments => _segments ;
23
28
24
29
public override ValueTask < FluidValue > EvaluateAsync ( TemplateContext context )
25
30
{
26
31
// The first segment can only be an IdentifierSegment
27
32
28
- var initial = Segments [ 0 ] as IdentifierSegment ;
33
+ var initial = _segments [ 0 ] as IdentifierSegment ;
29
34
30
35
// Search the initial segment in the local scope first
31
36
@@ -46,14 +51,14 @@ public override ValueTask<FluidValue> EvaluateAsync(TemplateContext context)
46
51
value = context . Model ;
47
52
}
48
53
49
- for ( var i = start ; i < Segments . Count ; i ++ )
54
+ for ( var i = start ; i < _segments . Length ; i ++ )
50
55
{
51
- var s = Segments [ i ] ;
56
+ var s = _segments [ i ] ;
52
57
var task = s . ResolveAsync ( value , context ) ;
53
58
54
59
if ( ! task . IsCompletedSuccessfully )
55
60
{
56
- return Awaited ( task , context , Segments , i + 1 ) ;
61
+ return Awaited ( task , context , _segments , i + 1 ) ;
57
62
}
58
63
59
64
value = task . Result ;
@@ -71,11 +76,11 @@ public override ValueTask<FluidValue> EvaluateAsync(TemplateContext context)
71
76
private static async ValueTask < FluidValue > Awaited (
72
77
ValueTask < FluidValue > task ,
73
78
TemplateContext context ,
74
- IReadOnlyList < MemberSegment > segments ,
79
+ MemberSegment [ ] segments ,
75
80
int startIndex )
76
81
{
77
82
var value = await task ;
78
- for ( var i = startIndex ; i < segments . Count ; i ++ )
83
+ for ( var i = startIndex ; i < segments . Length ; i ++ )
79
84
{
80
85
var s = segments [ i ] ;
81
86
value = await s . ResolveAsync ( value , context ) ;
0 commit comments