Browse Source

Fix /NavigateTo:M with method names containing dots (explicit interface implementations).

Allow navigating to a method without specifying the parameter list.
Closes #258
pull/254/merge
Daniel Grunwald 14 years ago
parent
commit
f7d06edbd6
  1. 27
      ILSpy/XmlDoc/XmlDocKeyProvider.cs

27
ILSpy/XmlDoc/XmlDocKeyProvider.cs

@ -48,12 +48,7 @@ namespace ICSharpCode.ILSpy.XmlDoc @@ -48,12 +48,7 @@ namespace ICSharpCode.ILSpy.XmlDoc
b.Append("M:");
AppendTypeName(b, member.DeclaringType);
b.Append('.');
if (member.Name == ".ctor")
b.Append("#ctor");
else if (member.Name == "..ctor")
b.Append("#cctor");
else
b.Append(member.Name);
b.Append(member.Name.Replace('.', '#'));
IList<ParameterDefinition> parameters;
if (member is PropertyDefinition) {
parameters = ((PropertyDefinition)member).Parameters;
@ -164,10 +159,10 @@ namespace ICSharpCode.ILSpy.XmlDoc @@ -164,10 +159,10 @@ namespace ICSharpCode.ILSpy.XmlDoc
static MemberReference FindMember(ModuleDefinition module, string key, Func<TypeDefinition, IEnumerable<MemberReference>> memberSelector)
{
Debug.WriteLine("Looking for member " + key);
int pos = key.IndexOf('(');
int parenPos = key.IndexOf('(');
int dotPos;
if (pos > 0) {
dotPos = key.LastIndexOf('.', pos - 1, pos);
if (parenPos > 0) {
dotPos = key.LastIndexOf('.', parenPos - 1, parenPos);
} else {
dotPos = key.LastIndexOf('.');
}
@ -175,14 +170,24 @@ namespace ICSharpCode.ILSpy.XmlDoc @@ -175,14 +170,24 @@ namespace ICSharpCode.ILSpy.XmlDoc
TypeDefinition type = FindType(module, key.Substring(2, dotPos - 2));
if (type == null)
return null;
Debug.WriteLine("Searching in type " + type.FullName);
string shortName;
if (parenPos > 0) {
shortName = key.Substring(dotPos + 1, parenPos - (dotPos + 1));
} else {
shortName = key.Substring(dotPos + 1);
}
Debug.WriteLine("Searching in type {0} for {1}", type.FullName, shortName);
MemberReference shortNameMatch = null;
foreach (MemberReference member in memberSelector(type)) {
string memberKey = GetKey(member);
Debug.WriteLine(memberKey);
if (memberKey == key)
return member;
if (shortName == member.Name)
shortNameMatch = member;
}
return null;
// if there's no match by ID string (key), return the match by name.
return shortNameMatch;
}
static TypeDefinition FindType(ModuleDefinition module, string name)

Loading…
Cancel
Save