diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlBindingPathParser.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlBindingPathParser.cs index c74118b6f7..7294bab29e 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlBindingPathParser.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlBindingPathParser.cs @@ -2,8 +2,9 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Linq; +using Avalonia.Data.Core; using Avalonia.Markup.Parsers; -using Avalonia.Utilities; +using XamlX; using XamlX.Ast; using XamlX.Transform; using XamlX.Transform.Transformers; @@ -22,7 +23,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers if (binding.Arguments.Count > 0 && binding.Arguments[0] is XamlAstTextNode bindingPathText) { - var (nodes, _) = BindingExpressionGrammar.Parse(bindingPathText.Text); + var nodes = GetBindingPath(bindingPathText); if (convertedNode != null) { @@ -47,7 +48,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers if (bindingPathAssignment != null && bindingPathAssignment.Values[0] is XamlAstTextNode pathValue) { - var (nodes, _) = BindingExpressionGrammar.Parse(pathValue.Text); + var nodes = GetBindingPath(pathValue); if (nodes.Count == 1 && nodes[0] is BindingExpressionGrammar.EmptyExpressionNode) { @@ -77,6 +78,18 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers return node; } + private static List GetBindingPath(XamlAstTextNode node) + { + try + { + return BindingExpressionGrammar.Parse(node.Text).Nodes; + } + catch (ExpressionParseException ex) + { + throw new XamlTransformException($"Failed to parse binding path '{node.Text}': {ex.Message}", node, ex); + } + } + private static BindingExpressionGrammar.INode? ConvertLongFormPropertiesToBindingExpressionNode( AstTransformationContext context, XamlAstObjectNode binding)