From ea0c26045fd4bdfb3dc1d840690dc7c4eb34391f Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 17 Apr 2019 11:13:06 +0300 Subject: [PATCH] Updated compiler to the recent master --- .../DataGridBoundColumn.cs | 1 + .../MarkupExtensions/StyleIncludeExtension.cs | 3 +- .../AvaloniaXamlIlLanguage.cs | 2 +- .../AvaloniaXamlIlSelectorTransformer.cs | 56 +++++++++++++++++-- 4 files changed, 55 insertions(+), 7 deletions(-) diff --git a/src/Avalonia.Controls.DataGrid/DataGridBoundColumn.cs b/src/Avalonia.Controls.DataGrid/DataGridBoundColumn.cs index d213285aff..09c3d07a41 100644 --- a/src/Avalonia.Controls.DataGrid/DataGridBoundColumn.cs +++ b/src/Avalonia.Controls.DataGrid/DataGridBoundColumn.cs @@ -26,6 +26,7 @@ namespace Avalonia.Controls /// Gets or sets the binding that associates the column with a property in the data source. /// //TODO Binding + [AssignBinding] public virtual IBinding Binding { get diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StyleIncludeExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StyleIncludeExtension.cs index 8a237f180f..d9345738fc 100644 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StyleIncludeExtension.cs +++ b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StyleIncludeExtension.cs @@ -18,7 +18,8 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions { } - public override object ProvideValue(IServiceProvider serviceProvider) + public override object ProvideValue(IServiceProvider serviceProvider) => ProvideTypedValue(serviceProvider); + public IStyle ProvideTypedValue(IServiceProvider serviceProvider) { return new StyleInclude(serviceProvider.GetContextBaseUri()) { Source = Source }; } diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlLanguage.cs b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlLanguage.cs index 94ebb138eb..0de9e7942b 100644 --- a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlLanguage.cs +++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/AvaloniaXamlIlLanguage.cs @@ -24,7 +24,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions var bindingType = typeSystem.GetType("Avalonia.Data.IBinding"); var rv = new XamlIlLanguageTypeMappings(typeSystem) { - SupportInitialize = typeSystem.GetType("Avalonia.ISupportInitialize"), + SupportInitialize = typeSystem.GetType("System.ComponentModel.ISupportInitialize"), XmlnsAttributes = { typeSystem.GetType("Avalonia.Metadata.XmlnsDefinitionAttribute"), diff --git a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlSelectorTransformer.cs b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlSelectorTransformer.cs index 4569accb74..1a646e50c2 100644 --- a/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlSelectorTransformer.cs +++ b/src/Markup/Avalonia.Markup.Xaml/XamlIl/CompilerExtensions/Transformers/AvaloniaXamlIlSelectorTransformer.cs @@ -35,12 +35,12 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers throw new XamlIlParseException("Selector property should be a text node", node); var selectorType = pn.Property.GetClrProperty().PropertyType; - + var initialNode = new XamlIlSelectorInitialNode(node, selectorType); XamlIlSelectorNode Create(IEnumerable syntax, Func typeResolver) { - XamlIlSelectorNode result = new XamlIlSelectorInitialNode(node, selectorType); - + XamlIlSelectorNode result = initialNode; + XamlIlOrSelectorNode results = null; foreach (var i in syntax) { switch (i) @@ -93,12 +93,18 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers case SelectorGrammar.NotSyntax not: result = new XamlIlNotSelector(result, Create(not.Argument, typeResolver)); break; + case SelectorGrammar.CommaSyntax comma: + if (results == null) + results = new XamlIlOrSelectorNode(node, selectorType); + results.Add(result); + result = initialNode; + break; default: throw new XamlIlParseException($"Unsupported selector grammar '{i.GetType()}'.", node); } } - return result; + return results ?? result; } IEnumerable parsed; @@ -126,7 +132,7 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers abstract class XamlIlSelectorNode : XamlIlAstNode, IXamlIlAstValueNode, IXamlIlAstEmitableNode { - public XamlIlSelectorNode Previous { get; } + protected XamlIlSelectorNode Previous { get; } public abstract IXamlIlType TargetType { get; } public XamlIlSelectorNode(XamlIlSelectorNode previous, @@ -288,4 +294,44 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions.Transformers && m.Parameters[2].Equals(context.Configuration.WellKnownTypes.Object)); } } + + class XamlIlOrSelectorNode : XamlIlSelectorNode + { + List _selectors = new List(); + public XamlIlOrSelectorNode(IXamlIlLineInfo info, IXamlIlType selectorType) : base(null, info, selectorType) + { + } + + public void Add(XamlIlSelectorNode node) + { + _selectors.Add(node); + } + + //TODO: actually find the type + public override IXamlIlType TargetType => _selectors.FirstOrDefault()?.TargetType; + protected override void DoEmit(XamlIlEmitContext context, IXamlIlEmitter codeGen) + { + if (_selectors.Count == 0) + throw new XamlIlLoadException("Invalid selector count", this); + if (_selectors.Count == 1) + { + _selectors[0].Emit(context, codeGen); + return; + } + var listType = context.Configuration.TypeSystem.FindType("System.Collections.Generic.List`1") + .MakeGenericType(base.Type.GetClrType()); + var add = listType.FindMethod("Add", context.Configuration.WellKnownTypes.Void, false, Type.GetClrType()); + codeGen + .Newobj(listType.FindConstructor()); + foreach (var s in _selectors) + { + codeGen.Dup(); + context.Emit(s, codeGen, Type.GetClrType()); + codeGen.EmitCall(add, true); + } + + EmitCall(context, codeGen, + m => m.Name == "Or" && m.Parameters.Count == 1 && m.Parameters[0].Name.StartsWith("IReadOnlyList")); + } + } }