diff --git a/src/Avalonia.Base/Utilities/MathUtilities.cs b/src/Avalonia.Base/Utilities/MathUtilities.cs
index 2a92e75f58..446b366dc8 100644
--- a/src/Avalonia.Base/Utilities/MathUtilities.cs
+++ b/src/Avalonia.Base/Utilities/MathUtilities.cs
@@ -5,7 +5,10 @@ namespace Avalonia.Utilities
///
/// Provides math utilities not provided in System.Math.
///
- public static class MathUtilities
+#if !BUILDTASK
+ public
+#endif
+ static class MathUtilities
{
// smallest such that 1.0+DoubleEpsilon != 1.0
internal static readonly double DoubleEpsilon = 2.2204460492503131e-016;
diff --git a/src/Avalonia.Base/Utilities/StringTokenizer.cs b/src/Avalonia.Base/Utilities/StringTokenizer.cs
index a159bfb72e..24e99febb9 100644
--- a/src/Avalonia.Base/Utilities/StringTokenizer.cs
+++ b/src/Avalonia.Base/Utilities/StringTokenizer.cs
@@ -4,7 +4,10 @@ using static System.Char;
namespace Avalonia.Utilities
{
- public struct StringTokenizer : IDisposable
+#if !BUILDTASK
+ public
+#endif
+ struct StringTokenizer : IDisposable
{
private const char DefaultSeparatorChar = ',';
diff --git a/src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj b/src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj
index 94ad4adb7d..bfac1ac1e1 100644
--- a/src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj
+++ b/src/Avalonia.Build.Tasks/Avalonia.Build.Tasks.csproj
@@ -45,6 +45,12 @@
Markup/%(RecursiveDir)%(FileName)%(Extension)
+
+ Markup/%(RecursiveDir)%(FileName)%(Extension)
+
+
+ Markup/%(RecursiveDir)%(FileName)%(Extension)
+
Markup/%(RecursiveDir)%(FileName)%(Extension)
@@ -57,6 +63,24 @@
Markup/%(RecursiveDir)%(FileName)%(Extension)
+
+ Markup/%(RecursiveDir)%(FileName)%(Extension)
+
+
+ Markup/%(RecursiveDir)%(FileName)%(Extension)
+
+
+ Markup/%(RecursiveDir)%(FileName)%(Extension)
+
+
+ Markup/%(RecursiveDir)%(FileName)%(Extension)
+
+
+ Markup/%(RecursiveDir)%(FileName)%(Extension)
+
+
+ Markup/%(RecursiveDir)%(FileName)%(Extension)
+
diff --git a/src/Avalonia.Visuals/CornerRadius.cs b/src/Avalonia.Visuals/CornerRadius.cs
index c02aacfb4d..037bb16e31 100644
--- a/src/Avalonia.Visuals/CornerRadius.cs
+++ b/src/Avalonia.Visuals/CornerRadius.cs
@@ -1,6 +1,8 @@
using System;
using System.Globalization;
+#if !BUILDTASK
using Avalonia.Animation.Animators;
+#endif
using Avalonia.Utilities;
namespace Avalonia
@@ -8,11 +10,16 @@ namespace Avalonia
///
/// Represents the radii of a rectangle's corners.
///
- public readonly struct CornerRadius : IEquatable
+#if !BUILDTASK
+ public
+#endif
+ readonly struct CornerRadius : IEquatable
{
static CornerRadius()
{
+#if !BUILDTASK
Animation.Animation.RegisterAnimator(prop => typeof(CornerRadius).IsAssignableFrom(prop.PropertyType));
+#endif
}
public CornerRadius(double uniformRadius)
diff --git a/src/Avalonia.Visuals/Matrix.cs b/src/Avalonia.Visuals/Matrix.cs
index 206b842220..2ccfd43f03 100644
--- a/src/Avalonia.Visuals/Matrix.cs
+++ b/src/Avalonia.Visuals/Matrix.cs
@@ -7,7 +7,10 @@ namespace Avalonia
///
/// A 2x3 matrix.
///
- public readonly struct Matrix : IEquatable
+#if !BUILDTASK
+ public
+#endif
+ readonly struct Matrix : IEquatable
{
private readonly double _m11;
private readonly double _m12;
diff --git a/src/Avalonia.Visuals/Point.cs b/src/Avalonia.Visuals/Point.cs
index 7324f5fbd0..6febe9c802 100644
--- a/src/Avalonia.Visuals/Point.cs
+++ b/src/Avalonia.Visuals/Point.cs
@@ -1,6 +1,8 @@
using System;
using System.Globalization;
+#if !BUILDTASK
using Avalonia.Animation.Animators;
+#endif
using Avalonia.Utilities;
namespace Avalonia
@@ -8,11 +10,16 @@ namespace Avalonia
///
/// Defines a point.
///
- public readonly struct Point : IEquatable
+#if !BUILDTASK
+ public
+#endif
+ readonly struct Point : IEquatable
{
static Point()
{
+#if !BUILDTASK
Animation.Animation.RegisterAnimator(prop => typeof(Point).IsAssignableFrom(prop.PropertyType));
+#endif
}
///
diff --git a/src/Avalonia.Visuals/Size.cs b/src/Avalonia.Visuals/Size.cs
index d87d2c5fc2..8a805dc6c5 100644
--- a/src/Avalonia.Visuals/Size.cs
+++ b/src/Avalonia.Visuals/Size.cs
@@ -1,6 +1,8 @@
using System;
using System.Globalization;
+#if !BUILDTASK
using Avalonia.Animation.Animators;
+#endif
using Avalonia.Utilities;
namespace Avalonia
@@ -8,11 +10,16 @@ namespace Avalonia
///
/// Defines a size.
///
- public readonly struct Size : IEquatable
+#if !BUILDTASK
+ public
+#endif
+ readonly struct Size : IEquatable
{
static Size()
{
+#if !BUILDTASK
Animation.Animation.RegisterAnimator(prop => typeof(Size).IsAssignableFrom(prop.PropertyType));
+#endif
}
///
diff --git a/src/Avalonia.Visuals/Thickness.cs b/src/Avalonia.Visuals/Thickness.cs
index 6d69c4d9a9..06ebc9bfe7 100644
--- a/src/Avalonia.Visuals/Thickness.cs
+++ b/src/Avalonia.Visuals/Thickness.cs
@@ -1,6 +1,8 @@
using System;
using System.Globalization;
+#if !BUILDTASK
using Avalonia.Animation.Animators;
+#endif
using Avalonia.Utilities;
namespace Avalonia
@@ -8,11 +10,16 @@ namespace Avalonia
///
/// Describes the thickness of a frame around a rectangle.
///
- public readonly struct Thickness : IEquatable
+#if !BUILDTASK
+ public
+#endif
+ readonly struct Thickness : IEquatable
{
static Thickness()
{
+#if !BUILDTASK
Animation.Animation.RegisterAnimator(prop => typeof(Thickness).IsAssignableFrom(prop.PropertyType));
+#endif
}
///
diff --git a/src/Avalonia.Visuals/Vector.cs b/src/Avalonia.Visuals/Vector.cs
index 2fcf804f14..1b9f5c67d5 100644
--- a/src/Avalonia.Visuals/Vector.cs
+++ b/src/Avalonia.Visuals/Vector.cs
@@ -1,6 +1,8 @@
using System;
using System.Globalization;
+#if !BUILDTASK
using Avalonia.Animation.Animators;
+#endif
using Avalonia.Utilities;
#nullable enable
@@ -10,11 +12,16 @@ namespace Avalonia
///
/// Defines a vector.
///
- public readonly struct Vector : IEquatable
+#if !BUILDTASK
+ public
+#endif
+ readonly struct Vector : IEquatable
{
static Vector()
{
+#if !BUILDTASK
Animation.Animation.RegisterAnimator(prop => typeof(Vector).IsAssignableFrom(prop.PropertyType));
+#endif
}
///
diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AstNodes/AvaloniaXamlIlVectorLikeConstantAstNode.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AstNodes/AvaloniaXamlIlVectorLikeConstantAstNode.cs
new file mode 100644
index 0000000000..35cc9b3cf2
--- /dev/null
+++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AstNodes/AvaloniaXamlIlVectorLikeConstantAstNode.cs
@@ -0,0 +1,54 @@
+using Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers;
+using XamlX;
+using XamlX.Ast;
+using XamlX.Emit;
+using XamlX.IL;
+using XamlX.TypeSystem;
+
+namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.AstNodes
+{
+ class AvaloniaXamlIlVectorLikeConstantAstNode : XamlAstNode, IXamlAstValueNode, IXamlAstILEmitableNode
+ {
+ private readonly IXamlConstructor _constructor;
+ private readonly double[] _values;
+
+ public AvaloniaXamlIlVectorLikeConstantAstNode(IXamlLineInfo lineInfo, AvaloniaXamlIlWellKnownTypes types, IXamlType type, IXamlConstructor constructor, double[] values) : base(lineInfo)
+ {
+ var parameters = constructor.Parameters;
+
+ if (parameters.Count != values.Length)
+ {
+ throw new XamlTypeSystemException($"Constructor that takes {values.Length} parameters is expected, got {parameters.Count} instead.");
+ }
+
+ var elementType = types.XamlIlTypes.Double;
+
+ foreach (var parameter in parameters)
+ {
+ if (parameter != elementType)
+ {
+ throw new XamlTypeSystemException($"Expected parameter of type {elementType}, got {parameter} instead.");
+ }
+ }
+
+ _constructor = constructor;
+ _values = values;
+
+ Type = new XamlAstClrTypeReference(lineInfo, type, false);
+ }
+
+ public IXamlAstTypeReference Type { get; }
+
+ public XamlILNodeEmitResult Emit(XamlEmitContext context, IXamlILEmitter codeGen)
+ {
+ foreach (var value in _values)
+ {
+ codeGen.Ldc_R8(value);
+ }
+
+ codeGen.Newobj(_constructor);
+
+ return XamlILNodeEmitResult.Type(0, Type.GetClrType());
+ }
+ }
+}
diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguage.cs b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguage.cs
index 15413689f8..c3d9534828 100644
--- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguage.cs
+++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlLanguage.cs
@@ -205,6 +205,66 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions
result = new AvaloniaXamlIlFontFamilyAstNode(types, text, node);
return true;
}
+
+ if (type.Equals(types.Thickness))
+ {
+ var thickness = Thickness.Parse(text);
+
+ result = new AvaloniaXamlIlVectorLikeConstantAstNode(node, types, types.Thickness, types.ThicknessFullConstructor,
+ new[] { thickness.Left, thickness.Top, thickness.Right, thickness.Bottom });
+
+ return true;
+ }
+
+ if (type.Equals(types.Point))
+ {
+ var point = Point.Parse(text);
+
+ result = new AvaloniaXamlIlVectorLikeConstantAstNode(node, types, types.Point, types.PointFullConstructor,
+ new[] { point.X, point.Y });
+
+ return true;
+ }
+
+ if (type.Equals(types.Vector))
+ {
+ var vector = Vector.Parse(text);
+
+ result = new AvaloniaXamlIlVectorLikeConstantAstNode(node, types, types.Vector, types.VectorFullConstructor,
+ new[] { vector.X, vector.Y });
+
+ return true;
+ }
+
+ if (type.Equals(types.Size))
+ {
+ var size = Size.Parse(text);
+
+ result = new AvaloniaXamlIlVectorLikeConstantAstNode(node, types, types.Size, types.SizeFullConstructor,
+ new[] { size.Width, size.Height });
+
+ return true;
+ }
+
+ if (type.Equals(types.Matrix))
+ {
+ var matrix = Matrix.Parse(text);
+
+ result = new AvaloniaXamlIlVectorLikeConstantAstNode(node, types, types.Matrix, types.MatrixFullConstructor,
+ new[] { matrix.M11, matrix.M12, matrix.M21, matrix.M22, matrix.M31, matrix.M32 });
+
+ return true;
+ }
+
+ if (type.Equals(types.CornerRadius))
+ {
+ var cornerRadius = CornerRadius.Parse(text);
+
+ result = new AvaloniaXamlIlVectorLikeConstantAstNode(node, types, types.CornerRadius, types.CornerRadiusFullConstructor,
+ new[] { cornerRadius.TopLeft, cornerRadius.TopRight, cornerRadius.BottomRight, cornerRadius.BottomLeft });
+
+ return true;
+ }
if (type.FullName == "Avalonia.AvaloniaProperty")
{
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 58f4ddfe31..05b13b61d3 100644
--- a/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs
+++ b/src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/Transformers/AvaloniaXamlIlWellKnownTypes.cs
@@ -1,4 +1,5 @@
using System.Collections.Generic;
+using System.Linq;
using XamlX.Emit;
using XamlX.IL;
using XamlX.Transform;
@@ -52,7 +53,18 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers
public IXamlType Uri { get; }
public IXamlType FontFamily { get; }
public IXamlConstructor FontFamilyConstructorUriName { get; }
-
+ public IXamlType Thickness { get; }
+ public IXamlConstructor ThicknessFullConstructor { get; }
+ public IXamlType Point { get; }
+ public IXamlConstructor PointFullConstructor { get; }
+ public IXamlType Vector { get; }
+ public IXamlConstructor VectorFullConstructor { get; }
+ public IXamlType Size { get; }
+ public IXamlConstructor SizeFullConstructor { get; }
+ public IXamlType Matrix { get; }
+ public IXamlConstructor MatrixFullConstructor { get; }
+ public IXamlType CornerRadius { get; }
+ public IXamlConstructor CornerRadiusFullConstructor { get; }
public AvaloniaXamlIlWellKnownTypes(TransformerConfiguration cfg)
{
@@ -113,7 +125,22 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers
Long = cfg.TypeSystem.GetType("System.Int64");
Uri = cfg.TypeSystem.GetType("System.Uri");
FontFamily = cfg.TypeSystem.GetType("Avalonia.Media.FontFamily");
- FontFamilyConstructorUriName = FontFamily.FindConstructor(new List { Uri, XamlIlTypes.String });
+ FontFamilyConstructorUriName = FontFamily.GetConstructor(new List { Uri, XamlIlTypes.String });
+
+ (IXamlType, IXamlConstructor) GetNumericTypeInfo(string name, IXamlType componentType, int componentCount)
+ {
+ var type = cfg.TypeSystem.GetType(name);
+ var ctor = type.GetConstructor(Enumerable.Range(0, componentCount).Select(_ => componentType).ToList());
+
+ return (type, ctor);
+ }
+
+ (Thickness, ThicknessFullConstructor) = GetNumericTypeInfo("Avalonia.Thickness", XamlIlTypes.Double, 4);
+ (Point, PointFullConstructor) = GetNumericTypeInfo("Avalonia.Point", XamlIlTypes.Double, 2);
+ (Vector, VectorFullConstructor) = GetNumericTypeInfo("Avalonia.Vector", XamlIlTypes.Double, 2);
+ (Size, SizeFullConstructor) = GetNumericTypeInfo("Avalonia.Size", XamlIlTypes.Double, 2);
+ (Matrix, MatrixFullConstructor) = GetNumericTypeInfo("Avalonia.Matrix", XamlIlTypes.Double, 6);
+ (CornerRadius, CornerRadiusFullConstructor) = GetNumericTypeInfo("Avalonia.CornerRadius", XamlIlTypes.Double, 4);
}
}
diff --git a/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github b/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github
index 5420df861c..ea80a607c5 160000
--- a/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github
+++ b/src/Markup/Avalonia.Markup.Xaml.Loader/xamlil.github
@@ -1 +1 @@
-Subproject commit 5420df861ce6f2be5ead9efa078fe7242ce88f18
+Subproject commit ea80a607c5e9d8f000160dbbb48c27ed4cfafbc9