class Foo<T> : Bar<IList<Bar>, T>, IBar<Bar, T>, IFoo
	where T : class, IBar<IFoo>, IFoo<Bar> {}

public class Foo : IBar<int> {}

public delegate ErrorCode GetInfoMethod<H, A, I>(H handle, A value, I paramName,
	Size_t paramValueSize, IntPtr paramValue, out Size_t paramValueSizeRet)
	where H : unmanaged, IInfoHandle<A, I> where A : unmanaged where I : unmanaged, Enum;

----------------------------------------------------

[
	["keyword", "class"],
	["class-name", [
		"Foo",
		["punctuation", "<"],
		"T",
		["punctuation", ">"]
	]],
	["punctuation", ":"],
	["type-list", [
		["class-name", [
			"Bar",
			["punctuation", "<"],
			"IList",
			["punctuation", "<"],
			"Bar",
			["punctuation", ">"],
			["punctuation", ","],
			" T",
			["punctuation", ">"]
		]],
		["punctuation", ","],
		["class-name", [
			"IBar",
			["punctuation", "<"],
			"Bar",
			["punctuation", ","],
			" T",
			["punctuation", ">"]
		]],
		["punctuation", ","],
		["class-name", [
			"IFoo"
		]]
	]],
	["keyword", "where"],
	["class-name", "T"],
	["punctuation", ":"],
	["type-list", [
		["keyword", "class"],
		["punctuation", ","],
		["class-name", [
			"IBar",
			["punctuation", "<"],
			"IFoo",
			["punctuation", ">"]
		]],
		["punctuation", ","],
		["class-name", [
			"IFoo",
			["punctuation", "<"],
			"Bar",
			["punctuation", ">"]
		]]
	]],
	["punctuation", "{"],
	["punctuation", "}"],

	["keyword", "public"],
	["keyword", "class"],
	["class-name", [
		"Foo"
	]],
	["punctuation", ":"],
	["type-list", [
		["class-name", [
			"IBar",
			["punctuation", "<"],
			["keyword", "int"],
			["punctuation", ">"]
		]]
	]],
	["punctuation", "{"],
	["punctuation", "}"],

	["keyword", "public"],
	["keyword", "delegate"],
	["return-type", [
		"ErrorCode"
	]],
	["generic-method", [
		["function", "GetInfoMethod"],
		["generic", [
			["punctuation", "<"],
			"H",
			["punctuation", ","],
			" A",
			["punctuation", ","],
			" I",
			["punctuation", ">"]
		]]
	]],
	["punctuation", "("],
	["class-name", [
		"H"
	]],
	" handle",
	["punctuation", ","],
	["class-name", [
		"A"
	]],
	["keyword", "value"],
	["punctuation", ","],
	["class-name", [
		"I"
	]],
	" paramName",
	["punctuation", ","],
	["class-name", [
		"Size_t"
	]],
	" paramValueSize",
	["punctuation", ","],
	["class-name", [
		"IntPtr"
	]],
	" paramValue",
	["punctuation", ","],
	["keyword", "out"],
	["class-name", [
		"Size_t"
	]],
	" paramValueSizeRet",
	["punctuation", ")"],
	["keyword", "where"],
	["class-name", "H"],
	["punctuation", ":"],
	["type-list", [
		["keyword", "unmanaged"],
		["punctuation", ","],
		["class-name", [
			"IInfoHandle",
			["punctuation", "<"],
			"A",
			["punctuation", ","],
			" I",
			["punctuation", ">"]
		]]
	]],
	["keyword", "where"],
	["class-name", "A"],
	["punctuation", ":"],
	["type-list", [
		["keyword", "unmanaged"]
	]],
	["keyword", "where"],
	["class-name", "I"],
	["punctuation", ":"],
	["type-list", [
		["keyword", "unmanaged"],
		["punctuation", ","],
		["class-name", [
			"Enum"
		]]
	]],
	["punctuation", ";"]
]

----------------------------------------------------

Checks for type lists of inheritance or generic constraints.
