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

Loading…
Cancel
Save