Skip to content

Commit 59e029b

Browse files
authored
Update function argument parsing for strings (#758)
1 parent 166eada commit 59e029b

File tree

3 files changed

+63
-10
lines changed

3 files changed

+63
-10
lines changed

src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs

+7-5
Original file line numberDiff line numberDiff line change
@@ -914,6 +914,13 @@ private AnyOf<Expression, Type> ParseStringLiteral(bool forceParseAsString)
914914
}
915915
}
916916

917+
// While the next token is also a string, keep concatenating these strings and get next token
918+
while (_textParser.CurrentToken.Id == TokenId.StringLiteral)
919+
{
920+
stringValue += _textParser.CurrentToken.Text;
921+
_textParser.NextToken();
922+
}
923+
917924
return ConstantExpressionHelper.CreateLiteral(stringValue, stringValue);
918925
}
919926

@@ -2188,11 +2195,6 @@ private Expression[] ParseArguments()
21882195
_textParser.NextToken();
21892196
}
21902197

2191-
//if (argList.OfType<ParameterExpression>().Count() > 1)
2192-
//{
2193-
// throw ParseError(_textParser.CurrentToken.Pos, Res.OutVariableSingleRequired);
2194-
//}
2195-
21962198
return argList.ToArray();
21972199
}
21982200

test/System.Linq.Dynamic.Core.Tests/DynamicExpressionParserTests.cs

+54-5
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,11 @@ public static class StaticHelper
262262
{
263263
return Guid.NewGuid();
264264
}
265+
266+
public static string Filter(string filter)
267+
{
268+
return filter;
269+
}
265270
}
266271

267272
public class TestCustomTypeProvider : AbstractDynamicLinqCustomTypeProvider, IDynamicLinkCustomTypeProvider
@@ -1379,14 +1384,58 @@ public void DynamicExpressionParser_ParseLambda_Operator_Less_Greater_With_Guids
13791384

13801385
// Act
13811386
var lambda = DynamicExpressionParser.ParseLambda(config, typeof(User), null, expressionText, user);
1382-
var guidLambda = lambda as Expression<Func<User, Guid>>;
1383-
Assert.NotNull(guidLambda);
1387+
var guidLambda = (Expression<Func<User, Guid>>)lambda;
13841388

1385-
var del = lambda.Compile();
1386-
var result = (Guid)del.DynamicInvoke(user);
1389+
var del = guidLambda.Compile();
1390+
var result = (Guid?)del.DynamicInvoke(user);
13871391

13881392
// Assert
1389-
Assert.Equal(anotherId, result);
1393+
result.Should().Be(anotherId);
1394+
}
1395+
1396+
[Fact]
1397+
public void DynamicExpressionParser_ParseLambda_CustomType_Method_With_ExpressionString()
1398+
{
1399+
// Arrange
1400+
var config = new ParsingConfig
1401+
{
1402+
CustomTypeProvider = new TestCustomTypeProvider()
1403+
};
1404+
1405+
var user = new User();
1406+
1407+
// Act : char
1408+
var expressionTextChar = "StaticHelper.Filter(\"C == 'x'\")";
1409+
var lambdaChar = DynamicExpressionParser.ParseLambda(config, typeof(User), null, expressionTextChar, user);
1410+
var funcChar = (Expression<Func<User, string>>)lambdaChar;
1411+
1412+
var delegateChar = funcChar.Compile();
1413+
var resultChar = (string?)delegateChar.DynamicInvoke(user);
1414+
1415+
// Assert : int
1416+
resultChar.Should().Be("C == 'x'");
1417+
1418+
// Act : int
1419+
var expressionTextIncome = "StaticHelper.Filter(\"Income == 5\")";
1420+
var lambdaIncome = DynamicExpressionParser.ParseLambda(config, typeof(User), null, expressionTextIncome, user);
1421+
var funcIncome = (Expression<Func<User, string>>)lambdaIncome;
1422+
1423+
var delegateIncome = funcIncome.Compile();
1424+
var resultIncome = (string?)delegateIncome.DynamicInvoke(user);
1425+
1426+
// Assert : int
1427+
resultIncome.Should().Be("Income == 5");
1428+
1429+
// Act : string
1430+
var expressionTextUserName = "StaticHelper.Filter(\"UserName == \"\"x\"\"\")";
1431+
var lambdaUserName = DynamicExpressionParser.ParseLambda(config, typeof(User), null, expressionTextUserName, user);
1432+
var funcUserName = (Expression<Func<User, string>>)lambdaUserName;
1433+
1434+
var delegateUserName = funcUserName.Compile();
1435+
var resultUserName = (string?)delegateUserName.DynamicInvoke(user);
1436+
1437+
// Assert : string
1438+
resultUserName.Should().Be(@"UserName == ""x""""""");
13901439
}
13911440

13921441
[Theory]

test/System.Linq.Dynamic.Core.Tests/Helpers/Models/User.cs

+2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ public class User
1818

1919
public int Income { get; set; }
2020

21+
public char C { get; set; }
22+
2123
public UserProfile Profile { get; set; }
2224

2325
public UserState State { get; set; }

0 commit comments

Comments
 (0)