From 9089d1109151b0faaae6f3fbe97d622e7c177ab7 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sun, 28 Apr 2019 15:15:55 +0300 Subject: [PATCH] Provide parent type metadata scope for Animatable.Transitions --- .../Avalonia.Markup.Xaml.csproj | 1 + .../AvaloniaXamlIlCompiler.cs | 3 +- ...olTemplateTargetTypeMetadataTransformer.cs | 3 +- ...amlIlTransitionsTypeMetadataTransformer.cs | 28 +++++++++++++++++++ .../AvaloniaXamlIlWellKnownTypes.cs | 2 ++ .../XamlIlBugTests.cs | 16 ++++++++++- 6 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlTransitionsTypeMetadataTransformer.cs diff --git a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj index b462caed29..4efe500bb7 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj +++ b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj @@ -61,6 +61,7 @@ + diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlCompiler.cs b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlCompiler.cs index 490b94ea52..ce47f4b3c6 100644 --- a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlCompiler.cs +++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlCompiler.cs @@ -42,7 +42,8 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions new AvaloniaXamlIlSelectorTransformer(), new AvaloniaXamlIlSetterTransformer(), new AvaloniaXamlIlControlTemplateTargetTypeMetadataTransformer(), - new AvaloniaXamlIlConstructorServiceProviderTransformer() + new AvaloniaXamlIlConstructorServiceProviderTransformer(), + new AvaloniaXamlIlTransitionsTypeMetadataTransformer() ); // After everything else diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlControlTemplateTargetTypeMetadataTransformer.cs b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlControlTemplateTargetTypeMetadataTransformer.cs index cd09b536f6..15ede5f641 100644 --- a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlControlTemplateTargetTypeMetadataTransformer.cs +++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlControlTemplateTargetTypeMetadataTransformer.cs @@ -56,7 +56,8 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers public enum ScopeType { Style, - ControlTemplate + ControlTemplate, + Transitions } public AvaloniaXamlIlTargetTypeMetadataNode(IXamlIlAstValueNode value, IXamlIlAstTypeReference targetType, diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlTransitionsTypeMetadataTransformer.cs b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlTransitionsTypeMetadataTransformer.cs new file mode 100644 index 0000000000..11e20a9dab --- /dev/null +++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlTransitionsTypeMetadataTransformer.cs @@ -0,0 +1,28 @@ +using XamlIl.Ast; +using XamlIl.Transform; + +namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers +{ + public class AvaloniaXamlIlTransitionsTypeMetadataTransformer : IXamlIlAstTransformer + { + public IXamlIlAstNode Transform(XamlIlAstTransformationContext context, IXamlIlAstNode node) + { + if (node is XamlIlAstObjectNode on) + { + foreach (var ch in on.Children) + { + if (ch is XamlIlAstXamlPropertyValueNode pn + && pn.Property.GetClrProperty().PropertyType.Equals(context.GetAvaloniaTypes().Transitions)) + { + for (var c = 0; c < pn.Values.Count; c++) + { + pn.Values[c] = new AvaloniaXamlIlTargetTypeMetadataNode(pn.Values[c], on.Type, + AvaloniaXamlIlTargetTypeMetadataNode.ScopeType.Transitions); + } + } + } + } + return node; + } + } +} diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs index 388bb94b35..12a10d753b 100644 --- a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs +++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs @@ -13,6 +13,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers public IXamlIlMethod AvaloniaObjectBindMethod { get; } public IXamlIlType IDisposable { get; } public XamlIlTypeWellKnownTypes XamlIlTypes { get; } + public IXamlIlType Transitions { get; } public AvaloniaXamlIlWellKnownTypes(XamlIlAstTransformationContext ctx) { @@ -23,6 +24,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers AvaloniaProperty = ctx.Configuration.TypeSystem.GetType("Avalonia.AvaloniaProperty"); IBinding = ctx.Configuration.TypeSystem.GetType("Avalonia.Data.IBinding"); IDisposable = ctx.Configuration.TypeSystem.GetType("System.IDisposable"); + Transitions = ctx.Configuration.TypeSystem.GetType("Avalonia.Animation.Transitions"); AvaloniaObjectBindMethod = AvaloniaObjectExtensions.FindMethod("Bind", IDisposable, false, IAvaloniaObject, AvaloniaProperty, IBinding, ctx.Configuration.WellKnownTypes.Object); diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/XamlIlBugTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/XamlIlBugTests.cs index 73312749c6..839cd07755 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/XamlIlBugTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/XamlIlBugTests.cs @@ -18,7 +18,21 @@ namespace Avalonia.Markup.Xaml.UnitTests parsed.DataContext = ctx; parsed.SetValue(Button.IsPressedProperty, true); Assert.True(ctx.IsPressed); - + } + + [Fact] + public void Transitions_Should_Be_Properly_Parsed() + { + var parsed = (Grid)AvaloniaXamlLoader.Parse(@" + + + + +"); + Assert.Equal(1, parsed.Transitions.Count); + Assert.Equal(Visual.OpacityProperty, parsed.Transitions[0].Property); }