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