Browse Source

Fixed ExpressionParseException being reported as an internal compiler error (#19817)

release/11.3.8
Tom Edwards 1 year ago
committed by Julien Lebosquain
parent
commit
e62e718a06
No known key found for this signature in database GPG Key ID: 1833CAD10ACC46FD
  1. 21
      src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlBindingPathParser.cs

21
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<BindingExpressionGrammar.INode> 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)

Loading…
Cancel
Save