From 8105359ee6acd71d588b15148363efeadd9b56dd Mon Sep 17 00:00:00 2001 From: Abbas Cyclewala Date: Wed, 2 Aug 2023 13:50:23 +0000 Subject: [PATCH 1/3] added symbol check --- src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs b/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs index dca30c44..a37321fc 100644 --- a/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs +++ b/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs @@ -932,7 +932,12 @@ private Expression ParseIdentifier() var isValidKeyWord = _keywordsHelper.TryGetValue(_textParser.CurrentToken.Text, out var value); var extraCondition = !_parsingConfig.PrioritizePropertyOrFieldOverTheType || - (_parsingConfig.PrioritizePropertyOrFieldOverTheType && !(value is Type && _it != null && FindPropertyOrField(_it.Type, _textParser.CurrentToken.Text, false) != null)); + (_parsingConfig.PrioritizePropertyOrFieldOverTheType + && !(value is Type + && (_it != null && FindPropertyOrField(_it.Type, _textParser.CurrentToken.Text, false) != null) + || _symbols.ContainsKey(_textParser.CurrentToken.Text)) + + ); if (isValidKeyWord && extraCondition) { From e388aee9aab347d9e54b379ae1ebb1b3d380f2f3 Mon Sep 17 00:00:00 2001 From: Abbas Cyclewala Date: Wed, 2 Aug 2023 19:53:59 +0530 Subject: [PATCH 2/3] added test case for preference --- src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs | 6 ++++-- .../Parser/ExpressionParserTests.cs | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs b/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs index a37321fc..1fcb555d 100644 --- a/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs +++ b/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs @@ -934,8 +934,10 @@ private Expression ParseIdentifier() var extraCondition = !_parsingConfig.PrioritizePropertyOrFieldOverTheType || (_parsingConfig.PrioritizePropertyOrFieldOverTheType && !(value is Type - && (_it != null && FindPropertyOrField(_it.Type, _textParser.CurrentToken.Text, false) != null) - || _symbols.ContainsKey(_textParser.CurrentToken.Text)) + && ((_it != null && FindPropertyOrField(_it.Type, _textParser.CurrentToken.Text, false) != null) + || _symbols.ContainsKey(_textParser.CurrentToken.Text) + + )) ); diff --git a/test/System.Linq.Dynamic.Core.Tests/Parser/ExpressionParserTests.cs b/test/System.Linq.Dynamic.Core.Tests/Parser/ExpressionParserTests.cs index 4e866a7a..b963c8e3 100644 --- a/test/System.Linq.Dynamic.Core.Tests/Parser/ExpressionParserTests.cs +++ b/test/System.Linq.Dynamic.Core.Tests/Parser/ExpressionParserTests.cs @@ -331,12 +331,14 @@ public void Parse_NullableShouldReturnNullable(string expression, object resultT [InlineData("Company.Equals(null, null)", "Equals(null, null)")] [InlineData("MainCompany.Name", "company.MainCompany.Name")] [InlineData("Name", "company.Name")] + [InlineData("company.Name","company.Name")] [InlineData("DateTime", "company.DateTime")] public void Parse_When_PrioritizePropertyOrFieldOverTheType_IsTrue(string expression, string result) { // Arrange var config = new ParsingConfig { + IsCaseSensitive = true, CustomTypeProvider = _dynamicTypeProviderMock.Object }; ParameterExpression[] parameters = { ParameterExpressionHelper.CreateParameterExpression(typeof(Company), "company") }; From 9bd1b8c6710aba81cf8e759d3769b168b1ee4343 Mon Sep 17 00:00:00 2001 From: Abbas Cyclewala Date: Thu, 10 Aug 2023 14:34:15 +0530 Subject: [PATCH 3/3] simplified code for type prioritization --- .../Parser/ExpressionParser.cs | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs b/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs index 1fcb555d..9d46c79d 100644 --- a/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs +++ b/src/System.Linq.Dynamic.Core/Parser/ExpressionParser.cs @@ -931,17 +931,20 @@ private Expression ParseIdentifier() var isValidKeyWord = _keywordsHelper.TryGetValue(_textParser.CurrentToken.Text, out var value); - var extraCondition = !_parsingConfig.PrioritizePropertyOrFieldOverTheType || - (_parsingConfig.PrioritizePropertyOrFieldOverTheType - && !(value is Type - && ((_it != null && FindPropertyOrField(_it.Type, _textParser.CurrentToken.Text, false) != null) - || _symbols.ContainsKey(_textParser.CurrentToken.Text) - - )) - - ); + + bool shouldPrioritizeType = true; + + if (_parsingConfig.PrioritizePropertyOrFieldOverTheType && value is Type) + { + bool isPropertyOrField = _it != null && FindPropertyOrField(_it.Type, _textParser.CurrentToken.Text, false) != null; + bool hasSymbol = _symbols.ContainsKey(_textParser.CurrentToken.Text); + if (isPropertyOrField || hasSymbol) + { + shouldPrioritizeType = false; + } + } - if (isValidKeyWord && extraCondition) + if (isValidKeyWord && shouldPrioritizeType) { if (value is Type typeValue) {