Skip to content

Commit 420d1c9

Browse files
Release v1.1.2 (#48)
- Update to use variable list for `ForExpression` * Allow `UsingExpression` to pass a variable * update nugets --------- Co-authored-by: bfarmer67 <bfarmer67@users.noreply.github.com> Co-authored-by: Brenton Farmer <brent.farmer@wagglebee.net> Co-authored-by: MattEdwardsWaggleBee <MattEdwardsWaggleBee@users.noreply.github.com>
1 parent dc2dbe8 commit 420d1c9

File tree

7 files changed

+30
-22
lines changed

7 files changed

+30
-22
lines changed

Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<PropertyGroup>
44
<MajorVersion>1</MajorVersion>
55
<MinorVersion>1</MinorVersion>
6-
<PatchVersion>1</PatchVersion>
6+
<PatchVersion>2</PatchVersion>
77
</PropertyGroup>
88
<!-- Disable automatic package publishing -->
99
<PropertyGroup>

src/Hyperbee.Expressions/ForExpression.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using System.Collections.ObjectModel;
2-
using System.Linq.Expressions;
1+
using System.Linq.Expressions;
32

43
namespace Hyperbee.Expressions;
54

src/Hyperbee.Expressions/StringFormatExpression.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-

2-
using System.Linq.Expressions;
1+
using System.Linq.Expressions;
32
using System.Reflection;
43

54
namespace Hyperbee.Expressions;

src/Hyperbee.Expressions/UsingExpression.cs

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,16 @@ namespace Hyperbee.Expressions;
44

55
public class UsingExpression : Expression
66
{
7+
public ParameterExpression DisposeVariable { get; }
78
public Expression Disposable { get; }
89
public Expression Body { get; }
910

10-
internal UsingExpression( Expression disposable, Expression body )
11+
internal UsingExpression( ParameterExpression variable, Expression disposable, Expression body )
1112
{
1213
if ( !typeof( IDisposable ).IsAssignableFrom( disposable.Type ) )
1314
throw new ArgumentException( $"The disposable expression must return an {nameof( IDisposable )}.", nameof( disposable ) );
1415

16+
DisposeVariable = variable;
1517
Disposable = disposable;
1618
Body = body;
1719
}
@@ -23,38 +25,44 @@ internal UsingExpression( Expression disposable, Expression body )
2325

2426
public override Expression Reduce()
2527
{
26-
var disposableVar = Variable( Disposable.Type, "disposable" );
27-
var disposableAssignment = Assign( disposableVar, Disposable );
28+
var disposableAssignment = Assign( DisposeVariable, Disposable );
2829

2930
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 )
3233
);
3334

3435
return Block(
35-
[disposableVar],
36+
[DisposeVariable],
3637
disposableAssignment,
3738
TryFinally( Body, finallyBlock )
3839
);
3940
}
4041

4142
protected override Expression VisitChildren( ExpressionVisitor visitor )
4243
{
44+
var newDisposeVariable = visitor.VisitAndConvert( DisposeVariable, nameof( VisitChildren ) );
4345
var newDisposable = visitor.Visit( Disposable );
4446
var newBody = visitor.Visit( Body );
4547

46-
if ( newDisposable == Disposable && newBody == Body )
48+
if ( newDisposeVariable == DisposeVariable && newDisposable == Disposable && newBody == Body )
4749
return this;
4850

49-
return new UsingExpression( newDisposable, newBody );
51+
return new UsingExpression( newDisposeVariable, newDisposable, newBody );
5052

5153
}
5254
}
5355

5456
public static partial class ExpressionExtensions
5557
{
58+
public static UsingExpression Using( ParameterExpression variable, Expression disposable, Expression body )
59+
{
60+
return new UsingExpression( variable, disposable, body );
61+
}
62+
5663
public static UsingExpression Using( Expression disposable, Expression body )
5764
{
58-
return new UsingExpression( disposable, body );
65+
var disposableVar = Expression.Variable( disposable.Type, "disposable" );
66+
return new UsingExpression( disposableVar, disposable, body );
5967
}
6068
}

test/Hyperbee.Expressions.Benchmark/Hyperbee.Expressions.Benchmark.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
<ItemGroup>
1212
<PackageReference Include="BenchmarkDotNet" Version="0.14.0" />
13-
<PackageReference Include="DotNext.Metaprogramming" Version="5.17.2" />
13+
<PackageReference Include="DotNext.Metaprogramming" Version="5.18.0" />
1414
<PackageReference Include="FastExpressionCompiler" Version="5.0.1" />
1515
</ItemGroup>
1616

test/Hyperbee.Expressions.Tests/Hyperbee.Expressions.Tests.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,14 @@
1313
</PropertyGroup>
1414

1515
<ItemGroup>
16-
<PackageReference Include="coverlet.collector" Version="6.0.3">
16+
<PackageReference Include="coverlet.collector" Version="6.0.4">
1717
<PrivateAssets>all</PrivateAssets>
1818
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
1919
</PackageReference>
2020
<PackageReference Include="FastExpressionCompiler" Version="5.0.1" />
2121
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.12.0" />
22-
<PackageReference Include="MSTest.TestAdapter" Version="3.7.0" />
23-
<PackageReference Include="MSTest.TestFramework" Version="3.7.0" />
22+
<PackageReference Include="MSTest.TestAdapter" Version="3.7.3" />
23+
<PackageReference Include="MSTest.TestFramework" Version="3.7.3" />
2424
</ItemGroup>
2525

2626
<ItemGroup>

test/Hyperbee.Expressions.Tests/UsingExpressionTests.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,19 +35,21 @@ public void UsingExpression_ShouldDisposeResource_AfterUse()
3535
{
3636
// Arrange
3737
var resource = new TestDisposableResource();
38+
var disposableVariable = Variable( typeof( TestDisposableResource ) );
3839
var disposableExpression = Constant( resource, typeof( TestDisposableResource ) );
3940

40-
var bodyExpression = Empty(); // Actual body is unimportant
41+
var bodyExpression = Condition( Property( disposableVariable, nameof( TestDisposableResource.IsDisposed ) ), Constant( true ), Constant( false ) );
4142

4243
// Act
43-
var usingExpression = Using( disposableExpression, bodyExpression );
44+
var usingExpression = Using( disposableVariable, disposableExpression, bodyExpression );
4445

45-
var lambda = Lambda<Action>( usingExpression );
46+
var lambda = Lambda<Func<bool>>( usingExpression );
4647
var compiledLambda = lambda.Compile();
4748

48-
compiledLambda();
49+
var result = compiledLambda();
4950

5051
// Assert
52+
Assert.IsFalse( result );
5153
Assert.IsTrue( resource.IsDisposed, "Resource should be disposed after using the expression." );
5254
}
5355

0 commit comments

Comments
 (0)