From e62e718a06f554cbbe1b444a832b45f4959b61f2 Mon Sep 17 00:00:00 2001 From: Tom Edwards <109803929+TomEdwardsEnscape@users.noreply.github.com> Date: Mon, 13 Oct 2025 13:10:04 +0200 Subject: [PATCH] Fixed ExpressionParseException being reported as an internal compiler error (#19817) --- .../AvaloniaXamlIlBindingPathParser.cs | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) 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 62e81f44d8..71cc252182 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,10 @@ 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,8 +24,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers if (binding.Arguments.Count > 0 && binding.Arguments[0] is XamlAstTextNode bindingPathText) { - var reader = new CharacterReader(bindingPathText.Text.AsSpan()); - var (nodes, _) = BindingExpressionGrammar.Parse(ref reader); + var nodes = GetBindingPath(bindingPathText); if (convertedNode != null) { @@ -48,8 +49,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers if (bindingPathAssignment != null && bindingPathAssignment.Values[0] is XamlAstTextNode pathValue) { - var reader = new CharacterReader(pathValue.Text.AsSpan()); - var (nodes, _) = BindingExpressionGrammar.Parse(ref reader); + var nodes = GetBindingPath(pathValue); if (nodes.Count == 1 && nodes[0] is BindingExpressionGrammar.EmptyExpressionNode) { @@ -79,6 +79,19 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers return node; } + private static List GetBindingPath(XamlAstTextNode node) + { + try + { + var reader = new CharacterReader(node.Text.AsSpan()); + return BindingExpressionGrammar.Parse(ref reader).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)