diff --git a/src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj b/src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj index e864ea2007..da17b80e25 100644 --- a/src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj +++ b/src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj @@ -89,6 +89,9 @@ Markup/%(RecursiveDir)%(FileName)%(Extension) + + Markup/%(RecursiveDir)%(FileName)%(Extension) + diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlControlTemplatePriorityTransformer.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlControlTemplatePriorityTransformer.cs index 22f1a8bc00..fceebf860d 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlControlTemplatePriorityTransformer.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlControlTemplatePriorityTransformer.cs @@ -1,4 +1,6 @@ +using System.Collections.Generic; using System.Linq; +using Avalonia.Data; using XamlX.Ast; using XamlX.Transform; @@ -19,9 +21,15 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers { // If there are any setters which accept a binding priority, then add the Style // binding priority as a value. - if (avaloniaProperty.Setters.Any(x => x.Parameters[0] == bindingPriorityType)) + var setPriorityValueSetter = + avaloniaProperty.Setters.FirstOrDefault(x => x.Parameters[0] == bindingPriorityType); + + if(setPriorityValueSetter != null + && prop.Values.Count == 1 + && setPriorityValueSetter.Parameters[1].IsAssignableFrom(prop.Values[0].Type.GetClrType())) { - prop.Values.Insert(0, new XamlConstantNode(node, bindingPriorityType, 1)); + prop.PossibleSetters = new List { setPriorityValueSetter }; + prop.Values.Insert(0, new XamlConstantNode(node, bindingPriorityType, (int)BindingPriority.Style)); } } diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs index eb3b7b8f7e..cc84fb0e52 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs @@ -16,6 +16,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers public IXamlType AvaloniaProperty { get; } public IXamlType AvaloniaPropertyT { get; } public IXamlType StyledPropertyT { get; } + public IXamlMethod AvaloniaObjectSetStyledPropertyValue { get; } public IXamlType AvaloniaAttachedPropertyT { get; } public IXamlType IBinding { get; } public IXamlMethod AvaloniaObjectBindMethod { get; } @@ -98,6 +99,11 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers StyledPropertyT = cfg.TypeSystem.GetType("Avalonia.StyledProperty`1"); AvaloniaAttachedPropertyT = cfg.TypeSystem.GetType("Avalonia.AttachedProperty`1"); BindingPriority = cfg.TypeSystem.GetType("Avalonia.Data.BindingPriority"); + AvaloniaObjectSetStyledPropertyValue = AvaloniaObject + .FindMethod(m => m.IsPublic && !m.IsStatic && m.Name == "SetValue" + && m.Parameters.Count == 3 + && m.Parameters[0].Name == "StyledPropertyBase`1" + && m.Parameters[2].Equals(BindingPriority)); IBinding = cfg.TypeSystem.GetType("Avalonia.Data.IBinding"); IDisposable = cfg.TypeSystem.GetType("System.IDisposable"); Transitions = cfg.TypeSystem.GetType("Avalonia.Animation.Transitions"); diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs index 6c61ad0705..a568cbcef4 100644 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs @@ -257,24 +257,24 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions public override void Emit(IXamlILEmitter emitter) { - var method = Types.AvaloniaObject - .FindMethod(m => m.IsPublic && !m.IsStatic && m.Name == "SetValue" - && m.Parameters.Count == 3 - && m.Parameters[0].Name == "StyledPropertyBase`1" - && m.Parameters[2].Equals(Types.BindingPriority)); - - if (method == null) - throw new XamlTypeSystemException( - $"Unable to find AvaloniaObject.SetValue(StyledPropertyBase, T, BindingPriority)."); - - method = method.MakeGenericMethod(new[] { Parameters[1] }); - - using (var bloc = emitter.LocalsPool.GetLocal(Parameters[1])) + /* + Current stack: + - object + - binding priority + - value + */ + + var method = Types.AvaloniaObjectSetStyledPropertyValue + .MakeGenericMethod(new[] { Parameters[1] }); + + using (var valueLocal = emitter.LocalsPool.GetLocal(Parameters[1])) + using (var priorityLocal = emitter.LocalsPool.GetLocal(Types.Int)) emitter - .Stloc(bloc.Local) + .Stloc(valueLocal.Local) + .Stloc(priorityLocal.Local) .Ldsfld(AvaloniaProperty) - .Ldloc(bloc.Local) - .Ldc_I4(0) + .Ldloc(valueLocal.Local) + .Ldloc(priorityLocal.Local) .EmitCall(method, true); } } diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github b/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github index 8e20d65eb5..e0cfcd0ef6 160000 --- a/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github +++ b/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github @@ -1 +1 @@ -Subproject commit 8e20d65eb5f1efbae08e49b18f39bfdce32df7b3 +Subproject commit e0cfcd0ef687e613ef8905e8d0891974b68c565d