/// <summary>
/// Parses a delegate.
/// </summary>
/// <param name="memberName">Member name</param>
/// <param name="access">Code access</param>
/// <param name="memberAttributes">Member attributes</param>
/// <param name="returnType">Return type</param>
/// <returns>A delegate code element.</returns>
private DelegateElement ParseDelegate(
string memberName, CodeAccess access, MemberModifiers memberAttributes, string returnType)
{
DelegateElement delegateElement = new DelegateElement();
delegateElement.Name = memberName;
delegateElement.Access = access;
delegateElement.Type = returnType;
delegateElement.MemberModifiers = memberAttributes;
int genericIndex = memberName.IndexOf(CSharpSymbol.BeginGeneric);
bool isGeneric = genericIndex >= 0 && genericIndex < memberName.Length - 1;
if (isGeneric)
{
delegateElement.Name = memberName.Substring(0, genericIndex);
string typeParameterString = memberName.TrimEnd(CSharpSymbol.EndGeneric).Substring(
genericIndex + 1);
string[] typeParameterNames = typeParameterString.Split(
new char[] { CSharpSymbol.AliasSeparator, ' ' },
StringSplitOptions.RemoveEmptyEntries);
foreach (string typeParameterName in typeParameterNames)
{
TypeParameter typeParameter = new TypeParameter();
typeParameter.Name = typeParameterName;
delegateElement.AddTypeParameter(typeParameter);
}
}
delegateElement.Parameters = this.ParseParameters();
if (isGeneric)
{
ParseTypeParameterConstraints(delegateElement);
}
EatChar(CSharpSymbol.EndOfStatement);
return delegateElement;
}