Browse Source

Fixed template BindingPriority rewriter

pull/7679/head
Nikita Tsukanov 4 years ago
parent
commit
598966a725
  1. 3
      src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj
  2. 12
      src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlControlTemplatePriorityTransformer.cs
  3. 6
      src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs
  4. 32
      src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/XamlIlAvaloniaPropertyHelper.cs
  5. 2
      src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github

3
src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj

@ -89,6 +89,9 @@
<Compile Include="../Avalonia.Controls/GridLength.cs">
<Link>Markup/%(RecursiveDir)%(FileName)%(Extension)</Link>
</Compile>
<Compile Include="../Avalonia.Base/Data/BindingPriority.cs">
<Link>Markup/%(RecursiveDir)%(FileName)%(Extension)</Link>
</Compile>
<Compile Include="..\Avalonia.Base\Metadata\NullableAttributes.cs" Link="NullableAttributes.cs" />
<Compile Remove="../Markup/Avalonia.Markup.Xaml.Loader\xamlil.github\**\obj\**\*.cs" />
<Compile Remove="../Markup/Avalonia.Markup.Xaml.Loader\xamlil.github\src\XamlX\IL\SreTypeSystem.cs" />

12
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<IXamlPropertySetter> { setPriorityValueSetter };
prop.Values.Insert(0, new XamlConstantNode(node, bindingPriorityType, (int)BindingPriority.Style));
}
}

6
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");

32
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<T>(StyledPropertyBase<T>, 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);
}
}

2
src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github

@ -1 +1 @@
Subproject commit 8e20d65eb5f1efbae08e49b18f39bfdce32df7b3
Subproject commit e0cfcd0ef687e613ef8905e8d0891974b68c565d
Loading…
Cancel
Save