Browse Source

Fix display of ctors of generic types in tree view and fix search for ctors.

pull/863/head
Siegfried Pammer 9 years ago
parent
commit
43ce88ae87
  1. 2
      ILSpy/Languages/CSharpLanguage.cs
  2. 16
      ILSpy/Languages/Language.cs
  3. 82
      ILSpy/SearchStrategies.cs

2
ILSpy/Languages/CSharpLanguage.cs

@ -482,7 +482,7 @@ namespace ICSharpCode.ILSpy
if (method == null) if (method == null)
throw new ArgumentNullException("method"); throw new ArgumentNullException("method");
return (method.IsConstructor) ? method.DeclaringType.Name : method.Name; return (method.IsConstructor) ? FormatTypeName(method.DeclaringType) : method.Name;
} }
public override string FormatTypeName(TypeDefinition type) public override string FormatTypeName(TypeDefinition type)

16
ILSpy/Languages/Language.cs

@ -127,6 +127,13 @@ namespace ICSharpCode.ILSpy
return member.ToString(); return member.ToString();
} }
public virtual string FormatFieldName(FieldDefinition field)
{
if (field == null)
throw new ArgumentNullException(nameof(field));
return field.Name;
}
public virtual string FormatPropertyName(PropertyDefinition property, bool? isIndexer = null) public virtual string FormatPropertyName(PropertyDefinition property, bool? isIndexer = null)
{ {
if (property == null) if (property == null)
@ -137,10 +144,17 @@ namespace ICSharpCode.ILSpy
public virtual string FormatMethodName(MethodDefinition method) public virtual string FormatMethodName(MethodDefinition method)
{ {
if (method == null) if (method == null)
throw new ArgumentNullException("method"); throw new ArgumentNullException(nameof(method));
return method.Name; return method.Name;
} }
public virtual string FormatEventName(EventDefinition @event)
{
if (@event == null)
throw new ArgumentNullException(nameof(@event));
return @event.Name;
}
public virtual string FormatTypeName(TypeDefinition type) public virtual string FormatTypeName(TypeDefinition type)
{ {
if (type == null) if (type == null)

82
ILSpy/SearchStrategies.cs

@ -34,37 +34,37 @@ namespace ICSharpCode.ILSpy
searchTerm = terms; searchTerm = terms;
} }
protected virtual bool IsMatch(FieldDefinition field) protected virtual bool IsMatch(FieldDefinition field, Language language)
{ {
return false; return false;
} }
protected virtual bool IsMatch(PropertyDefinition property) protected virtual bool IsMatch(PropertyDefinition property, Language language)
{ {
return false; return false;
} }
protected virtual bool IsMatch(EventDefinition ev) protected virtual bool IsMatch(EventDefinition ev, Language language)
{ {
return false; return false;
} }
protected virtual bool IsMatch(MethodDefinition m) protected virtual bool IsMatch(MethodDefinition m, Language language)
{ {
return false; return false;
} }
protected virtual bool MatchName(MemberReference m) protected virtual bool MatchName(IMemberDefinition m, Language language)
{ {
if (regex != null) { if (regex != null) {
return regex.IsMatch(fullNameSearch ? GetLanguageSpecificFullName(m) : m.Name); return regex.IsMatch(GetLanguageSpecificName(language, m, fullNameSearch));
} }
for (int i = 0; i < searchTerm.Length; ++i) { for (int i = 0; i < searchTerm.Length; ++i) {
// How to handle overlapping matches? // How to handle overlapping matches?
var term = searchTerm[i]; var term = searchTerm[i];
if (string.IsNullOrEmpty(term)) continue; if (string.IsNullOrEmpty(term)) continue;
string text = term.Contains(".") ? GetLanguageSpecificFullName(m) : m.Name; string text = GetLanguageSpecificName(language, m, term.Contains("."));
switch (term[0]) { switch (term[0]) {
case '+': // must contain case '+': // must contain
term = term.Substring(1); term = term.Substring(1);
@ -92,29 +92,33 @@ namespace ICSharpCode.ILSpy
return true; return true;
} }
string GetLanguageSpecificFullName(MemberReference m, string nestedTypeSeparator = ".", string memberSeparator = ".") string GetLanguageSpecificName(Language language, IMemberDefinition member, bool fullName = false)
{ {
if (m.DeclaringType != null) switch (member) {
return GetLanguageSpecificFullName(m.DeclaringType, nestedTypeSeparator) + memberSeparator + m.Name; case TypeDefinition t:
return m.Name; return language.TypeToString(t, fullName);
} case FieldDefinition f:
return fullName ? language.TypeToString(f.DeclaringType, fullName) + "." + language.FormatFieldName(f) : language.FormatFieldName(f);
string GetLanguageSpecificFullName(TypeReference t, string nestedTypeSeparator = ".") case PropertyDefinition p:
{ return fullName ? language.TypeToString(p.DeclaringType, fullName) + "." + language.FormatPropertyName(p) : language.FormatPropertyName(p);
if (t.DeclaringType != null) case MethodDefinition m:
return GetLanguageSpecificFullName(t.DeclaringType, nestedTypeSeparator) + nestedTypeSeparator + t.Name; return fullName ? language.TypeToString(m.DeclaringType, fullName) + "." + language.FormatMethodName(m) : language.FormatMethodName(m);
return t.Namespace + "." + t.Name; case EventDefinition e:
return fullName ? language.TypeToString(e.DeclaringType, fullName) + "." + language.FormatEventName(e) : language.FormatEventName(e);
default:
throw new NotSupportedException(member?.GetType() + " not supported!");
}
} }
void Add<T>(IEnumerable<T> items, TypeDefinition type, Language language, Action<SearchResult> addResult, Func<T, bool> matcher, Func<T, ImageSource> image) where T : MemberReference void Add<T>(IEnumerable<T> items, TypeDefinition type, Language language, Action<SearchResult> addResult, Func<T, Language, bool> matcher, Func<T, ImageSource> image) where T : MemberReference
{ {
foreach (var item in items) { foreach (var item in items) {
if (matcher(item)) { if (matcher(item, language)) {
addResult(new SearchResult addResult(new SearchResult
{ {
Member = item, Member = item,
Image = image(item), Image = image(item),
Name = item.Name, Name = GetLanguageSpecificName(language, (IMemberDefinition)item),
LocationImage = TypeTreeNode.GetIcon(type), LocationImage = TypeTreeNode.GetIcon(type),
Location = language.TypeToString(type, includeNamespace: true) Location = language.TypeToString(type, includeNamespace: true)
}); });
@ -346,24 +350,24 @@ namespace ICSharpCode.ILSpy
this.searchKind = searchKind; this.searchKind = searchKind;
} }
protected override bool IsMatch(FieldDefinition field) protected override bool IsMatch(FieldDefinition field, Language language)
{ {
return (searchKind == MemberSearchKind.All || searchKind == MemberSearchKind.Field) && MatchName(field); return (searchKind == MemberSearchKind.All || searchKind == MemberSearchKind.Field) && MatchName(field, language);
} }
protected override bool IsMatch(PropertyDefinition property) protected override bool IsMatch(PropertyDefinition property, Language language)
{ {
return (searchKind == MemberSearchKind.All || searchKind == MemberSearchKind.Property) && MatchName(property); return (searchKind == MemberSearchKind.All || searchKind == MemberSearchKind.Property) && MatchName(property, language);
} }
protected override bool IsMatch(EventDefinition ev) protected override bool IsMatch(EventDefinition ev, Language language)
{ {
return (searchKind == MemberSearchKind.All || searchKind == MemberSearchKind.Event) && MatchName(ev); return (searchKind == MemberSearchKind.All || searchKind == MemberSearchKind.Event) && MatchName(ev, language);
} }
protected override bool IsMatch(MethodDefinition m) protected override bool IsMatch(MethodDefinition m, Language language)
{ {
return (searchKind == MemberSearchKind.All || searchKind == MemberSearchKind.Method) && MatchName(m); return (searchKind == MemberSearchKind.All || searchKind == MemberSearchKind.Method) && MatchName(m, language);
} }
} }
@ -376,7 +380,7 @@ namespace ICSharpCode.ILSpy
public override void Search(TypeDefinition type, Language language, Action<SearchResult> addResult) public override void Search(TypeDefinition type, Language language, Action<SearchResult> addResult)
{ {
if (MatchName(type)) { if (MatchName(type, language)) {
addResult(new SearchResult { addResult(new SearchResult {
Member = type, Member = type,
Image = TypeTreeNode.GetIcon(type), Image = TypeTreeNode.GetIcon(type),
@ -401,7 +405,7 @@ namespace ICSharpCode.ILSpy
public override void Search(TypeDefinition type, Language language, Action<SearchResult> addResult) public override void Search(TypeDefinition type, Language language, Action<SearchResult> addResult)
{ {
if (MatchName(type)) if (MatchName(type, language))
{ {
addResult(new SearchResult addResult(new SearchResult
{ {
@ -421,24 +425,24 @@ namespace ICSharpCode.ILSpy
base.Search(type, language, addResult); base.Search(type, language, addResult);
} }
protected override bool IsMatch(FieldDefinition field) protected override bool IsMatch(FieldDefinition field, Language language)
{ {
return MatchName(field); return MatchName(field, language);
} }
protected override bool IsMatch(PropertyDefinition property) protected override bool IsMatch(PropertyDefinition property, Language language)
{ {
return MatchName(property); return MatchName(property, language);
} }
protected override bool IsMatch(EventDefinition ev) protected override bool IsMatch(EventDefinition ev, Language language)
{ {
return MatchName(ev); return MatchName(ev, language);
} }
protected override bool IsMatch(MethodDefinition m) protected override bool IsMatch(MethodDefinition m, Language language)
{ {
return MatchName(m); return MatchName(m, language);
} }
} }
} }

Loading…
Cancel
Save