Skip to content

Commit b5d40c6

Browse files
committed
Identifier-member syntax
1 parent 3066d91 commit b5d40c6

File tree

2 files changed

+24
-19
lines changed

2 files changed

+24
-19
lines changed

src/Serilog.Expressions/Expressions/Parsing/ExpressionTokenParsers.cs

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -55,17 +55,6 @@ public static TokenListParserResult<ExpressionToken, Expression> TryPartialParse
5555
.IgnoreThen(Token.EqualTo(ExpressionToken.In))
5656
.Value(Operators.RuntimeOpNotIn);
5757

58-
static readonly TokenListParser<ExpressionToken, string> IsNull =
59-
Token.EqualTo(ExpressionToken.Is)
60-
.IgnoreThen(Token.EqualTo(ExpressionToken.Null))
61-
.Value(Operators.RuntimeOpIsNull);
62-
63-
static readonly TokenListParser<ExpressionToken, string> IsNotNull =
64-
Token.EqualTo(ExpressionToken.Is)
65-
.IgnoreThen(Token.EqualTo(ExpressionToken.Not))
66-
.IgnoreThen(Token.EqualTo(ExpressionToken.Null))
67-
.Value(Operators.RuntimeOpIsNotNull);
68-
6958
static readonly TokenListParser<ExpressionToken, Func<Expression, Expression>> PropertyPathStep =
7059
Token.EqualTo(ExpressionToken.Period)
7160
.IgnoreThen(Token.EqualTo(ExpressionToken.Identifier))
@@ -86,22 +75,35 @@ from close in Token.EqualTo(ExpressionToken.RBracket)
8675
from lparen in Token.EqualTo(ExpressionToken.LParen)
8776
from expr in Parse.Ref(() => Expr).ManyDelimitedBy(Token.EqualTo(ExpressionToken.Comma))
8877
from rparen in Token.EqualTo(ExpressionToken.RParen)
89-
from ci in Token.EqualTo(ExpressionToken.CI).Value(true).OptionalOrDefault(false)
78+
from ci in Token.EqualTo(ExpressionToken.CI).Value(true).OptionalOrDefault()
9079
select (Expression)new CallExpression(ci, name.ToStringValue(), expr)).Named("function");
9180

9281
static readonly TokenListParser<ExpressionToken, Expression> ArrayLiteral =
9382
(from lbracket in Token.EqualTo(ExpressionToken.LBracket)
9483
from expr in Parse.Ref(() => Expr).ManyDelimitedBy(Token.EqualTo(ExpressionToken.Comma))
9584
from rbracket in Token.EqualTo(ExpressionToken.RBracket)
9685
select (Expression)new ArrayExpression(expr)).Named("array");
97-
86+
87+
static readonly TokenListParser<ExpressionToken, KeyValuePair<string, Expression>> IdentifierMember =
88+
from key in Token.EqualTo(ExpressionToken.Identifier).Or(Token.EqualTo(ExpressionToken.BuiltInIdentifier))
89+
from value in Token.EqualTo(ExpressionToken.Colon)
90+
.IgnoreThen(Parse.Ref(() => Expr))
91+
.Cast<ExpressionToken, Expression, Expression?>()
92+
.OptionalOrDefault()
93+
select KeyValuePair.Create<string, Expression>(
94+
key.ToStringValue(),
95+
value ?? (key.Kind == ExpressionToken.BuiltInIdentifier ?
96+
new AmbientPropertyExpression(key.ToStringValue().Substring(1), true) :
97+
new AmbientPropertyExpression(key.ToStringValue(), false)));
98+
99+
static readonly TokenListParser<ExpressionToken, KeyValuePair<string, Expression>> StringMember =
100+
from key in Token.EqualTo(ExpressionToken.String).Apply(ExpressionTextParsers.String)
101+
from colon in Token.EqualTo(ExpressionToken.Colon)
102+
from value in Parse.Ref(() => Expr)
103+
select KeyValuePair.Create(key, value);
104+
98105
static readonly TokenListParser<ExpressionToken, KeyValuePair<string, Expression>> ObjectMember =
99-
(from key in Token.EqualTo(ExpressionToken.Identifier)
100-
.Select(t => t.ToStringValue())
101-
.Or(Token.EqualTo(ExpressionToken.String).Apply(ExpressionTextParsers.String))
102-
from colon in Token.EqualTo(ExpressionToken.Colon)
103-
from value in Parse.Ref(() => Expr)
104-
select KeyValuePair.Create(key, value)).Named("object member");
106+
IdentifierMember.Or(StringMember).Named("object member");
105107

106108
static readonly TokenListParser<ExpressionToken, Expression> ObjectLiteral =
107109
(from lbrace in Token.EqualTo(ExpressionToken.LBrace)

test/Serilog.Expressions.Tests/Cases/expression-evaluation-cases.asv

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ false ⇶ false
88
[5, 6] ⇶ [5, 6]
99
{} ⇶ {}
1010
{a: 1, 'b c': 2} ⇶ {a: 1, 'b c': 2}
11+
{User} ⇶ {User: {Id: 42, Name: 'nblumhardt'}}
12+
{@l} ⇶ {'@l': @l}
1113

1214
// Collections
1315
[5, undefined()] ⇶ undefined()
@@ -173,6 +175,7 @@ null in [1, null, 3] ⇶ true
173175
null is null ⇶ true
174176
null is not null ⇶ false
175177
undefined() is null ⇶ true
178+
10 is null ⇶ false
176179

177180
// Property names and accessors
178181
[5, 6, 7][1] ⇶ 6

0 commit comments

Comments
 (0)