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.Collections.Generic;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using System.Linq; using System.Linq;
using Avalonia.Data.Core;
using Avalonia.Markup.Parsers; using Avalonia.Markup.Parsers;
using Avalonia.Utilities; using Avalonia.Utilities;
using XamlX;
using XamlX.Ast; using XamlX.Ast;
using XamlX.Transform; using XamlX.Transform;
using XamlX.Transform.Transformers; 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) if (binding.Arguments.Count > 0 && binding.Arguments[0] is XamlAstTextNode bindingPathText)
{ {
var reader = new CharacterReader(bindingPathText.Text.AsSpan()); var nodes = GetBindingPath(bindingPathText);
var (nodes, _) = BindingExpressionGrammar.Parse(ref reader);
if (convertedNode != null) if (convertedNode != null)
{ {
@ -48,8 +49,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers
if (bindingPathAssignment != null && bindingPathAssignment.Values[0] is XamlAstTextNode pathValue) if (bindingPathAssignment != null && bindingPathAssignment.Values[0] is XamlAstTextNode pathValue)
{ {
var reader = new CharacterReader(pathValue.Text.AsSpan()); var nodes = GetBindingPath(pathValue);
var (nodes, _) = BindingExpressionGrammar.Parse(ref reader);
if (nodes.Count == 1 && nodes[0] is BindingExpressionGrammar.EmptyExpressionNode) if (nodes.Count == 1 && nodes[0] is BindingExpressionGrammar.EmptyExpressionNode)
{ {
@ -79,6 +79,19 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers
return node; 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( private static BindingExpressionGrammar.INode? ConvertLongFormPropertiesToBindingExpressionNode(
AstTransformationContext context, AstTransformationContext context,
XamlAstObjectNode binding) XamlAstObjectNode binding)

Loading…
Cancel
Save