Browse Source

Make it possible to search by full name without including generic type parameters.

pull/1649/head
Siegfried Pammer 6 years ago
parent
commit
a9bb17aba9
  1. 10
      ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs
  2. 18
      ILSpy/Languages/CSharpLanguage.cs
  3. 18
      ILSpy/Languages/Language.cs
  4. 3
      ILSpy/Search/AbstractSearchStrategy.cs
  5. 10
      ILSpy/Search/MemberSearchStrategy.cs

10
ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs

@ -101,24 +101,26 @@ namespace ICSharpCode.Decompiler.Metadata
} }
} }
public static string ToILNameString(this FullTypeName typeName) public static string ToILNameString(this FullTypeName typeName, bool omitGenerics = false)
{ {
string name; string name;
if (typeName.IsNested) { if (typeName.IsNested) {
name = typeName.Name; name = typeName.Name;
if (!omitGenerics) {
int localTypeParameterCount = typeName.GetNestedTypeAdditionalTypeParameterCount(typeName.NestingLevel - 1); int localTypeParameterCount = typeName.GetNestedTypeAdditionalTypeParameterCount(typeName.NestingLevel - 1);
if (localTypeParameterCount > 0) if (localTypeParameterCount > 0)
name += "`" + localTypeParameterCount; name += "`" + localTypeParameterCount;
}
name = Disassembler.DisassemblerHelpers.Escape(name); name = Disassembler.DisassemblerHelpers.Escape(name);
return $"{typeName.GetDeclaringType().ToILNameString()}/{name}"; return $"{typeName.GetDeclaringType().ToILNameString(omitGenerics)}/{name}";
} }
if (!string.IsNullOrEmpty(typeName.TopLevelTypeName.Namespace)) { if (!string.IsNullOrEmpty(typeName.TopLevelTypeName.Namespace)) {
name = $"{typeName.TopLevelTypeName.Namespace}.{typeName.Name}"; name = $"{typeName.TopLevelTypeName.Namespace}.{typeName.Name}";
if (typeName.TypeParameterCount > 0) if (!omitGenerics && typeName.TypeParameterCount > 0)
name += "`" + typeName.TypeParameterCount; name += "`" + typeName.TypeParameterCount;
} else { } else {
name = typeName.Name; name = typeName.Name;
if (typeName.TypeParameterCount > 0) if (!omitGenerics && typeName.TypeParameterCount > 0)
name += "`" + typeName.TypeParameterCount; name += "`" + typeName.TypeParameterCount;
} }
return Disassembler.DisassemblerHelpers.Escape(name); return Disassembler.DisassemblerHelpers.Escape(name);

18
ILSpy/Languages/CSharpLanguage.cs

@ -519,7 +519,7 @@ namespace ICSharpCode.ILSpy
return EntityToString(@event, includeDeclaringTypeName, includeNamespace, includeNamespaceOfDeclaringTypeName); return EntityToString(@event, includeDeclaringTypeName, includeNamespace, includeNamespaceOfDeclaringTypeName);
} }
string ToCSharpString(MetadataReader metadata, TypeDefinitionHandle handle, bool fullName) string ToCSharpString(MetadataReader metadata, TypeDefinitionHandle handle, bool fullName, bool omitGenerics)
{ {
StringBuilder builder = new StringBuilder(); StringBuilder builder = new StringBuilder();
var currentTypeDefHandle = handle; var currentTypeDefHandle = handle;
@ -531,7 +531,7 @@ namespace ICSharpCode.ILSpy
typeDef = metadata.GetTypeDefinition(currentTypeDefHandle); typeDef = metadata.GetTypeDefinition(currentTypeDefHandle);
var part = ReflectionHelper.SplitTypeParameterCountFromReflectionName(metadata.GetString(typeDef.Name), out int typeParamCount); var part = ReflectionHelper.SplitTypeParameterCountFromReflectionName(metadata.GetString(typeDef.Name), out int typeParamCount);
var genericParams = typeDef.GetGenericParameters(); var genericParams = typeDef.GetGenericParameters();
if (genericParams.Count > 0) { if (!omitGenerics && genericParams.Count > 0) {
builder.Insert(0, '>'); builder.Insert(0, '>');
int firstIndex = genericParams.Count - typeParamCount; int firstIndex = genericParams.Count - typeParamCount;
for (int i = genericParams.Count - 1; i >= genericParams.Count - typeParamCount; i--) { for (int i = genericParams.Count - 1; i >= genericParams.Count - typeParamCount; i--) {
@ -552,17 +552,17 @@ namespace ICSharpCode.ILSpy
return builder.ToString(); return builder.ToString();
} }
public override string GetEntityName(PEFile module, EntityHandle handle, bool fullName) public override string GetEntityName(PEFile module, EntityHandle handle, bool fullName, bool omitGenerics)
{ {
MetadataReader metadata = module.Metadata; MetadataReader metadata = module.Metadata;
switch (handle.Kind) { switch (handle.Kind) {
case HandleKind.TypeDefinition: case HandleKind.TypeDefinition:
return ToCSharpString(metadata, (TypeDefinitionHandle)handle, fullName); return ToCSharpString(metadata, (TypeDefinitionHandle)handle, fullName, omitGenerics);
case HandleKind.FieldDefinition: case HandleKind.FieldDefinition:
var fd = metadata.GetFieldDefinition((FieldDefinitionHandle)handle); var fd = metadata.GetFieldDefinition((FieldDefinitionHandle)handle);
var declaringType = fd.GetDeclaringType(); var declaringType = fd.GetDeclaringType();
if (fullName) if (fullName)
return ToCSharpString(metadata, declaringType, fullName) + "." + metadata.GetString(fd.Name); return ToCSharpString(metadata, declaringType, fullName, omitGenerics) + "." + metadata.GetString(fd.Name);
return metadata.GetString(fd.Name); return metadata.GetString(fd.Name);
case HandleKind.MethodDefinition: case HandleKind.MethodDefinition:
var md = metadata.GetMethodDefinition((MethodDefinitionHandle)handle); var md = metadata.GetMethodDefinition((MethodDefinitionHandle)handle);
@ -586,7 +586,7 @@ namespace ICSharpCode.ILSpy
break; break;
default: default:
var genericParams = md.GetGenericParameters(); var genericParams = md.GetGenericParameters();
if (genericParams.Count > 0) { if (!omitGenerics && genericParams.Count > 0) {
methodName += "<"; methodName += "<";
int i = 0; int i = 0;
foreach (var h in genericParams) { foreach (var h in genericParams) {
@ -600,19 +600,19 @@ namespace ICSharpCode.ILSpy
break; break;
} }
if (fullName) if (fullName)
return ToCSharpString(metadata, declaringType, fullName) + "." + methodName; return ToCSharpString(metadata, declaringType, fullName, omitGenerics) + "." + methodName;
return methodName; return methodName;
case HandleKind.EventDefinition: case HandleKind.EventDefinition:
var ed = metadata.GetEventDefinition((EventDefinitionHandle)handle); var ed = metadata.GetEventDefinition((EventDefinitionHandle)handle);
declaringType = metadata.GetMethodDefinition(ed.GetAccessors().GetAny()).GetDeclaringType(); declaringType = metadata.GetMethodDefinition(ed.GetAccessors().GetAny()).GetDeclaringType();
if (fullName) if (fullName)
return ToCSharpString(metadata, declaringType, fullName) + "." + metadata.GetString(ed.Name); return ToCSharpString(metadata, declaringType, fullName, omitGenerics) + "." + metadata.GetString(ed.Name);
return metadata.GetString(ed.Name); return metadata.GetString(ed.Name);
case HandleKind.PropertyDefinition: case HandleKind.PropertyDefinition:
var pd = metadata.GetPropertyDefinition((PropertyDefinitionHandle)handle); var pd = metadata.GetPropertyDefinition((PropertyDefinitionHandle)handle);
declaringType = metadata.GetMethodDefinition(pd.GetAccessors().GetAny()).GetDeclaringType(); declaringType = metadata.GetMethodDefinition(pd.GetAccessors().GetAny()).GetDeclaringType();
if (fullName) if (fullName)
return ToCSharpString(metadata, declaringType, fullName) + "." + metadata.GetString(pd.Name); return ToCSharpString(metadata, declaringType, fullName, omitGenerics) + "." + metadata.GetString(pd.Name);
return metadata.GetString(pd.Name); return metadata.GetString(pd.Name);
default: default:
return null; return null;

18
ILSpy/Languages/Language.cs

@ -448,42 +448,42 @@ namespace ICSharpCode.ILSpy
/// <summary> /// <summary>
/// This should produce a string representation of the entity for search to match search strings against. /// This should produce a string representation of the entity for search to match search strings against.
/// </summary> /// </summary>
public virtual string GetEntityName(PEFile module, EntityHandle handle, bool fullName) public virtual string GetEntityName(PEFile module, EntityHandle handle, bool fullName, bool omitGenerics)
{ {
MetadataReader metadata = module.Metadata; MetadataReader metadata = module.Metadata;
switch (handle.Kind) { switch (handle.Kind) {
case HandleKind.TypeDefinition: case HandleKind.TypeDefinition:
if (fullName) if (fullName)
return EscapeName(((TypeDefinitionHandle)handle).GetFullTypeName(metadata).ToILNameString()); return EscapeName(((TypeDefinitionHandle)handle).GetFullTypeName(metadata).ToILNameString(omitGenerics));
var td = metadata.GetTypeDefinition((TypeDefinitionHandle)handle); var td = metadata.GetTypeDefinition((TypeDefinitionHandle)handle);
return EscapeName(metadata.GetString(td.Name)); return EscapeName(metadata.GetString(td.Name));
case HandleKind.FieldDefinition: case HandleKind.FieldDefinition:
var fd = metadata.GetFieldDefinition((FieldDefinitionHandle)handle); var fd = metadata.GetFieldDefinition((FieldDefinitionHandle)handle);
var declaringType = fd.GetDeclaringType();
if (fullName) if (fullName)
return EscapeName(fd.GetDeclaringType().GetFullTypeName(metadata).ToILNameString() + "." + metadata.GetString(fd.Name)); return EscapeName(fd.GetDeclaringType().GetFullTypeName(metadata).ToILNameString(omitGenerics) + "." + metadata.GetString(fd.Name));
return EscapeName(metadata.GetString(fd.Name)); return EscapeName(metadata.GetString(fd.Name));
case HandleKind.MethodDefinition: case HandleKind.MethodDefinition:
var md = metadata.GetMethodDefinition((MethodDefinitionHandle)handle); var md = metadata.GetMethodDefinition((MethodDefinitionHandle)handle);
declaringType = md.GetDeclaringType();
string methodName = metadata.GetString(md.Name); string methodName = metadata.GetString(md.Name);
if (!omitGenerics) {
int genericParamCount = md.GetGenericParameters().Count; int genericParamCount = md.GetGenericParameters().Count;
if (genericParamCount > 0) if (genericParamCount > 0)
methodName += "``" + genericParamCount; methodName += "``" + genericParamCount;
}
if (fullName) if (fullName)
return EscapeName(md.GetDeclaringType().GetFullTypeName(metadata).ToILNameString() + "." + methodName); return EscapeName(md.GetDeclaringType().GetFullTypeName(metadata).ToILNameString(omitGenerics) + "." + methodName);
return EscapeName(methodName); return EscapeName(methodName);
case HandleKind.EventDefinition: case HandleKind.EventDefinition:
var ed = metadata.GetEventDefinition((EventDefinitionHandle)handle); var ed = metadata.GetEventDefinition((EventDefinitionHandle)handle);
declaringType = metadata.GetMethodDefinition(ed.GetAccessors().GetAny()).GetDeclaringType(); var declaringType = metadata.GetMethodDefinition(ed.GetAccessors().GetAny()).GetDeclaringType();
if (fullName) if (fullName)
return EscapeName(declaringType.GetFullTypeName(metadata).ToILNameString() + "." + metadata.GetString(ed.Name)); return EscapeName(declaringType.GetFullTypeName(metadata).ToILNameString(omitGenerics) + "." + metadata.GetString(ed.Name));
return EscapeName(metadata.GetString(ed.Name)); return EscapeName(metadata.GetString(ed.Name));
case HandleKind.PropertyDefinition: case HandleKind.PropertyDefinition:
var pd = metadata.GetPropertyDefinition((PropertyDefinitionHandle)handle); var pd = metadata.GetPropertyDefinition((PropertyDefinitionHandle)handle);
declaringType = metadata.GetMethodDefinition(pd.GetAccessors().GetAny()).GetDeclaringType(); declaringType = metadata.GetMethodDefinition(pd.GetAccessors().GetAny()).GetDeclaringType();
if (fullName) if (fullName)
return EscapeName(declaringType.GetFullTypeName(metadata).ToILNameString() + "." + metadata.GetString(pd.Name)); return EscapeName(declaringType.GetFullTypeName(metadata).ToILNameString(omitGenerics) + "." + metadata.GetString(pd.Name));
return EscapeName(metadata.GetString(pd.Name)); return EscapeName(metadata.GetString(pd.Name));
default: default:
return null; return null;

3
ILSpy/Search/AbstractSearchStrategy.cs

@ -14,6 +14,7 @@ namespace ICSharpCode.ILSpy.Search
protected readonly string[] searchTerm; protected readonly string[] searchTerm;
protected readonly Regex regex; protected readonly Regex regex;
protected readonly bool fullNameSearch; protected readonly bool fullNameSearch;
protected readonly bool omitGenerics;
protected readonly Language language; protected readonly Language language;
protected readonly ApiVisibility apiVisibility; protected readonly ApiVisibility apiVisibility;
private readonly IProducerConsumerCollection<SearchResult> resultQueue; private readonly IProducerConsumerCollection<SearchResult> resultQueue;
@ -29,11 +30,13 @@ namespace ICSharpCode.ILSpy.Search
if (search.StartsWith("/", StringComparison.Ordinal) && search.Length > 4) { if (search.StartsWith("/", StringComparison.Ordinal) && search.Length > 4) {
var regexString = search.Substring(1, search.Length - 1); var regexString = search.Substring(1, search.Length - 1);
fullNameSearch = search.Contains("\\."); fullNameSearch = search.Contains("\\.");
omitGenerics = !search.Contains("<");
if (regexString.EndsWith("/", StringComparison.Ordinal)) if (regexString.EndsWith("/", StringComparison.Ordinal))
regexString = regexString.Substring(0, regexString.Length - 1); regexString = regexString.Substring(0, regexString.Length - 1);
regex = SafeNewRegex(regexString); regex = SafeNewRegex(regexString);
} else { } else {
fullNameSearch = search.Contains("."); fullNameSearch = search.Contains(".");
omitGenerics = !search.Contains("<");
} }
} }
searchTerm = terms; searchTerm = terms;

10
ILSpy/Search/MemberSearchStrategy.cs

@ -31,7 +31,7 @@ namespace ICSharpCode.ILSpy.Search
if (searchKind == MemberSearchKind.All || searchKind == MemberSearchKind.Type) { if (searchKind == MemberSearchKind.All || searchKind == MemberSearchKind.Type) {
foreach (var handle in metadata.TypeDefinitions) { foreach (var handle in metadata.TypeDefinitions) {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
string languageSpecificName = language.GetEntityName(module, handle, fullNameSearch); string languageSpecificName = language.GetEntityName(module, handle, fullNameSearch, omitGenerics);
if (languageSpecificName != null && !IsMatch(languageSpecificName)) if (languageSpecificName != null && !IsMatch(languageSpecificName))
continue; continue;
var type = ((MetadataModule)typeSystem.MainModule).GetDefinition(handle); var type = ((MetadataModule)typeSystem.MainModule).GetDefinition(handle);
@ -43,7 +43,7 @@ namespace ICSharpCode.ILSpy.Search
if (searchKind == MemberSearchKind.All || searchKind == MemberSearchKind.Member || searchKind == MemberSearchKind.Method) { if (searchKind == MemberSearchKind.All || searchKind == MemberSearchKind.Member || searchKind == MemberSearchKind.Method) {
foreach (var handle in metadata.MethodDefinitions) { foreach (var handle in metadata.MethodDefinitions) {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
string languageSpecificName = language.GetEntityName(module, handle, fullNameSearch); string languageSpecificName = language.GetEntityName(module, handle, fullNameSearch, omitGenerics);
if (languageSpecificName != null && !IsMatch(languageSpecificName)) if (languageSpecificName != null && !IsMatch(languageSpecificName))
continue; continue;
var method = ((MetadataModule)typeSystem.MainModule).GetDefinition(handle); var method = ((MetadataModule)typeSystem.MainModule).GetDefinition(handle);
@ -55,7 +55,7 @@ namespace ICSharpCode.ILSpy.Search
if (searchKind == MemberSearchKind.All || searchKind == MemberSearchKind.Member || searchKind == MemberSearchKind.Field) { if (searchKind == MemberSearchKind.All || searchKind == MemberSearchKind.Member || searchKind == MemberSearchKind.Field) {
foreach (var handle in metadata.FieldDefinitions) { foreach (var handle in metadata.FieldDefinitions) {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
string languageSpecificName = language.GetEntityName(module, handle, fullNameSearch); string languageSpecificName = language.GetEntityName(module, handle, fullNameSearch, omitGenerics);
if (languageSpecificName != null && !IsMatch(languageSpecificName)) if (languageSpecificName != null && !IsMatch(languageSpecificName))
continue; continue;
var field = ((MetadataModule)typeSystem.MainModule).GetDefinition(handle); var field = ((MetadataModule)typeSystem.MainModule).GetDefinition(handle);
@ -67,7 +67,7 @@ namespace ICSharpCode.ILSpy.Search
if (searchKind == MemberSearchKind.All || searchKind == MemberSearchKind.Member || searchKind == MemberSearchKind.Property) { if (searchKind == MemberSearchKind.All || searchKind == MemberSearchKind.Member || searchKind == MemberSearchKind.Property) {
foreach (var handle in metadata.PropertyDefinitions) { foreach (var handle in metadata.PropertyDefinitions) {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
string languageSpecificName = language.GetEntityName(module, handle, fullNameSearch); string languageSpecificName = language.GetEntityName(module, handle, fullNameSearch, omitGenerics);
if (languageSpecificName != null && !IsMatch(languageSpecificName)) if (languageSpecificName != null && !IsMatch(languageSpecificName))
continue; continue;
var property = ((MetadataModule)typeSystem.MainModule).GetDefinition(handle); var property = ((MetadataModule)typeSystem.MainModule).GetDefinition(handle);
@ -79,7 +79,7 @@ namespace ICSharpCode.ILSpy.Search
if (searchKind == MemberSearchKind.All || searchKind == MemberSearchKind.Member || searchKind == MemberSearchKind.Event) { if (searchKind == MemberSearchKind.All || searchKind == MemberSearchKind.Member || searchKind == MemberSearchKind.Event) {
foreach (var handle in metadata.EventDefinitions) { foreach (var handle in metadata.EventDefinitions) {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
string languageSpecificName = language.GetEntityName(module, handle, fullNameSearch); string languageSpecificName = language.GetEntityName(module, handle, fullNameSearch, omitGenerics);
if (!IsMatch(languageSpecificName)) if (!IsMatch(languageSpecificName))
continue; continue;
var @event = ((MetadataModule)typeSystem.MainModule).GetDefinition(handle); var @event = ((MetadataModule)typeSystem.MainModule).GetDefinition(handle);

Loading…
Cancel
Save