@@ -4,14 +4,16 @@ namespace Hyperbee.Expressions;
4
4
5
5
public class UsingExpression : Expression
6
6
{
7
+ public ParameterExpression DisposeVariable { get ; }
7
8
public Expression Disposable { get ; }
8
9
public Expression Body { get ; }
9
10
10
- internal UsingExpression ( Expression disposable , Expression body )
11
+ internal UsingExpression ( ParameterExpression variable , Expression disposable , Expression body )
11
12
{
12
13
if ( ! typeof ( IDisposable ) . IsAssignableFrom ( disposable . Type ) )
13
14
throw new ArgumentException ( $ "The disposable expression must return an { nameof ( IDisposable ) } .", nameof ( disposable ) ) ;
14
15
16
+ DisposeVariable = variable ;
15
17
Disposable = disposable ;
16
18
Body = body ;
17
19
}
@@ -23,38 +25,44 @@ internal UsingExpression( Expression disposable, Expression body )
23
25
24
26
public override Expression Reduce ( )
25
27
{
26
- var disposableVar = Variable ( Disposable . Type , "disposable" ) ;
27
- var disposableAssignment = Assign ( disposableVar , Disposable ) ;
28
+ var disposableAssignment = Assign ( DisposeVariable , Disposable ) ;
28
29
29
30
var finallyBlock = IfThen (
30
- NotEqual ( disposableVar , Constant ( null ) ) ,
31
- Call ( disposableVar , nameof ( IDisposable . Dispose ) , Type . EmptyTypes )
31
+ NotEqual ( DisposeVariable , Constant ( null ) ) ,
32
+ Call ( DisposeVariable , nameof ( IDisposable . Dispose ) , Type . EmptyTypes )
32
33
) ;
33
34
34
35
return Block (
35
- [ disposableVar ] ,
36
+ [ DisposeVariable ] ,
36
37
disposableAssignment ,
37
38
TryFinally ( Body , finallyBlock )
38
39
) ;
39
40
}
40
41
41
42
protected override Expression VisitChildren ( ExpressionVisitor visitor )
42
43
{
44
+ var newDisposeVariable = visitor . VisitAndConvert ( DisposeVariable , nameof ( VisitChildren ) ) ;
43
45
var newDisposable = visitor . Visit ( Disposable ) ;
44
46
var newBody = visitor . Visit ( Body ) ;
45
47
46
- if ( newDisposable == Disposable && newBody == Body )
48
+ if ( newDisposeVariable == DisposeVariable && newDisposable == Disposable && newBody == Body )
47
49
return this ;
48
50
49
- return new UsingExpression ( newDisposable , newBody ) ;
51
+ return new UsingExpression ( newDisposeVariable , newDisposable , newBody ) ;
50
52
51
53
}
52
54
}
53
55
54
56
public static partial class ExpressionExtensions
55
57
{
58
+ public static UsingExpression Using ( ParameterExpression variable , Expression disposable , Expression body )
59
+ {
60
+ return new UsingExpression ( variable , disposable , body ) ;
61
+ }
62
+
56
63
public static UsingExpression Using ( Expression disposable , Expression body )
57
64
{
58
- return new UsingExpression ( disposable , body ) ;
65
+ var disposableVar = Expression . Variable ( disposable . Type , "disposable" ) ;
66
+ return new UsingExpression ( disposableVar , disposable , body ) ;
59
67
}
60
68
}
0 commit comments