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. 16
      ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs
  2. 18
      ILSpy/Languages/CSharpLanguage.cs
  3. 24
      ILSpy/Languages/Language.cs
  4. 3
      ILSpy/Search/AbstractSearchStrategy.cs
  5. 10
      ILSpy/Search/MemberSearchStrategy.cs

16
ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs

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

18
ILSpy/Languages/CSharpLanguage.cs

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

24
ILSpy/Languages/Language.cs

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

3
ILSpy/Search/AbstractSearchStrategy.cs

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

10
ILSpy/Search/MemberSearchStrategy.cs

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

Loading…
Cancel
Save