From 0a7c7fdfcf34035ebc65c4c2cbe127324973f553 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sun, 5 May 2019 23:10:21 +0300 Subject: [PATCH] Fixed TemplatedParent issue --- .../Avalonia.Markup.Xaml.csproj | 1 + .../AvaloniaXamlIlCompiler.cs | 1 + ...AvaloniaBindingExtensionHackTransformer.cs | 20 +++++++++++++++++++ .../AvaloniaXamlIlAvaloniaPropertyResolver.cs | 2 +- .../Xaml/XamlIlTests.cs | 4 ++-- 5 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaBindingExtensionHackTransformer.cs diff --git a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj index fb51942120..9ed48b079e 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj +++ b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj @@ -55,6 +55,7 @@ + diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlCompiler.cs b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlCompiler.cs index facac748c3..65149a65de 100644 --- a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlCompiler.cs +++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlCompiler.cs @@ -32,6 +32,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions Transformers.Insert(0, new XNameTransformer()); Transformers.Insert(1, new IgnoredDirectivesTransformer()); Transformers.Insert(2, _designTransformer = new AvaloniaXamlIlDesignPropertiesTransformer()); + Transformers.Insert(3, new AvaloniaBindingExtensionHackTransformer()); // Targeted diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaBindingExtensionHackTransformer.cs b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaBindingExtensionHackTransformer.cs new file mode 100644 index 0000000000..c89106312f --- /dev/null +++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaBindingExtensionHackTransformer.cs @@ -0,0 +1,20 @@ +using XamlIl.Ast; +using XamlIl.Transform; + +namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers +{ + class AvaloniaBindingExtensionHackTransformer : IXamlIlAstTransformer + { + public IXamlIlAstNode Transform(XamlIlAstTransformationContext context, IXamlIlAstNode node) + { + // Our code base expects XAML parser to prefer `FooExtension` to `Foo` even with `` syntax + // This is the legacy of Portable.Xaml, so we emulate that behavior here + + if (node is XamlIlAstXmlTypeReference tref + && tref.Name == "Binding" + && tref.XmlNamespace == "https://github.com/avaloniaui") + tref.IsMarkupExtension = true; + return node; + } + } +} diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlAvaloniaPropertyResolver.cs b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlAvaloniaPropertyResolver.cs index f95ad132ad..74f5c29f6a 100644 --- a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlAvaloniaPropertyResolver.cs +++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlAvaloniaPropertyResolver.cs @@ -4,7 +4,7 @@ using XamlIl.Transform; namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers { - public class AvaloniaXamlIlAvaloniaPropertyResolver : IXamlIlAstTransformer + class AvaloniaXamlIlAvaloniaPropertyResolver : IXamlIlAstTransformer { public IXamlIlAstNode Transform(XamlIlAstTransformationContext context, IXamlIlAstNode node) { diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/XamlIlTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/XamlIlTests.cs index 73f112ca80..a584027768 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/XamlIlTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/XamlIlTests.cs @@ -114,7 +114,7 @@ namespace Avalonia.Markup.Xaml.UnitTests .VisualChildren.First() .VisualChildren.First() .VisualChildren.First(); - Assert.Equal(Brushes.Red, canvas.Background); + Assert.Equal(Brushes.Red.Color, ((ISolidColorBrush)canvas.Background).Color); } } } @@ -123,7 +123,7 @@ namespace Avalonia.Markup.Xaml.UnitTests { public object Convert(IList values, Type targetType, object parameter, CultureInfo culture) { - return ((ISolidColorBrush)values[0]).Color; + return (values[0] as ISolidColorBrush)?.Color; } }