Rename Managed.Windows.Forms to System.Windows.Forms for consistency.
[mono.git] / mcs / class / System.Windows.Forms / Test / System.Windows.Forms / LogGenerator.cs
1 using System;\r
2 using System.Text;\r
3 using System.Reflection;\r
4 using System.Collections;\r
5 \r
6 namespace Logger\r
7 {\r
8         class LogGenerator\r
9         {\r
10                 [STAThread()]\r
11 #if INDEVENV\r
12                 static int Main2(string[] args)\r
13 #else\r
14                 static int Main(string[] args)\r
15 #endif\r
16                 {\r
17                         Type type = null;\r
18                         System.Text.StringBuilder code = new StringBuilder ();\r
19                         \r
20                         try {\r
21                                 //if (args.Length >= 1 && args [0].ToLower () == "all") {\r
22                                 //        if (args.Length == 1) {\r
23                                 //                GenerateAll ();\r
24                                 //                return 0;\r
25                                 //        } else if (args.Length == 2) {\r
26                                 //                GenerateAll (args [1], false);\r
27                                 //                return 0;\r
28                                 //        }\r
29                                 //}\r
30                                 \r
31                                 if (args.Length != 2 && args.Length != 3) {\r
32                                         Console.WriteLine("Must supply at least two arguments: ");\r
33                                         Console.WriteLine("\t Type to log ('all' to log all overrides and events for all types in System.Windows.Forms.dll)");\r
34                                         Console.WriteLine("\t What to log [overrides|events|overridesevents]");\r
35                                         Console.WriteLine("\t [output filename]");\r
36                                         return 1;\r
37                                 }\r
38                                 \r
39                                 Assembly a = typeof(System.Windows.Forms.Control).Assembly;\r
40                                 type = a.GetType (args [0]);\r
41                                 \r
42                                 if (type == null)\r
43                                         throw new Exception (String.Format("Type '{0}' not found.", args[0]));\r
44 \r
45                                 code.Append ("// Automatically generated for assembly: " + a.FullName + Environment.NewLine);\r
46                                 code.Append ("// To regenerate:" + Environment.NewLine);\r
47                                 code.Append ("// mcs -r:System.Windows.Forms.dll LogGenerator.cs && mono LogGenerator.exe " + type.FullName + " " + args [1] + " " + (args.Length > 2 ? args [2] : " outfile.cs") + Environment.NewLine);\r
48                                         \r
49                                 if (args[1] == "overrides" || args[1] == "overridesevents")\r
50                                 {\r
51                                         code.Append (override_logger.GenerateLog (type));\r
52                                 }\r
53                                 if (args[1] == "events" || args[1] == "overridesevents")\r
54                                 {\r
55                                         code.Append (event_logger.GenerateLog (type));\r
56                                 }\r
57 \r
58                                 if (args.Length > 2) {\r
59                                         using (System.IO.StreamWriter writer = new System.IO.StreamWriter(args[2], false))\r
60                                         {\r
61                                                 writer.Write(code);\r
62                                         }\r
63                                 } else {\r
64                                         Console.WriteLine(code);\r
65                                 }\r
66 \r
67                                 return 0;\r
68                         } catch (Exception ex) {\r
69                                 Console.WriteLine (ex.Message);\r
70                                 Console.WriteLine (ex.StackTrace);\r
71                                 return 1;\r
72                         }\r
73                 }\r
74         \r
75         }\r
76 \r
77         class override_logger\r
78         {\r
79                 public static string GenerateLog (Type type)\r
80                 {\r
81                         StringBuilder members = new StringBuilder ();\r
82 \r
83                         string code =\r
84 @"\r
85 #region {0}OverrideLogger\r
86 using System;\r
87 using System.Collections;\r
88 using System.Drawing;\r
89 using System.Windows.Forms;\r
90 using System.ComponentModel;\r
91 using System.Runtime.Remoting;\r
92 using System.Text;\r
93 \r
94 namespace MonoTests.System.Windows.Forms \r
95 {{\r
96         public class {0}OverrideLogger : {2}{0}\r
97         {{\r
98                 public StringBuilder Log = new StringBuilder ();\r
99                 void ShowLocation(string message)\r
100                 {{\r
101                         Log.Append (message + Environment.NewLine);\r
102                         //Console.WriteLine(DateTime.Now.ToLongTimeString() + "" {2}{0}."" + message);\r
103                 }}\r
104                 {1}\r
105         }}\r
106 #endregion\r
107 }}\r
108 ";\r
109 \r
110                         string method_impl =\r
111 @"\r
112                 {1} override {2} {0}({3})\r
113                 {{\r
114                         {4};\r
115                         {5};\r
116                 }}\r
117 ";\r
118 \r
119                         string property_impl =\r
120 @"\r
121                 {1} override {2} {0}\r
122                 {{{3}{4}}}\r
123 \r
124 ";\r
125 \r
126                         string get_impl =\r
127                                 @"\r
128                         get {{\r
129                                 {1};\r
130                                 return base.{0};\r
131                         }}\r
132 ";\r
133 \r
134                         string set_impl =\r
135                                 @"\r
136                         set {{\r
137                                 {1};\r
138                                 base.{0} = value;\r
139                         }}\r
140 ";\r
141 \r
142 \r
143                         foreach (MemberInfo member in type.GetMembers (BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance)) {\r
144                                 switch (member.MemberType) {\r
145                                 case MemberTypes.Constructor:\r
146                                 case MemberTypes.Event:\r
147                                 case MemberTypes.Field:\r
148                                 case MemberTypes.NestedType:\r
149                                 case MemberTypes.TypeInfo:\r
150                                 case MemberTypes.Custom:\r
151                                         continue;\r
152                                 case MemberTypes.Property:\r
153                                 case MemberTypes.Method:\r
154                                         break;\r
155                                 default:\r
156                                         continue;\r
157                                 }\r
158 \r
159                                 MethodInfo method = member as MethodInfo;\r
160                                 PropertyInfo property = member as PropertyInfo;\r
161                                 string returnType;\r
162                                 string access;\r
163                                 string parameters;\r
164                                 string message = "";\r
165                                 string membercode;\r
166                                 string basecall;\r
167 \r
168                                 if (method != null) {\r
169                                         if (!getData (method, out returnType, out access, out parameters, ref message, out basecall, false))\r
170                                                 continue;\r
171                                         membercode = string.Format (method_impl, method.Name, access, returnType, parameters, message, basecall);\r
172 \r
173                                 } else {\r
174                                         string getstr = "";\r
175                                         string setstr = "";\r
176 \r
177                                         MethodInfo get = (property.CanRead ? property.GetGetMethod () : null);\r
178 \r
179                                         if (get == null)\r
180                                                 continue;\r
181 \r
182                                         if (!getData (get, out returnType, out access, out parameters, ref message, out basecall, true))\r
183                                                 continue;\r
184 \r
185                                         getstr = string.Format (get_impl, property.Name, message);\r
186                                         setstr = string.Format (set_impl, property.Name, message);\r
187 \r
188                                         if (!property.CanRead)\r
189                                                 getstr = "";\r
190                                         if (!property.CanWrite)\r
191                                                 setstr = "";\r
192 \r
193                                         membercode = string.Format (property_impl, property.Name, access, returnType, getstr, setstr);\r
194                                 }\r
195 \r
196                                 members.Append (membercode + "\n");\r
197                         }\r
198                         code = String.Format (code, type.Name, members.ToString (), "");\r
199 \r
200                         return code;\r
201                 }\r
202 \r
203                 static bool getData (MethodInfo method, out string returnType, out string access, out string parameters, ref string message, out string basecall, bool allow_specialname)\r
204                 {\r
205                         returnType = "";\r
206                         access = "";\r
207                         parameters = "";\r
208                         message = "";\r
209                         basecall = "";\r
210 \r
211                         if (method.IsPrivate)\r
212                                 return false;\r
213                         if (method.IsAssembly)\r
214                                 return false;\r
215                                 \r
216                         if (!method.IsVirtual)\r
217                                 return false;\r
218                         if (method.IsFinal)\r
219                                 return false;\r
220                         if (method.IsSpecialName && !allow_specialname)\r
221                                 return false;\r
222                         //if (method.Name.StartsWith("get_"))\r
223                         //      return false;\r
224                         //if (method.Name.StartsWith("set_"))\r
225                         //      return false;\r
226 \r
227                         if (method.Name == "Finalize")\r
228                                 return false;\r
229                         if (method.Name == "GetLifetimeService")\r
230                                 return false;\r
231 \r
232                         returnType = method.ReturnType.FullName.Replace ("+", ".");\r
233                         returnType = method.ReturnType.Name;//.Replace ("+", ".");\r
234                         if (returnType == "Void")\r
235                                 returnType = "void";\r
236 \r
237                         if (method.IsPublic)\r
238                                 access = "public";\r
239                         else if (method.IsFamilyOrAssembly)\r
240                                 access = "protected";\r
241                         else if (method.IsFamily)\r
242                                 access = "protected";\r
243                         else\r
244                                 access = "?";\r
245 \r
246                         string msgParams = "";\r
247                         string baseParams = "";\r
248                         string formatParams = "";\r
249                         ParameterInfo [] ps = method.GetParameters ();\r
250                         parameters = "";\r
251                         for (int i = 0; i < ps.Length; i++) {\r
252                                 ParameterInfo param = ps [i];\r
253 \r
254                                 if (parameters != "") {\r
255                                         parameters += ", ";\r
256                                         msgParams += ", ";\r
257                                         formatParams += ", ";\r
258                                         baseParams += ", ";\r
259                                 }\r
260                                 \r
261                                 string parameterType;\r
262                                 \r
263                                 if (param.ParameterType.IsByRef) {\r
264                                         parameterType = param.ParameterType.GetElementType ().Name + " ";//sparam.ParameterType.FullName.Replace ("+", ".") + " ";\r
265                                         baseParams += "ref ";\r
266                                         parameters += "ref ";\r
267                                 } else {\r
268                                         parameterType = param.ParameterType.Name + " ";\r
269                                 }\r
270                                                                 \r
271                                 parameters += parameterType;\r
272 \r
273                                 string name;\r
274                                 if (param.Name != null && param.Name != "")\r
275                                         name = param.Name;\r
276                                 else\r
277                                         name = "parameter" + (i + 1).ToString ();\r
278 \r
279                                 parameters += param.Name + " ";\r
280                                 msgParams += param.Name;\r
281                                 baseParams += param.Name;\r
282                                 formatParams += param.Name + "=<{" + i.ToString () + "}>";\r
283                         }\r
284                         \r
285                         if (!method.IsAbstract) {\r
286                                 basecall = "base." + method.Name + "(" + baseParams + ");";\r
287                                 if (returnType != "void")\r
288                                         basecall = "return " + basecall;\r
289                         }\r
290                         if (msgParams != "")\r
291                                 msgParams = ", " + msgParams;\r
292                         message = "ShowLocation (string.Format(\"" + method.Name + " (" + formatParams + ") \"" + msgParams + "))";\r
293 \r
294                         return true;\r
295                 }\r
296         }\r
297 \r
298         class event_logger\r
299         {\r
300                 public static string GenerateLog (Type type)\r
301                 {\r
302                         StringBuilder adders = new StringBuilder ();\r
303                         StringBuilder handlers = new StringBuilder ();\r
304 \r
305                         string code =\r
306 @"\r
307 #region {0}EventLogger\r
308 using System;\r
309 using System.Reflection;\r
310 using System.Diagnostics;\r
311 \r
312 namespace MonoTests.System.Windows.Forms \r
313 {{\r
314         public class {0}EventLogger\r
315         {{\r
316                 private {3}{0} _obj;\r
317 \r
318                 public {0}EventLogger({3}{0} obj)\r
319                 {{\r
320                         _obj = obj;\r
321 {1}\r
322                 }}\r
323 \r
324                 void ShowLocation()\r
325                 {{\r
326                         MethodBase method = new StackFrame (1, true).GetMethod ();\r
327                         Console.WriteLine (DateTime.Now.ToLongTimeString () + "" {0}."" + method.Name.Replace (""_ctrl_"", """"));\r
328                 }}\r
329                 {2}\r
330         }}\r
331 }}\r
332 #endregion\r
333 ";\r
334 \r
335                         string method =\r
336 @"\r
337                 void _obj_{0} ({1} sender, {2} e)\r
338                 {{\r
339                         ShowLocation ();\r
340                 }}\r
341 ";\r
342 \r
343                         foreach (EventInfo ev in type.GetEvents ()) {\r
344                                 string handler;\r
345                                 string adder;\r
346 \r
347                                 ParameterInfo [] ps = ev.EventHandlerType.GetMethod ("Invoke").GetParameters ();\r
348                                 handler = string.Format (method, ev.Name, ps [0].ParameterType.Name, ps [1].ParameterType.Name);\r
349                                 adder = "\t\t_obj." + ev.Name + " += new " + ev.EventHandlerType.Name + " (_obj_" + ev.Name + ");";\r
350 \r
351                                 adders.Append (adder + Environment.NewLine);\r
352                                 handlers.Append (handler);\r
353                         }\r
354                         code = String.Format (code, type.Name, adders.ToString (), handlers.ToString (), "");//type.Namespace + ".");\r
355 \r
356                         return code;\r
357                 }\r
358 \r
359 \r
360         }\r
361 }\r