diff --git a/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs b/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs index 775b5b3e..0cca1657 100644 --- a/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs +++ b/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs @@ -340,6 +340,9 @@ Expression ParseIn() throw ParseError(op.Pos, Res.CloseParenOrCommaExpected); } } + + // Since this started with an open paren, make sure to move off the close + _textParser.NextToken(); } else if (_textParser.CurrentToken.Id == TokenId.Identifier) // a single argument { @@ -368,8 +371,6 @@ Expression ParseIn() { throw ParseError(op.Pos, Res.OpenParenOrIdentifierExpected); } - - _textParser.NextToken(); } return accumulate; diff --git a/test/System.Linq.Dynamic.Core.Tests/Parser/ExpressionParserTests.cs b/test/System.Linq.Dynamic.Core.Tests/Parser/ExpressionParserTests.cs index 3148988c..3015401a 100644 --- a/test/System.Linq.Dynamic.Core.Tests/Parser/ExpressionParserTests.cs +++ b/test/System.Linq.Dynamic.Core.Tests/Parser/ExpressionParserTests.cs @@ -139,6 +139,20 @@ public void Parse_ParseMultipleInOperators() Check.That(parsedExpression).Equals("(((x.MainCompanyId == 1) OrElse (x.MainCompanyId == 2)) AndAlso ((x.Name == \"A\") OrElse (x.Name == \"B\")))"); } + [Fact] + public void Parse_ParseInWrappedInParenthesis() + { + // Arrange + ParameterExpression[] parameters = { ParameterExpressionHelper.CreateParameterExpression(typeof(Company), "x") }; + var sut = new ExpressionParser(parameters, "(MainCompanyId in @0)", new object[] { new long?[] { 1, 2 } }, null); + + // Act + var parsedExpression = sut.Parse(null).ToString(); + + // Assert + Check.That(parsedExpression).Equals("value(System.Nullable`1[System.Int64][]).Contains(x.MainCompanyId)"); + } + [Theory] [InlineData("string(\"\")", "")] [InlineData("string(\"a\")", "a")]