public List<BaseDocModel> FindMembers(string signature)
{
List<BaseDocModel> results = new List<BaseDocModel> ();
signature = signature.Trim ();
// If it's just a member name, take the easy path
if (!signature.Contains ('(')) {
results.AddRange (Members.Where (p => string.Compare (p.Name.TrimStart ('.'), signature, true) == 0).Cast<BaseDocModel> ());
return results;
}
string member_name = signature.Substring (0, signature.IndexOf ('(')).Trim ();
string parameters = signature.Substring (signature.IndexOf ('(')).Trim ('(', ')', ' ');
// Empty parameter list, another short circuit path
if (parameters.Length == 0) {
results.AddRange (Members.Where (p => string.Compare (p.Name.TrimStart ('.'), member_name, true) == 0 && p.Parameters.Count == 0).Cast<BaseDocModel> ());
return results;
}
// The hard path, we have to check the types of each of the parameters
string[] paras = parameters.Split (',');
foreach (var member in Members.Where (p => string.Compare (p.Name.TrimStart ('.'), member_name, true) == 0 && p.Parameters.Count == paras.Length)) {
bool match = true;
for (int i = 0; i < paras.Length; i++) {
string req_param = Formatter.FormatType (paras[i].Trim ());
string member_param = Formatter.FormatType (member.Parameters[i].Type.Trim ());
if (string.Compare (req_param, member_param, true) != 0) {
match = false;
break;
}
}
// We assume there cannot be more than one match
if (match) {
results.Add (member);
return results;
}
}
return results;
}