From 380ada052fa656afc18d236d32feeb0ae27b04bf Mon Sep 17 00:00:00 2001 From: Dariusz Komosinski Date: Wed, 11 Nov 2020 16:21:16 +0100 Subject: [PATCH] Fix a few not needed allocations. --- .../Templates/DataTemplateExtensions.cs | 27 ++++++++++--------- .../Parsers/BindingExpressionGrammar.cs | 2 +- 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/Avalonia.Controls/Templates/DataTemplateExtensions.cs b/src/Avalonia.Controls/Templates/DataTemplateExtensions.cs index f6e28483fd..d4e2c25c42 100644 --- a/src/Avalonia.Controls/Templates/DataTemplateExtensions.cs +++ b/src/Avalonia.Controls/Templates/DataTemplateExtensions.cs @@ -1,6 +1,8 @@ using System.Linq; using Avalonia.LogicalTree; +#nullable enable + namespace Avalonia.Controls.Templates { /// @@ -18,21 +20,23 @@ namespace Avalonia.Controls.Templates /// tree are searched. /// /// The data template or null if no matching data template was found. - public static IDataTemplate FindDataTemplate( + public static IDataTemplate? FindDataTemplate( this IControl control, object data, - IDataTemplate primary = null) + IDataTemplate? primary = null) { if (primary?.Match(data) == true) { return primary; } - foreach (var i in control.GetSelfAndLogicalAncestors().OfType()) + var currentTemplateHost = control as ILogical; + + while (currentTemplateHost != null) { - if (i.IsDataTemplatesInitialized) + if (currentTemplateHost is IDataTemplateHost hostCandidate && hostCandidate.IsDataTemplatesInitialized) { - foreach (IDataTemplate dt in i.DataTemplates) + foreach (IDataTemplate dt in hostCandidate.DataTemplates) { if (dt.Match(data)) { @@ -40,20 +44,19 @@ namespace Avalonia.Controls.Templates } } } + + currentTemplateHost = currentTemplateHost.LogicalParent; } IGlobalDataTemplates global = AvaloniaLocator.Current.GetService(); - if (global != null) + if (global != null && global.IsDataTemplatesInitialized) { - if (global.IsDataTemplatesInitialized) + foreach (IDataTemplate dt in global.DataTemplates) { - foreach (IDataTemplate dt in global.DataTemplates) + if (dt.Match(data)) { - if (dt.Match(data)) - { - return dt; - } + return dt; } } } diff --git a/src/Markup/Avalonia.Markup/Markup/Parsers/BindingExpressionGrammar.cs b/src/Markup/Avalonia.Markup/Markup/Parsers/BindingExpressionGrammar.cs index 8de64e56ff..8e5631e198 100644 --- a/src/Markup/Avalonia.Markup/Markup/Parsers/BindingExpressionGrammar.cs +++ b/src/Markup/Avalonia.Markup/Markup/Parsers/BindingExpressionGrammar.cs @@ -16,7 +16,7 @@ namespace Avalonia.Markup.Parsers internal static class BindingExpressionGrammar { - public static (IList Nodes, SourceMode Mode) Parse(ref CharacterReader r) + public static (List Nodes, SourceMode Mode) Parse(ref CharacterReader r) { var nodes = new List(); var state = State.Start;