[NUI] Add Tizen.NUI.XamlBuild module
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI.XamlBuild / src / public / XamlBuild / SetResourcesVisitor.cs
1 using System;
2 using System.Collections;
3 using System.Linq;
4 using Mono.Cecil;
5 using Mono.Cecil.Cil;
6 using Tizen.NUI.Xaml;
7
8 namespace Tizen.NUI.Xaml.Build.Tasks
9 {
10     class SetResourcesVisitor : IXamlNodeVisitor
11     {
12         public SetResourcesVisitor(ILContext context)
13         {
14             Context = context;
15             Module = context.Body.Method.Module;
16         }
17
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;
24
25         public void Visit(ValueNode node, INode parentNode)
26         {
27             if (!IsResourceDictionary((IElementNode)parentNode))
28                 return;
29
30             node.Accept(new SetPropertiesVisitor(Context, stopOnResourceDictionary: false), parentNode);
31         }
32
33         public void Visit(MarkupNode node, INode parentNode)
34         {
35         }
36
37
38         public void Visit(ElementNode node, INode parentNode)
39         {
40             XmlName propertyName;
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));
45                     return;
46                 }
47             }
48
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);
58         }
59
60         public void Visit(RootNode node, INode parentNode)
61         {
62         }
63
64         public void Visit(ListNode node, INode parentNode)
65         {
66         }
67
68         public bool IsResourceDictionary(ElementNode node) => IsResourceDictionary((IElementNode)node);
69
70         bool IsResourceDictionary(IElementNode node)
71         {
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";
75         }
76
77         public bool SkipChildren(INode node, INode parentNode)
78         {
79             var enode = node as ElementNode;
80             if (enode == null)
81                 return false;
82             if (   parentNode is IElementNode
83                 && IsResourceDictionary((IElementNode)parentNode)
84                 && !((IElementNode)parentNode).Properties.ContainsKey(XmlName.xKey))
85                 return true;
86             if (   parentNode is ListNode
87                 && IsResourceDictionary((IElementNode)parentNode.Parent)
88                 && !((IElementNode)parentNode.Parent).Properties.ContainsKey(XmlName.xKey))
89                 return true;
90             return false;
91         }
92     }
93 }