| File: SimplifyOnPlatformVisitor.cs | Web Access |
| Project: src\src\Controls\src\Xaml\Controls.Xaml.csproj (Microsoft.Maui.Controls.Xaml) |
using System; using System.Linq; #nullable disable namespace Microsoft.Maui.Controls.Xaml { class SimplifyOnPlatformVisitor : IXamlNodeVisitor { public SimplifyOnPlatformVisitor(string targetFramework) { if (string.IsNullOrEmpty(targetFramework)) return; if (targetFramework.IndexOf("-android", StringComparison.OrdinalIgnoreCase) != -1) Target = nameof(OnPlatformExtension.Android); if (targetFramework.IndexOf("-ios", StringComparison.OrdinalIgnoreCase) != -1) Target = nameof(OnPlatformExtension.iOS); if (targetFramework.IndexOf("-macos", StringComparison.OrdinalIgnoreCase) != -1) Target = nameof(OnPlatformExtension.macOS); if (targetFramework.IndexOf("-maccatalyst", StringComparison.OrdinalIgnoreCase) != -1) Target = nameof(OnPlatformExtension.MacCatalyst); } public string Target { get; } public TreeVisitingMode VisitingMode => TreeVisitingMode.BottomUp; public bool StopOnDataTemplate => false; public bool VisitNodeOnDataTemplate => true; public bool StopOnResourceDictionary => false; public bool IsResourceDictionary(ElementNode node) => false; public bool SkipChildren(INode node, INode parentNode) => false; public void Visit(ValueNode node, INode parentNode) { } public void Visit(MarkupNode node, INode parentNode) { //markup was already expanded to element } public void Visit(ElementNode node, INode parentNode) { if (Target is null) return; //`{OnPlatform}` markup extension if (node.XmlType.Name == nameof(OnPlatformExtension) && node.XmlType.NamespaceUri == XamlParser.MauiUri) { if (node.Properties.TryGetValue(new XmlName("", Target), out INode targetNode) || node.Properties.TryGetValue(new XmlName("", nameof(OnPlatformExtension.Default)), out targetNode)) { if (!node.TryGetPropertyName(parentNode, out XmlName name)) return; if (parentNode is IElementNode parentEnode) parentEnode.Properties[name] = targetNode; } else if (node.CollectionItems.Count > 0) // syntax like {OnPlatform foo, iOS=bar} { if (!node.TryGetPropertyName(parentNode, out XmlName name)) return; if (parentNode is IElementNode parentEnode) parentEnode.Properties[name] = node.CollectionItems[0]; } else //no prop for target and no Default set { if (!node.TryGetPropertyName(parentNode, out XmlName name)) return; //if there's no value for the targetPlatform, ignore the node. //this is slightly different than what OnPlatform does (return default(T)) if (parentNode is IElementNode parentEnode) parentEnode.Properties.Remove(name); } } //`<OnPlatform>` elements //if (node.XmlType.Name == "OnPlatform" && node.XmlType.NamespaceUri == XamlParser.MauiUri) //{ // var onNode = GetOnNode(node, Target) ?? GetDefault(node); // //Property node // if (node.TryGetPropertyName(parentNode, out XmlName name) // && parentNode is IElementNode parentEnode) // { // if (onNode != null) // parentEnode.Properties[name] = onNode; // else // parentEnode.Properties.Remove(name); // return; // } // //Collection item // if (onNode != null && parentNode is IElementNode parentEnode2) // parentEnode2.CollectionItems[parentEnode2.CollectionItems.IndexOf(node)] = onNode; //} //INode GetOnNode(ElementNode onPlatform, string target) //{ // foreach (var onNode in onPlatform.CollectionItems) // { // if ((onNode as ElementNode).Properties.TryGetValue(new XmlName("", "Platform"), out var platform)) // { // var splits = ((platform as ValueNode).Value as string).Split(','); // foreach (var split in splits) // { // if (string.IsNullOrWhiteSpace(split)) // continue; // if (split.Trim() == target) // { // if ((onNode as ElementNode).Properties.TryGetValue(new XmlName("", "Value"), out var node)) // return node; // return (onNode as ElementNode).CollectionItems.FirstOrDefault(); // } // } // } // } // return null; //} //INode GetDefault(ElementNode onPlatform) //{ // if (node.Properties.TryGetValue(new XmlName("", "Default"), out INode defaultNode)) // return defaultNode; // return null; //} } public void Visit(RootNode node, INode parentNode) { } public void Visit(ListNode node, INode parentNode) { } } }