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