Skip to content

Commit b42533b

Browse files
authored
Merge pull request #108 from nblumhardt/dev
Make the `rest()` function aware of `@p.X` and `@p['X']` (breaking change)
2 parents 7619bd6 + 9e1343c commit b42533b

File tree

3 files changed

+28
-9
lines changed

3 files changed

+28
-9
lines changed

src/Serilog.Expressions/Serilog.Expressions.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
<PropertyGroup>
44
<Description>An embeddable mini-language for filtering, enriching, and formatting Serilog
55
events, ideal for use with JSON or XML configuration.</Description>
6-
<VersionPrefix>4.0.1</VersionPrefix>
6+
<VersionPrefix>5.0.0</VersionPrefix>
77
<Authors>Serilog Contributors</Authors>
88
<TargetFrameworks>netstandard2.1;netstandard2.0;net5.0;net6.0;net7.0</TargetFrameworks>
99
<GenerateDocumentationFile>true</GenerateDocumentationFile>

src/Serilog.Expressions/Templates/Compilation/UnreferencedProperties/ExpressionReferencedPropertiesFinder.cs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
using Serilog.Expressions;
1516
using Serilog.Expressions.Ast;
17+
using Serilog.Expressions.Compilation;
1618
using Serilog.Expressions.Compilation.Transformations;
1719

1820
namespace Serilog.Templates.Compilation.UnreferencedProperties;
@@ -47,7 +49,11 @@ protected override IEnumerable<string> Transform(LocalNameExpression nlx)
4749

4850
protected override IEnumerable<string> Transform(AccessorExpression spx)
4951
{
50-
return Transform(spx.Receiver);
52+
if (Pattern.IsAmbientProperty(spx.Receiver, BuiltInProperty.Properties, true))
53+
yield return spx.MemberName;
54+
55+
foreach (var nested in Transform(spx.Receiver))
56+
yield return nested;
5157
}
5258

5359
protected override IEnumerable<string> Transform(LambdaExpression lmx)
@@ -79,7 +85,18 @@ protected override IEnumerable<string> Transform(ObjectExpression ox)
7985

8086
protected override IEnumerable<string> Transform(IndexerExpression ix)
8187
{
82-
return Transform(ix.Index).Concat(Transform(ix.Receiver));
88+
if (Pattern.IsAmbientProperty(ix.Receiver, BuiltInProperty.Properties, true) &&
89+
Pattern.IsStringConstant(ix.Index, out var name))
90+
{
91+
yield return name;
92+
}
93+
else
94+
{
95+
foreach (var nested in Transform(ix.Index).Concat(Transform(ix.Receiver)))
96+
{
97+
yield return nested;
98+
}
99+
}
83100
}
84101

85102
protected override IEnumerable<string> Transform(IndexOfMatchExpression mx)

test/Serilog.Expressions.Tests/Templates/UnreferencedPropertiesFunctionTests.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,32 +19,34 @@ public void UnreferencedPropertiesFunctionIsNamedRest()
1919
[Fact]
2020
public void UnreferencedPropertiesExcludeThoseInMessageAndTemplate()
2121
{
22-
Assert.True(new TemplateParser().TryParse("{@m}{A + 1}{#if true}{B}{#end}", out var template, out _));
22+
Assert.True(new TemplateParser().TryParse("{@m}{A + 1}{#if true}{B}{@p.C}{@p['D']}{#end}", out var template, out _));
2323

24-
var function = new UnreferencedPropertiesFunction(template!);
24+
var function = new UnreferencedPropertiesFunction(template);
2525

2626
var evt = new LogEvent(
2727
DateTimeOffset.Now,
2828
LogEventLevel.Debug,
2929
null,
30-
new(new[] {new PropertyToken("C", "{C}")}),
30+
new(new[] {new PropertyToken("E", "{E}")}),
3131
new[]
3232
{
3333
new LogEventProperty("A", new ScalarValue(null)),
3434
new LogEventProperty("B", new ScalarValue(null)),
3535
new LogEventProperty("C", new ScalarValue(null)),
3636
new LogEventProperty("D", new ScalarValue(null)),
37+
new LogEventProperty("E", new ScalarValue(null)),
38+
new LogEventProperty("F", new ScalarValue(null)),
3739
});
3840

3941
var deep = UnreferencedPropertiesFunction.Implementation(function, evt, new ScalarValue(true));
4042

4143
var sv = Assert.IsType<StructureValue>(deep);
4244
var included = Assert.Single(sv.Properties);
43-
Assert.Equal("D", included!.Name);
45+
Assert.Equal("F", included.Name);
4446

4547
var shallow = UnreferencedPropertiesFunction.Implementation(function, evt);
4648
sv = Assert.IsType<StructureValue>(shallow);
47-
Assert.Contains(sv.Properties, p => p.Name == "C");
48-
Assert.Contains(sv.Properties, p => p.Name == "D");
49+
Assert.Contains(sv.Properties, p => p.Name == "E");
50+
Assert.Contains(sv.Properties, p => p.Name == "F");
4951
}
5052
}

0 commit comments

Comments
 (0)