2 using System.Collections;
8 namespace Tizen.NUI.Xaml.Build.Tasks
10 class SetResourcesVisitor : IXamlNodeVisitor
12 public SetResourcesVisitor(ILContext context)
15 Module = context.Body.Method.Module;
18 public ILContext Context { get; }
19 ModuleDefinition Module { get; }
20 public TreeVisitingMode VisitingMode => TreeVisitingMode.TopDown;
21 public bool StopOnDataTemplate => true;
22 public bool StopOnResourceDictionary => false;
23 public bool VisitNodeOnDataTemplate => false;
25 public void Visit(ValueNode node, INode parentNode)
27 if (!IsResourceDictionary((IElementNode)parentNode))
30 node.Accept(new SetPropertiesVisitor(Context, stopOnResourceDictionary: false), parentNode);
33 public void Visit(MarkupNode node, INode parentNode)
38 public void Visit(ElementNode node, INode parentNode)
41 //Set ResourcesDictionaries to their parents
42 if (IsResourceDictionary(node) && SetPropertiesVisitor.TryGetPropertyName(node, parentNode, out propertyName)) {
43 if ((propertyName.LocalName == "XamlResources" || propertyName.LocalName.EndsWith(".XamlResources", StringComparison.Ordinal))) {
44 Context.IL.Append(SetPropertiesVisitor.SetPropertyValue(Context.Variables[(IElementNode)parentNode], propertyName, node, Context, node));
49 //Only proceed further if the node is a keyless RD
50 if ( parentNode is IElementNode
51 && IsResourceDictionary((IElementNode)parentNode)
52 && !((IElementNode)parentNode).Properties.ContainsKey(XmlName.xKey))
53 node.Accept(new SetPropertiesVisitor(Context, stopOnResourceDictionary: false), parentNode);
54 else if ( parentNode is ListNode
55 && IsResourceDictionary((IElementNode)parentNode.Parent)
56 && !((IElementNode)parentNode.Parent).Properties.ContainsKey(XmlName.xKey))
57 node.Accept(new SetPropertiesVisitor(Context, stopOnResourceDictionary: false), parentNode);
60 public void Visit(RootNode node, INode parentNode)
64 public void Visit(ListNode node, INode parentNode)
68 public bool IsResourceDictionary(ElementNode node) => IsResourceDictionary((IElementNode)node);
70 bool IsResourceDictionary(IElementNode node)
72 var parentVar = Context.Variables[(IElementNode)node];
73 return parentVar.VariableType.FullName == "Tizen.NUI.Binding.ResourceDictionary"
74 || parentVar.VariableType.ResolveCached().BaseType?.FullName == "Tizen.NUI.Binding.ResourceDictionary";
77 public bool SkipChildren(INode node, INode parentNode)
79 var enode = node as ElementNode;
82 if ( parentNode is IElementNode
83 && IsResourceDictionary((IElementNode)parentNode)
84 && !((IElementNode)parentNode).Properties.ContainsKey(XmlName.xKey))
86 if ( parentNode is ListNode
87 && IsResourceDictionary((IElementNode)parentNode.Parent)
88 && !((IElementNode)parentNode.Parent).Properties.ContainsKey(XmlName.xKey))