New tests.
[mono.git] / mcs / tools / mdoc / Test / DocTest-v1.cs
1 using System;
2 using System.Collections;
3 using System.Collections.Generic;
4 using System.Linq;
5
6 public class NoNamespace {}
7
8 namespace System {
9         /* 
10          * The System namespace gets special treatment, e.g. instead of
11          * System.Environment C# declarations it's just Environment.
12          */
13         /// <remarks><c>T:System.Action`1</c></remarks>
14         public delegate void Action<T> (T obj);
15
16         /// <remarks><c>T:System.Environment</c></remarks>
17         public static class Environment {
18                 /// <remarks><c>T:System.Environment+SpecialFolder</c></remarks>
19                 public enum SpecialFolder {}
20
21                 /// <param name="folder">
22                 ///   A <see cref="T:System.Environment+SpecialFolder" /> instance.
23                 /// </param>
24                 /// <remarks>
25                 ///   <c>M:System.Environment.GetFolderPath(System.Environment+SpecialFolder)</c>
26                 /// </remarks>
27                 public static string GetFolderPath (SpecialFolder folder)
28                 {
29                         throw new NotSupportedException ();
30                 }
31         }
32
33         // to test ECMA doc importing...
34         public class Array {
35                 // the ECMA docs have a different return type than .NET -- skip.
36                 public static System.Collections.ObjectModel.ReadOnlyCollection<T> AsReadOnly<T> (T[] array)
37                 {
38                         throw new NotImplementedException ();
39                 }
40
41                 // ECMA docs use <T,U> instead of <TInput,TOutput> --> map them.
42                 public static TOutput[] ConvertAll<TInput, TOutput> (TInput[] array, Converter<TInput, TOutput> converter)
43                 {
44                         throw new InvalidOperationException ();
45                 }
46
47                 // ECMA docs *incorrectly* document parameter -- skip
48                 public static void Resize<T> (ref T[] array, int newSize)
49                 {
50                         throw new Exception ();
51                 }
52         }
53
54         // to test ECMA doc importing...
55         public delegate void AsyncCallback (IAsyncResult ar);
56 }
57
58 namespace Mono.DocTest {
59         internal class Internal {
60                 public class ShouldNotBeDocumented {
61                 }
62         }
63
64         internal class MonoTODOAttribute : Attribute {
65         }
66
67         /// <remarks>
68         ///  <para>
69         ///   cref=<c>T:Mono.DocTest.DocAttribute</c>.
70         ///  </para>
71         ///  <format type="text/html">
72         ///   <table width="100%">
73         ///     <tr>
74         ///       <td style="color:red">red</td>
75         ///       <td style="color:blue">blue</td>
76         ///       <td style="color:green">green</td>
77         ///     </tr>
78         ///   </table>
79         ///  </format>
80         ///  <code lang="C#" src="../DocTest.cs#DocAttribute Example" />
81         /// </remarks>
82         [AttributeUsage (AttributeTargets.All)]
83         public class DocAttribute : Attribute {
84                 #region DocAttribute Example
85                 [Doc ("documented class")]
86                 class Example {
87                         [Doc ("documented field")] public string field;
88                 }
89                 #endregion
90                 /// <remarks><c>C:Mono.DocTest.DocAttribute(System.String)</c></remarks>
91                 public DocAttribute (string docs)
92                 {
93                         if (docs == null)
94                                 throw new ArgumentNullException ("docs");
95                 }
96
97                 /// <remarks><c>P:Mono.DocTest.DocAttribute.Property</c></remarks>
98                 public Type Property { get; set; }
99
100                 /// <remarks><c>F:Mono.DocTest.DocAttribute.Field</c></remarks>
101                 public bool Field;
102
103                 /// <remarks><c>F:Mono.DocTest.DocAttribute.FlagsEnum</c></remarks>
104                 public ConsoleModifiers FlagsEnum;
105
106                 /// <remarks><c>F:Mono.DocTest.DocAttribute.NonFlagsEnum</c></remarks>
107                 public Color NonFlagsEnum;
108         }
109
110         /// <summary>Possible colors</summary>
111         /// <remarks><see cref="T:Mono.DocTest.Color"/>.</remarks>
112         [MonoTODO]
113         public enum Color {
114                 /// <summary>Insert Red summary here</summary>
115                 /// <remarks><c>F:Mono.DocTest.Color.Red</c>.</remarks>
116                 Red, 
117                 /// <summary>Insert Blue summary here</summary>
118                 /// <remarks><c>F:Mono.DocTest.Color.Blue</c>.</remarks>
119                 Blue, 
120                 /// <summary>Insert Green summary here</summary>
121                 /// <remarks><c>F:Mono.DocTest.Color.Green</c>.</remarks>
122                 Green,
123
124                 AnotherGreen = Green,
125         }
126
127         /// <summary>Process interface</summary>
128         /// <remarks><c>T:Mono.DocTest.IProcess</c>.</remarks>
129         public interface IProcess {}
130
131         /// <summary>Process interface</summary>
132         /// <remarks><c>T:Mono.DocTest.DocValueType</c>.</remarks>
133         public struct DocValueType : IProcess {
134                 /// <remarks><c>F:Mono.DocTest.DocValueType.total</c>.</remarks>
135                 public int total;
136
137                 /// <param name="i">A <see cref="T:System.Int32" />.</param>
138                 /// <remarks><see cref="M:Mono.DocTest.DocValueType.M(System.Int32)"/>.</remarks>
139                 public void M (int i)
140                 {
141                         if ((new Random().Next() % 2) == 0)
142                                 throw new SystemException ();
143                         throw new ApplicationException ();
144                 }
145         }
146
147         /// <remarks><c>T:Mono.DocTest.Widget</c>.</remarks>
148         /// <seealso cref="P:Mono.DocTest.Widget.Item(System.Int32)" />
149         /// <extra>Some extra tag value</extra>
150         public unsafe class Widget : IProcess {
151                 /// <remarks><c>T:Mono.DocTest.Widget.NestedClass</c>.</remarks>
152                 public class NestedClass {
153                         /// <remarks><c>F:Mono.DocTest.Widget.NestedClass.value</c>.</remarks>
154                         public int value;
155
156                         /// <param name="i">Some <see cref="T:System.Int32" />.</param>
157                         /// <remarks><c>M:Mono.DocTest.Widget.NestedClass.M(System.Int32)</c>.</remarks>
158                         public void M (int i) {}
159
160                         /// <remarks><c>T:Mono.DocTest.Widget.NestedClass.Double</c>.</remarks>
161                         public class Double {
162                                 /// <remarks><c>T:Mono.DocTest.Widget.NestedClass.Double.Triple</c>.</remarks>
163                                 public class Triple {
164                                         /// <remarks><c>T:Mono.DocTest.Widget.NestedClass.Double.Triple.Quadruple</c>.</remarks>
165                                         public class Quadruple {} // for good measure
166                                 }
167                         }
168                 }
169
170                 /// <remarks><c>T:Mono.DocTest.Widget.NestedClass`1</c>.</remarks>
171                 public class NestedClass<T> {
172                         /// <remarks><c>F:Mono.DocTest.Widget.NestedClass`1.value</c>.</remarks>
173                         public int value;
174
175                         /// <param name="i">Another <see cref="T:System.Int32" />.</param>
176                         /// <remarks><c>M:Mono.DocTest.Widget.NestedClass`1.M(System.Int32)</c>.</remarks>
177                         public void M (int i) {}
178                 }
179
180                 /// <remarks><c>F:Mono.DocTest.Widget.classCtorError</c>.</remarks>
181                 public static readonly string[] classCtorError = CreateArray ();
182
183                 private static string[] CreateArray ()
184                 {
185                         throw new NotSupportedException ();
186                 }
187
188                 /// <remarks><c>F:Mono.DocTest.Widget.message</c>.</remarks>
189                 public string message;
190
191                 /// <remarks><c>F:Mono.DocTest.Widget.defaultColor</c>.</remarks>
192                 protected static Color defaultColor;
193
194                 /// <remarks><c>F:Mono.DocTest.Widget.PI</c>.</remarks>
195                 protected internal const double PI = 3.14159;
196
197                 /// <remarks><c>F:Mono.DocTest.Widget.monthlyAverage</c>.</remarks>
198                 internal protected readonly double monthlyAverage;
199
200                 /// <remarks><c>F:Mono.DocTest.Widget.array1</c>.</remarks>
201                 public long[] array1;
202
203                 /// <remarks><c>F:Mono.DocTest.Widget.array2</c>.</remarks>
204                 public Widget[,] array2;
205
206                 /// <remarks><c>F:Mono.DocTest.Widget.pCount</c>.</remarks>
207                 public unsafe int *pCount;
208
209                 /// <remarks><c>F:Mono.DocTest.Widget.ppValues</c>.</remarks>
210                 public unsafe float **ppValues;
211
212                 /// <remarks><c>T:Mono.DocTest.Widget.IMenuItem</c>.</remarks>
213                 public interface IMenuItem {
214                         /// <remarks><c>M:Mono.DocTest.Widget.IMenuItem.A</c>.</remarks>
215                         void A ();
216
217                         /// <remarks><c>P:Mono.DocTest.Widget.IMenuItem.P</c>.</remarks>
218                         int B {get; set;}
219                 }
220
221                 /// <remarks><c>T:Mono.DocTest.Widget.Del</c>.</remarks>
222                 public delegate void Del (int i);
223
224                 /// <remarks><c>T:Mono.DocTest.Widget.Direction</c>.</remarks>
225                 [Flags]
226                 public enum Direction {
227                         /// <remarks><c>T:Mono.DocTest.Widget.Direction.North</c>.</remarks>
228                         North,
229                         /// <remarks><c>T:Mono.DocTest.Widget.Direction.South</c>.</remarks>
230                         South,
231                         /// <remarks><c>T:Mono.DocTest.Widget.Direction.East</c>.</remarks>
232                         East,
233                         /// <remarks><c>T:Mono.DocTest.Widget.Direction.West</c>.</remarks>
234                         West,
235                 }
236
237                 /// <remarks>
238                 ///  <para><c>C:Mono.DocTest.Widget</c>.</para>
239                 ///  <para><c>M:Mono.DocTest.Widget.#ctor</c>.</para>
240                 ///  <para><see cref="C:Mono.DocTest.Widget(System.String)" /></para>
241                 ///  <para><see cref="C:Mono.DocTest.Widget(System.Converter{System.String,System.String})" /></para>
242                 /// </remarks>
243                 public Widget () {}
244
245                 /// <param name="s">A <see cref="T:System.String" />.</param>
246                 /// <remarks>
247                 ///  <para><c>C:Mono.DocTest.Widget(System.String)</c>.</para>
248                 ///  <para><c>M:Mono.DocTest.Widget.#ctor(System.String)</c>.</para>
249                 /// </remarks>
250                 public Widget (string s) {}
251
252                 /// <param name="c">A <see cref="T:System.Converter{System.String,System.String}" />.</param>
253                 /// <remarks>
254                 ///  <para><c>C:Mono.DocTest.Widget(System.Converter{System.String,System.String})</c>.</para>
255                 /// </remarks>
256                 public Widget (Converter<string,string> c) {}
257
258                 /// <remarks><c>M:Mono.DocTest.Widget.M0</c>.</remarks>
259                 public static void M0 () {}
260
261                 /// <param name="c">A <see cref="T:System.Char" />.</param>
262                 /// <param name="f">A <see cref="T:System.Single" />.</param>
263                 /// <param name="v">A <see cref="T:Mono.DocTest.DocValueType" />.</param>
264                 /// <remarks><c>M:Mono.DocTest.Widget.M1(System.Char,System.Signle@,Mono.DocTest.DocValueType@)</c>.</remarks>
265                 [return:Doc ("return:DocAttribute", Property=typeof(Widget))]
266                 [Doc("normal DocAttribute", Field=true)]
267                 public void M1 ([Doc ("c", FlagsEnum=ConsoleModifiers.Alt | ConsoleModifiers.Control)] char c, 
268                                 [Doc ("f", NonFlagsEnum=Color.Red)] out float f, 
269                                 [Doc ("v")] ref DocValueType v) {f=0;}
270
271                 /// <param name="x1">A <see cref="T:System.Int16" /> array.</param>
272                 /// <param name="x2">A <see cref="T:System.Int32" /> array.</param>
273                 /// <param name="x3">A <see cref="T:System.Int64" /> array.</param>
274                 /// <remarks><c>M:Mono.DocTest.Widget.M2(System.Int16[],System.Int32[0:,0:],System.Int64[][])</c>.</remarks>
275                 public void M2 (short[] x1, int[,] x2, long[][] x3) {}
276
277                 /// <param name="x3">Another <see cref="T:System.Int64" /> array.</param>
278                 /// <param name="x4">A <see cref="T:Mono.DocTest.Widget" /> array.</param>
279                 /// <remarks><c>M:Mono.DocTest.Widget.M3(System.Int64[][],Mono.DocTest.Widget[0:,0:,0:][])</c>.</remarks>
280                 protected void M3 (long[][] x3, Widget[][,,] x4) {}
281
282                 /// <param name="pc">A <see cref="T:System.Char" /> pointer.</param>
283                 /// <param name="ppf">A <see cref="T:Mono.DocTest.Color" /> pointer.</param>
284                 /// <remarks><c>M:Mono.DocTest.Widget.M4(System.Char*,Mono.DocTest.Color**)</c>.</remarks>
285                 protected unsafe void M4 (char *pc, Color **ppf) {}
286
287                 /// <param name="pv">A <see cref="T:System.Void" /> pointer.</param>
288                 /// <param name="pd">A <see cref="T:System.Double" /> array.</param>
289                 /// <remarks><c>M:Mono.DocTest.Widget.M5(System.Void*,System.Double*[0:,0:][])</c>.</remarks>
290                 protected unsafe void M5 (void *pv, double *[][,] pd) {}
291
292                 /// <param name="i">Yet another <see cref="T:System.Int32" />.</param>
293                 /// <param name="args">An <see cref="T:System.Object" /> array.</param>
294                 /// <remarks><c>M:Mono.DocTest.Widget.M6(System.Int32,System.Object[])</c>.</remarks>
295                 protected void M6 (int i, params object[] args) {}
296
297                 /// <remarks><c>M:Mono.DocTest.Widget.M7(Mono.DocTest.Widget.NestedClass.Double.Triple.Quadruple)</c>.</remarks>
298                 public void M7(Widget.NestedClass.Double.Triple.Quadruple a) {}
299
300                 /// <value>A <see cref="T:System.Int32" /> value...</value>
301                 /// <remarks><c>P:Mono.DocTest.Widget.Width</c>.</remarks>
302                 [Doc ("Width property")]
303                 public int Width {
304                         [Doc ("Width get accessor")]
305                         get {return 0;}
306                         [Doc ("Width set accessor")]
307                         protected set {}
308                 }
309
310                 /// <value>A <see cref="T:System.Int64" /> value...</value>
311                 /// <remarks><c>P:Mono.DocTest.Widget.Height</c>.</remarks>
312                 [Doc ("Height property")]
313                 protected long Height {get {return 0;}}
314
315                 /// <value>A <see cref="T:System.Int16" /> value...</value>
316                 /// <remarks><c>P:Mono.DocTest.Widget.X</c>.</remarks>
317                 protected internal short X {set {}}
318
319                 /// <value>A <see cref="T:System.Double" /> value...</value>
320                 /// <remarks><c>P:Mono.DocTest.Widget.Y</c>.</remarks>
321                 internal protected double Y {get {return 0;} set {}}
322
323
324                 /// <param name="i">TODO</param>
325                 /// <remarks><c>P:Mono.DocTest.Widget.Item(System.Int32)</c>.</remarks>
326                 /// <value>A <see cref="T:System.Int32" /> instance.</value>
327                 [Doc ("Item property")]
328                 public int this [int i] {
329                         get {return 0;}
330                         [Doc ("Item property set accessor")]
331                         set {}
332                 }
333
334                 /// <param name="s">Some <see cref="T:System.String" />.</param>
335                 /// <param name="i">I love <see cref="T:System.Int32" />s.</param>
336                 /// <remarks><c>P:Mono.DocTest.Widget.Item(System.String,System.Int32)</c>.</remarks>
337                 /// <value>A <see cref="T:System.Int32" /> instance.</value>
338                 public int this [string s, int i] {get {return 0;} set {}}
339
340                 /// <remarks><c>E:Mono.DocTest.Widget.AnEvent</c>.</remarks>
341                 [Doc ("Del event")]
342                 public event Del AnEvent {
343                         [Doc ("Del add accessor")]
344                         add {}
345                         [Doc ("Del remove accessor")]
346                         remove {}
347                 }
348
349                 /// <remarks><c>E:Mono.DocTest.Widget.AnotherEvent</c>.</remarks>
350                 protected event Del AnotherEvent;
351
352                 /// <param name="x">Another <see cref="T:Mono.DocTest.Widget" />.</param>
353                 /// <remarks><c>M:Mono.DocTest.Widget.op_UnaryPlus(Mono.DocTest.Widget)</c>.</remarks>
354                 /// <returns>A <see cref="T:Mono.DocTest.Widget" /> instance.</returns>
355                 public static Widget operator+ (Widget x) {return null;}
356
357                 /// <param name="x1">Yet Another <see cref="T:Mono.DocTest.Widget" />.</param>
358                 /// <param name="x2">Yay, <see cref="T:Mono.DocTest.Widget" />s.</param>
359                 /// <remarks><c>M:Mono.DocTest.Widget.op_Addition(Mono.DocTest.Widget,Mono.DocTest.Widget)</c>.</remarks>
360                 /// <returns>A <see cref="T:Mono.DocTest.Widget" /> instance (2).</returns>
361                 public static Widget operator+ (Widget x1, Widget x2) {return null;}
362
363                 /// <param name="x"><see cref="T:Mono.DocTest.Widget" />s are fun!.</param>
364                 /// <remarks><c>M:Mono.DocTest.Widget.op_Explicit(Mono.DocTest.Widget)~System.Int32</c>.</remarks>
365                 /// <returns>A <see cref="T:System.Int32" /> instance.</returns>
366                 public static explicit operator int (Widget x) {return 0;}
367
368                 /// <param name="x"><c>foo</c>; <see cref="T:Mono.DocTest.Widget" />.</param>
369                 /// <remarks><c>M:Mono.DocTest.Widget.op_Implicit(Mono.DocTest.Widget)~System.Int64</c>.</remarks>
370                 /// <returns>A <see cref="T:System.Int64" /> instance.</returns>
371                 public static implicit operator long (Widget x) {return 0;}
372         }
373
374         /// <remarks><c>T:Mono.DocTest.UseLists</c>.</remarks>
375         public class UseLists
376         {
377                 /// <param name="list">A <see cref="T:Mono.DocTest.Generic.MyList{System.Int32}" />.</param>
378                 /// <remarks><c>M:Mono.DocTest.UseLists.Process(Mono.DocTest.MyList{System.Int32})</c>.</remarks>
379                 public void Process (Generic.MyList<int> list) {}
380
381                 /// <param name="value">A <c>T</c>.</param>
382                 /// <typeparam name="T">Something</typeparam>
383                 /// <remarks><c>M:Mono.DocTest.UseLists.GetValues``1(``0)</c>.</remarks>
384                 /// <returns>A <see cref="T:Mono.DocTest.Generic.MyList`1" /> instance.</returns>
385                 public Generic.MyList<T> GetValues <T> (T value) where T : struct {return null;}
386
387                 /// <param name="list">Another <see cref="T:Mono.DocTest.Generic.MyList{System.Int32}" />.</param>
388                 /// <remarks>
389                 ///  <para><c>M:Mono.DocTest.UseLists.Process(System.Collections.Generic.List{System.Int32})</c>.</para>
390                 /// <para><see cref="M:System.Collections.Generic.List{System.Int32}.Remove(`0)" /></para>
391                 /// </remarks>
392                 /// <exception invalid="foo">text!</exception>
393                 public void Process (List<int> list)
394                 {
395                         // Bug: only creation is looked for, so this generates an <exception/>
396                         // node:
397                         new Exception ();
398
399                         // Bug? We only look at "static" types, so we can't follow
400                         // delegates/interface calls:
401                         Func<int, int> a = x => {throw new InvalidOperationException ();};
402                         a (1);
403
404                         // Multi-dimensional arrays have "phantom" methods that Cecil can't
405                         // resolve, as they're provided by the runtime.  These should be
406                         // ignored.
407                         int[,] array = new int[1,1];
408                         array[0,0] = 42;
409                 }
410
411                 /// <param name="list">A <see cref="T:Mono.DocTest.Generic.MyList{System.Predicate{System.Int32}}" />.</param>
412                 /// <remarks><c>M:Mono.DocTest.UseLists.Process(System.Collections.Generic.List{System.Predicate{System.Int32}})</c>.</remarks>
413                 public void Process (List<Predicate<int>> list)
414                 {
415                         if (list == null)
416                                 throw new ArgumentNullException ("list");
417                         Process<int> (list);
418                 }
419
420                 /// <param name="list">A <see cref="T:Mono.DocTest.Generic.MyList{System.Predicate{``0}}" />.</param>
421                 /// <typeparam name="T">Something Else</typeparam>
422                 /// <remarks><c>M:Mono.DocTest.UseLists.Process``1(System.Collections.Generic.List{System.Predicate{``0}})</c>.</remarks>
423                 public void Process<T> (List<Predicate<T>> list)
424                 {
425                         if (list.Any (p => p == null))
426                                 throw new ArgumentException ("predicate null");
427                 }
428
429                 /// <param name="helper">A <see cref="T:Mono.DocTest.Generic.MyList{``0}.Helper{``1,``2}" />.</param>
430                 /// <typeparam name="T"><c>T</c></typeparam>
431                 /// <typeparam name="U"><c>U</c></typeparam>
432                 /// <typeparam name="V"><c>V</c></typeparam>
433                 /// <remarks><c>M:Mono.DocTest.UseLists.UseHelper``3(Mono.DocTest.Generic.MyList{``0}.Helper{``1,``2})</c>.</remarks>
434                 public void UseHelper<T,U,V> (Generic.MyList<T>.Helper<U,V> helper) {}
435         }
436 }
437
438 namespace Mono.DocTest.Generic {
439         // Need to place this into a separate namespace to work around gmcs bug
440         // where XML docs for type *following* this one aren't extracted.
441
442         /// <typeparam name="TArg">argument type, with attributes!</typeparam>
443         /// <typeparam name="TRet">return type, with attributes!</typeparam>
444         /// <remarks><c>T:Mono.DocTest.Generic.Func`2</c>.</remarks>
445         [Doc ("method")]
446         [return:Doc ("return", Field=false)]
447         public delegate TRet Func<[Doc ("arg!")] TArg, [Doc ("ret!")] TRet> (
448                         [Doc ("arg-actual")] TArg a
449         ) where TArg : Exception;
450 }
451
452 namespace Mono.DocTest.Generic {
453         using Mono.DocTest;
454
455         /// <summary>extension methods!</summary>
456         /// <remarks><c>T:Mono.DocTest.Generic.Extensions</c></remarks>
457         public static class Extensions {
458                 /// <summary><c>System.Object</c> extension method</summary>
459                 /// <remarks><c>M:Mono.DocTest.Generic.Extensions.ToEnumerable``1</c></remarks>
460                 public static IEnumerable<T> ToEnumerable<T> (this T self)
461                 {
462                         yield return self;
463                 }
464
465                 /// <summary><see cref="T:System.Collections.Generic.IEnumerable`1" /> extension method</summary>
466                 /// <remarks><c>M:Mono.DocTest.Generic.Extensions.ForEach``1</c></remarks>
467                 public static void ForEach<T> (this IEnumerable<T> self, Action<T> a)
468                 {
469                 }
470
471                 /// <summary><see cref="T:Mono.DocTest.Generic.IFoo`1" /> extension method</summary>
472                 /// <remarks><c>M:Mono.DocTest.Generic.Extensions.Bar``1</c></remarks>
473                 public static void Bar <T> (this IFoo<T> self, string s)
474                 {
475                 }
476
477                 /// <summary>
478                 ///   <see cref="T:System.Collections.Generic.IEnumerable{System.Int32}" /> 
479                 ///   extension method.
480                 /// </summary>
481                 /// <remarks><c>M:Mono.DocTest.Generic.Extensions.ToDouble</c></remarks>
482                 public static IEnumerable<double> ToDouble (this IEnumerable<int> list)
483                 {
484                         return null;
485                 }
486
487                 /// <summary>
488                 ///   <see cref="T:Mono.DocTest.Generic.IFoo`1" /> extension method.
489                 /// </summary>
490                 /// <remarks><c>M:Mono.DocTest.Generic.Extensions.ToDouble</c></remarks>
491                 public static double ToDouble<T> (this T val) where T : IFoo<T>
492                 {
493                         // the target type is T:...IFoo<T>, NOT T:System.Object.
494                         return 0.0;
495                 }
496         }
497
498         /// <typeparam name="U">Insert <c>text</c> here.</typeparam>
499         /// <remarks><c>T:Mono.DocTest.Generic.GenericBase`1</c>.</remarks>
500         public class GenericBase<U> {
501         
502                 /// <param name="genericParameter">Something</param>
503                 /// <typeparam name="S">Insert more <c>text</c> here.</typeparam>
504                 /// <remarks><c>M:Mono.DocTest.GenericBase`1.BaseMethod``1(``0)</c>.</remarks>
505                 /// <returns>The default value.</returns>
506                 public U BaseMethod<[Doc ("S")] S> (S genericParameter) {
507                         return default(U);
508                 }
509
510                 /// <remarks><c>F:Mono.DocTest.GenericBase`1.StaticField1</c></remarks>
511                 public static readonly GenericBase<U> StaticField1 = new GenericBase<U> ();
512
513                 /// <remarks><c>F:Mono.DocTest.GenericBase`1.ConstField1</c></remarks>
514                 public const int ConstField1 = 1;
515
516                 /// <param name="list">Insert description here</param>
517                 /// <remarks><c>M:Mono.DocTest.GenericBase`1.op_Explicit(Mono.DocTest.GenericBase{`0})~`0</c></remarks>
518                 /// <returns>The default value for <typeparamref name="U"/>.</returns>
519                 public static explicit operator U (GenericBase<U> list) {return default(U);}
520
521                 /// <remarks>T:Mono.DocTest.Generic.GenericBase`1.FooEventArgs</remarks>
522                 public class FooEventArgs : EventArgs {
523                 }
524
525                 /// <remarks>E:Mono.DocTest.Generic.GenericBase`1.MyEvent</remarks>
526                 public event EventHandler<FooEventArgs> MyEvent;
527
528                 /// <remarks>T:Mono.DocTest.Generic.GenericBase`1.NestedCollection</remarks>
529                 public class NestedCollection {
530                         /// <remarks>T:Mono.DocTest.Generic.GenericBase`1.NestedCollection.Enumerator</remarks>
531                         public struct Enumerator {
532                         }
533                 }
534         }
535         
536         /// <typeparam name="T">I'm Dying Here!</typeparam>
537         /// <remarks><c>T:Mono.DocTest.Generic.MyList`1</c>.</remarks>
538         public class MyList<[Mono.DocTest.Doc("Type Parameter!")] T> : GenericBase <T>, IEnumerable<int[]>
539         {
540                 /// <typeparam name="U">Seriously!</typeparam>
541                 /// <typeparam name="V">Too <c>many</c> docs!</typeparam>
542                 /// <remarks><c>T:Mono.DocTest.MyList`1.Helper`2</c>.</remarks>
543                 public class Helper <U, V> {
544                         /// <param name="a">Ako</param>
545                         /// <param name="b">bko</param>
546                         /// <param name="c">cko</param>
547                         /// <remarks><c>M:Mono.DocTest.MyList`1.Helper`2.UseT(`0,`1,`2)</c>.</remarks>
548                         public void UseT(T a, U b, V c) { }
549                 }
550
551                 /// <param name="t">tko</param>
552                 /// <remarks><c>M:Mono.DocTest.MyList`1.Test(`0)</c>.</remarks>
553                 public void Test (T t) {}
554
555                 /// <param name="t">Class generic type</param>
556                 /// <param name="u">Method generic type</param>
557                 /// <typeparam name="U">Method generic parameter</typeparam>
558                 /// <remarks><c>M:Mono.DocTest.MyList`1.Method``1(`0,``0)</c>.</remarks>
559                 public void Method <U> (T t, U u) {}
560
561                 // mcs "crashes" (CS1569) on this method; exclude it for now.
562                 // <remarks><c>M:Mono.DocTest.MyList`1.RefMethod``1(`0@,``0@)</c>.</remarks>
563                 public void RefMethod<U> (ref T t, ref U u) {}
564
565                 /// <param name="helper">A <see cref="T:Mono.DocTest.Generic.MyList`1.Helper`2" />.</param>
566                 /// <typeparam name="U">Argh!</typeparam>
567                 /// <typeparam name="V">Foo Argh!</typeparam>
568                 /// <remarks><c>M:Mono.DocTest.Generic.MyList`1.UseHelper``2(Mono.DocTest.Generic.MyList{``0}.Helper{``1,``2})</c>.</remarks>
569                 public void UseHelper<U,V> (Helper<U,V> helper) {}
570
571                 /// <remarks><c>M:Mono.DocTest.Generic.MyList`1.GetHelper``2</c>.</remarks>
572                 /// <returns><see langword="null" />.</returns>
573                 public Helper<U,V> GetHelper<U,V> () {return null;}
574
575                 /// <remarks><c>M:Mono.DocTest.MyList`1.System#Collections#GetEnumerator</c>.</remarks>
576                 IEnumerator IEnumerable.GetEnumerator () {return null;}
577
578                 /// <remarks><c>M:Mono.DocTest.MyList`1.GetEnumerator</c>.</remarks>
579                 public IEnumerator<int[]> GetEnumerator () {return null;}
580         }
581
582         /// <typeparam name="T">T generic param</typeparam>
583         /// <remarks><c>T:Mono.DocTest.IFoo`1</c>.</remarks>
584         public interface IFoo<T> {
585                 /// <typeparam name="U">U generic param</typeparam>
586                 /// <remarks><c>T:Mono.DocTest.IFoo`1.Method``1(`0,``0)</c>.</remarks>
587                 T Method <U> (T t, U u);
588         }
589
590         /// <typeparam name="A">Ako generic param</typeparam>
591         /// <typeparam name="B">Bko generic param</typeparam>
592         /// <remarks><c>T:Mono.DocTest.MyList`2</c>.</remarks>
593         public class MyList<A,B> : GenericBase<Dictionary<A,B>>, IEnumerable<A>, 
594                                  IEnumerator<A>, ICollection<A>, IFoo<A>
595                 where A : class, IList<B>, new()
596                 where B : class, A
597         {
598                 // IEnumerator
599
600                 // shown?
601                 object IEnumerator.Current {get {return null;}}
602
603                 /// <remarks><c>M:Mono.DocTest.MyList`2.MoveNext</c>.</remarks>
604                 /// <returns><see cref="T:System.Boolean" /></returns>
605                 public bool MoveNext () {return false;}
606
607                 /// <remarks><c>M:Mono.DocTest.MyList`2.Reset</c>.</remarks>
608                 public void Reset () {}
609
610                 // IDisposable
611                 /// <remarks><c>M:Mono.DocTest.MyList`2.Dispose</c>.</remarks>
612                 public void Dispose () {}
613
614                 // IEnumerator<T>
615                 /// <remarks><c>P:Mono.DocTest.MyList`2.Current</c>.</remarks>
616                 /// <value>The current value.</value>
617                 public A Current {get {return default(A);}}
618                 /// <remarks><c>P:Mono.DocTest.MyList`2.Current</c>.</remarks>
619                 /// <value>The current value.</value>
620                 A IEnumerator<A>.Current {get {return default(A);}}
621
622                 // IEnumerable
623                 /// <remarks><c>M:Mono.DocTest.MyList`2.System#Collections#GetEnumerator</c>.</remarks>
624                 IEnumerator IEnumerable.GetEnumerator () {return this;}
625
626                 // IEnumerable<T>
627                 /// <remarks><c>M:Mono.DocTest.MyList`2.System#Collections#Generic#IEnumerable{A}#GetEnumerator</c>.</remarks>
628                 /// <returns>A <see cref="T:System.Collections.Generic.IEnumerator{`0}" />.</returns>
629                 IEnumerator<A> IEnumerable<A>.GetEnumerator () {return this;}
630                 /// <remarks><c>M:Mono.DocTest.MyList`2.GetEnumerator</c>.</remarks>
631                 /// <returns>A <see cref="T:System.Collections.Generic.List{`0}.Enumerator" />.</returns>
632                 public List<A>.Enumerator GetEnumerator () {return new List<A>.Enumerator ();}
633
634                 // ICollection<T>
635                 /// <remarks><c>P:Mono.DocTest.MyList`2.Count</c>.</remarks>
636                 /// <value>A <see cref="T:System.Int32" />.</value>
637                 public int Count {get {return 0;}}
638                 /// <remarks><c>P:Mono.DocTest.MyList`2.System#Collections#Generic#ICollection{A}#IsReadOnly</c>.</remarks>
639                 /// <value>A <see cref="T:System.Boolean" />.</value>
640                 bool ICollection<A>.IsReadOnly {get {return false;}}
641                 /// <param name="item">The item to add.</param>
642                 /// <remarks><c>M:Mono.DocTest.MyList`2.System#Collections#Generic#ICollection{A}#Add(`0)</c>.</remarks>
643                 void ICollection<A>.Add (A item) {}
644                 /// <remarks><c>M:Mono.DocTest.MyList`2.System#Collections#Generic#ICollection{A}#Clear</c>.</remarks>
645                 void ICollection<A>.Clear () {}
646                 /// <param name="item">The item to check for</param>
647                 /// <remarks><c>M:Mono.DocTest.MyList`2.System#Collections#Generic#ICollection{A}.Contains(`0)</c>.</remarks>
648                 /// <returns>A <see cref="T:System.Boolean" /> instance (<see langword="false" />).</returns>
649                 bool ICollection<A>.Contains (A item) {return false;}
650                 /// <param name="array">Where to copy elements to</param>
651                 /// <param name="arrayIndex">Where to start copyingto</param>
652                 /// <remarks><c>M:Mono.DocTest.MyList`2.CopyTo(`0[],System.Int32)</c>.</remarks>
653                 public void CopyTo (A[] array, int arrayIndex) {}
654                 /// <param name="item">the item to remove</param>
655                 /// <remarks><c>M:Mono.DocTest.MyList`2.System#Collections#Generic#ICollection{A}#Remove(`0)</c>.</remarks>
656                 /// <returns>Whether the item was removed.</returns>
657                 bool ICollection<A>.Remove (A item) {return false;}
658
659                 /// <remarks>M:Mono.DocTest.Generic.MyList`2.Foo</remarks>
660                 public KeyValuePair<IEnumerable<A>, IEnumerable<B>> Foo ()
661                 {
662                         return new KeyValuePair<IEnumerable<A>, IEnumerable<B>> ();
663                 }
664
665                 // IFoo members
666                 /// <typeparam name="U">U generic param on MyList`2</typeparam>
667                 /// <remarks><c>M:Mono.DocTest.Generic.MyList`2.Mono#DocTest#Generic#IFoo{A}#Method``1(`0,``0)</c>.</remarks>
668                 A IFoo<A>.Method <U> (A a, U u)
669                 {
670                         return default (A);
671                 }
672         }
673 }
674