[NUI] Add Tizen.NUI.XamlBuild module
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI.XamlBuild / src / public / XamlBuild / TypeDefinitionExtensions.cs
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Reflection;
5 using Mono.Cecil;
6 using Mono.Cecil.Cil;
7 using MethodAttributes = Mono.Cecil.MethodAttributes;
8 using MethodImplAttributes = Mono.Cecil.MethodImplAttributes;
9
10 namespace Tizen.NUI.Xaml.Build.Tasks
11 {
12     static class TypeDefinitionExtensions
13     {
14         public static MethodDefinition AddDefaultConstructor(this TypeDefinition targetType)
15         {
16             var module = targetType.Module;
17             var parentType = module.ImportReference(("mscorlib", "System", "Object"));
18
19             return AddDefaultConstructor(targetType, parentType);
20         }
21
22         public static MethodDefinition AddDefaultConstructor(this TypeDefinition targetType, TypeReference parentType)
23         {
24             var module = targetType.Module;
25             var voidType = module.ImportReference(("mscorlib", "System", "Void"));
26             var methodAttributes = MethodAttributes.Public |
27                                    MethodAttributes.HideBySig |
28                                    MethodAttributes.SpecialName |
29                                    MethodAttributes.RTSpecialName;
30
31             var parentctor = module.ImportCtorReference(parentType, paramCount: 0) ?? module.ImportCtorReference(("mscorlib", "System", "Object"), parameterTypes: null);
32
33             var ctor = new MethodDefinition(".ctor", methodAttributes, voidType)
34             {
35                 CallingConvention = MethodCallingConvention.Default,
36                 ImplAttributes = (MethodImplAttributes.IL | MethodImplAttributes.Managed)
37             };
38             ctor.Body.InitLocals = true;
39
40             var IL = ctor.Body.GetILProcessor();
41
42             IL.Emit(OpCodes.Ldarg_0);
43             IL.Emit(OpCodes.Call, parentctor);
44             IL.Emit(OpCodes.Ret);
45
46             targetType.Methods.Add(ctor);
47             return ctor;
48         }
49
50         public static IEnumerable<MethodDefinition> AllMethods(this TypeDefinition self)
51         {
52             while (self != null)
53             {
54                 foreach (var md in self.Methods)
55                     yield return md;
56                 self = self.BaseType == null ? null : self.BaseType.ResolveCached();
57             }
58         }
59
60         public static FieldDefinition GetOrCreateField(this TypeDefinition self, string name, Mono.Cecil.FieldAttributes attributes, TypeReference fieldType)
61         {
62             var field = self.Fields.FirstOrDefault(a => a.Name == name);
63
64             if (null == field)
65             {
66                 field = new FieldDefinition(name, attributes, fieldType);
67                 self.Fields.Add(field);
68             }
69
70             return field;
71         }
72
73         public static MethodDefinition GetOrCreateMethod(this TypeDefinition self, string name, MethodAttributes attributes, Type type)
74         {
75             MethodDefinition method = self.Methods.FirstOrDefault(a => a.Name == name);
76             if (null == method)
77             {
78                 method = new MethodDefinition(name, MethodAttributes.Public, self.Module.ImportReference(type));
79                 self.Methods.Add(method);
80             }
81
82             return method;
83         }
84     }
85 }