Browse Source

Make ShowApiLevel affect search

pull/1464/head
MCpiroman 6 years ago
parent
commit
c5465c7b68
  1. 26
      ILSpy/Search/AbstractSearchStrategy.cs
  2. 6
      ILSpy/Search/LiteralSearchStrategy.cs
  3. 13
      ILSpy/Search/MemberSearchStrategy.cs
  4. 9
      ILSpy/Search/MetadataTokenSearchStrategy.cs
  5. 56
      ILSpy/Search/SearchPane.cs

26
ILSpy/Search/AbstractSearchStrategy.cs

@ -15,11 +15,13 @@ namespace ICSharpCode.ILSpy.Search @@ -15,11 +15,13 @@ namespace ICSharpCode.ILSpy.Search
protected readonly Regex regex;
protected readonly bool fullNameSearch;
protected readonly Language language;
protected readonly ApiVisibility apiVisibility;
private readonly IProducerConsumerCollection<SearchResult> resultQueue;
protected AbstractSearchStrategy(Language language, IProducerConsumerCollection<SearchResult> resultQueue, params string[] terms)
protected AbstractSearchStrategy(Language language, ApiVisibility apiVisibility, IProducerConsumerCollection<SearchResult> resultQueue, params string[] terms)
{
this.language = language;
this.apiVisibility = apiVisibility;
this.resultQueue = resultQueue;
if (terms.Length == 1 && terms[0].Length > 2) {
@ -82,6 +84,28 @@ namespace ICSharpCode.ILSpy.Search @@ -82,6 +84,28 @@ namespace ICSharpCode.ILSpy.Search
return true;
}
protected bool CheckVisibility(IEntity entity)
{
if (apiVisibility == ApiVisibility.All)
return true;
do {
if (apiVisibility == ApiVisibility.PublicOnly) {
if (!(entity.Accessibility == Accessibility.Public ||
entity.Accessibility == Accessibility.Protected ||
entity.Accessibility == Accessibility.ProtectedOrInternal))
return false;
} else if (apiVisibility == ApiVisibility.PublicAndInternal) {
if (!language.ShowMember(entity))
return false;
}
entity = entity.DeclaringTypeDefinition;
}
while (entity != null);
return true;
}
bool IsNoncontiguousMatch(string text, string searchTerm)
{
if (string.IsNullOrEmpty(text) || string.IsNullOrEmpty(searchTerm)) {

6
ILSpy/Search/LiteralSearchStrategy.cs

@ -20,8 +20,8 @@ namespace ICSharpCode.ILSpy.Search @@ -20,8 +20,8 @@ namespace ICSharpCode.ILSpy.Search
readonly TypeCode searchTermLiteralType;
readonly object searchTermLiteralValue;
public LiteralSearchStrategy(Language language, IProducerConsumerCollection<SearchResult> resultQueue, params string[] terms)
: base(language, resultQueue, terms)
public LiteralSearchStrategy(Language language, ApiVisibility apiVisibility, IProducerConsumerCollection<SearchResult> resultQueue, params string[] terms)
: base(language, apiVisibility, resultQueue, terms)
{
if (terms.Length == 1) {
var lexer = new Lexer(new LATextReader(new System.IO.StringReader(terms[0])));
@ -64,6 +64,7 @@ namespace ICSharpCode.ILSpy.Search @@ -64,6 +64,7 @@ namespace ICSharpCode.ILSpy.Search
var md = metadata.GetMethodDefinition(handle);
if (!md.HasBody() || !MethodIsLiteralMatch(module, md)) continue;
var method = ((MetadataModule)typeSystem.MainModule).GetDefinition(handle);
if (!CheckVisibility(method)) continue;
OnFoundResult(method);
}
@ -80,6 +81,7 @@ namespace ICSharpCode.ILSpy.Search @@ -80,6 +81,7 @@ namespace ICSharpCode.ILSpy.Search
if (!IsLiteralMatch(metadata, blob.ReadConstant(constant.TypeCode)))
continue;
IField field = ((MetadataModule)typeSystem.MainModule).GetDefinition(handle);
if (!CheckVisibility(field)) continue;
OnFoundResult(field);
}
}

13
ILSpy/Search/MemberSearchStrategy.cs

@ -10,13 +10,13 @@ namespace ICSharpCode.ILSpy.Search @@ -10,13 +10,13 @@ namespace ICSharpCode.ILSpy.Search
{
readonly MemberSearchKind searchKind;
public MemberSearchStrategy(Language language, string term, IProducerConsumerCollection<SearchResult> resultQueue, MemberSearchKind searchKind = MemberSearchKind.All)
: this(language, resultQueue, new[] { term }, searchKind)
public MemberSearchStrategy(Language language, ApiVisibility apiVisibility, string term, IProducerConsumerCollection<SearchResult> resultQueue, MemberSearchKind searchKind = MemberSearchKind.All)
: this(language, apiVisibility, resultQueue, new[] { term }, searchKind)
{
}
public MemberSearchStrategy(Language language, IProducerConsumerCollection<SearchResult> resultQueue, string[] terms, MemberSearchKind searchKind = MemberSearchKind.All)
: base(language, resultQueue, terms)
public MemberSearchStrategy(Language language, ApiVisibility apiVisibility, IProducerConsumerCollection<SearchResult> resultQueue, string[] terms, MemberSearchKind searchKind = MemberSearchKind.All)
: base(language, apiVisibility, resultQueue, terms)
{
this.searchKind = searchKind;
}
@ -35,6 +35,7 @@ namespace ICSharpCode.ILSpy.Search @@ -35,6 +35,7 @@ namespace ICSharpCode.ILSpy.Search
if (languageSpecificName != null && !IsMatch(languageSpecificName))
continue;
var type = ((MetadataModule)typeSystem.MainModule).GetDefinition(handle);
if (!CheckVisibility(type)) continue;
OnFoundResult(type);
}
}
@ -47,6 +48,7 @@ namespace ICSharpCode.ILSpy.Search @@ -47,6 +48,7 @@ namespace ICSharpCode.ILSpy.Search
if (languageSpecificName != null && !IsMatch(languageSpecificName))
continue;
var method = ((MetadataModule)typeSystem.MainModule).GetDefinition(handle);
if (!CheckVisibility(method)) continue;
OnFoundResult(method);
}
}
@ -58,6 +60,7 @@ namespace ICSharpCode.ILSpy.Search @@ -58,6 +60,7 @@ namespace ICSharpCode.ILSpy.Search
if (languageSpecificName != null && !IsMatch(languageSpecificName))
continue;
var field = ((MetadataModule)typeSystem.MainModule).GetDefinition(handle);
if (!CheckVisibility(field)) continue;
OnFoundResult(field);
}
}
@ -69,6 +72,7 @@ namespace ICSharpCode.ILSpy.Search @@ -69,6 +72,7 @@ namespace ICSharpCode.ILSpy.Search
if (languageSpecificName != null && !IsMatch(languageSpecificName))
continue;
var property = ((MetadataModule)typeSystem.MainModule).GetDefinition(handle);
if (!CheckVisibility(property)) continue;
OnFoundResult(property);
}
}
@ -80,6 +84,7 @@ namespace ICSharpCode.ILSpy.Search @@ -80,6 +84,7 @@ namespace ICSharpCode.ILSpy.Search
if (!IsMatch(languageSpecificName))
continue;
var @event = ((MetadataModule)typeSystem.MainModule).GetDefinition(handle);
if (!CheckVisibility(@event)) continue;
OnFoundResult(@event);
}
}

9
ILSpy/Search/MetadataTokenSearchStrategy.cs

@ -13,8 +13,8 @@ namespace ICSharpCode.ILSpy.Search @@ -13,8 +13,8 @@ namespace ICSharpCode.ILSpy.Search
{
readonly EntityHandle searchTermToken;
public MetadataTokenSearchStrategy(Language language, IProducerConsumerCollection<SearchResult> resultQueue, params string[] terms)
: base(language, resultQueue, terms)
public MetadataTokenSearchStrategy(Language language, ApiVisibility apiVisibility, IProducerConsumerCollection<SearchResult> resultQueue, params string[] terms)
: base(language, apiVisibility, resultQueue, terms)
{
if (terms.Length == 1) {
int.TryParse(terms[0], NumberStyles.HexNumber, CultureInfo.InvariantCulture, out var token);
@ -36,30 +36,35 @@ namespace ICSharpCode.ILSpy.Search @@ -36,30 +36,35 @@ namespace ICSharpCode.ILSpy.Search
if (row < 1 || row > module.Metadata.TypeDefinitions.Count)
break;
var type = metadataModule.GetDefinition((TypeDefinitionHandle)searchTermToken);
if (!CheckVisibility(type)) break;
OnFoundResult(type);
break;
case HandleKind.MethodDefinition:
if (row < 1 || row > module.Metadata.MethodDefinitions.Count)
break;
var method = metadataModule.GetDefinition((MethodDefinitionHandle)searchTermToken);
if (!CheckVisibility(method)) break;
OnFoundResult(method);
break;
case HandleKind.FieldDefinition:
if (row < 1 || row > module.Metadata.FieldDefinitions.Count)
break;
var field = metadataModule.GetDefinition((FieldDefinitionHandle)searchTermToken);
if (!CheckVisibility(field)) break;
OnFoundResult(field);
break;
case HandleKind.PropertyDefinition:
if (row < 1 || row > module.Metadata.PropertyDefinitions.Count)
break;
var property = metadataModule.GetDefinition((PropertyDefinitionHandle)searchTermToken);
if (!CheckVisibility(property)) break;
OnFoundResult(property);
break;
case HandleKind.EventDefinition:
if (row < 1 || row > module.Metadata.EventDefinitions.Count)
break;
var @event = metadataModule.GetDefinition((EventDefinitionHandle)searchTermToken);
if (!CheckVisibility(@event)) break;
OnFoundResult(@event);
break;
}

56
ILSpy/Search/SearchPane.cs

@ -21,6 +21,7 @@ using System.Collections.Concurrent; @@ -21,6 +21,7 @@ using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Diagnostics;
using System.Threading;
using System.Threading.Tasks;
@ -78,6 +79,7 @@ namespace ICSharpCode.ILSpy @@ -78,6 +79,7 @@ namespace ICSharpCode.ILSpy
ContextMenuProvider.Add(listBox);
MainWindow.Instance.CurrentAssemblyListChanged += MainWindow_Instance_CurrentAssemblyListChanged;
MainWindow.Instance.SessionSettings.FilterSettings.PropertyChanged += FilterSettings_PropertyChanged;
CompositionTarget.Rendering += UpdateResults;
// This starts empty search right away, so do at the end (we're still in ctor)
@ -94,6 +96,16 @@ namespace ICSharpCode.ILSpy @@ -94,6 +96,16 @@ namespace ICSharpCode.ILSpy
}
}
void FilterSettings_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName != nameof(FilterSettings.ShowApiLevel))
return;
if (IsVisible) {
StartSearch(this.SearchTerm);
}
}
public void Show()
{
if (!IsVisible) {
@ -212,7 +224,8 @@ namespace ICSharpCode.ILSpy @@ -212,7 +224,8 @@ namespace ICSharpCode.ILSpy
searchProgressBar.IsIndeterminate = true;
startedSearch = new RunningSearch(mainWindow.CurrentAssemblyList.GetAssemblies(), searchTerm,
(SearchMode)searchModeComboBox.SelectedIndex, mainWindow.CurrentLanguage);
(SearchMode)searchModeComboBox.SelectedIndex, mainWindow.CurrentLanguage,
mainWindow.SessionSettings.FilterSettings.ShowApiLevel);
currentSearch = startedSearch;
await startedSearch.Run();
@ -258,15 +271,16 @@ namespace ICSharpCode.ILSpy @@ -258,15 +271,16 @@ namespace ICSharpCode.ILSpy
readonly string[] searchTerm;
readonly SearchMode searchMode;
readonly Language language;
readonly ApiVisibility apiVisibility;
public readonly IProducerConsumerCollection<SearchResult> resultQueue = new ConcurrentQueue<SearchResult>();
public RunningSearch(LoadedAssembly[] assemblies, string searchTerm, SearchMode searchMode, Language language)
public RunningSearch(LoadedAssembly[] assemblies, string searchTerm, SearchMode searchMode, Language language, ApiVisibility apiVisibility)
{
this.assemblies = assemblies;
this.searchTerm = NativeMethods.CommandLineToArgumentArray(searchTerm);
this.language = language;
this.searchMode = searchMode;
this.apiVisibility = apiVisibility;
}
public void Cancel()
@ -296,53 +310,53 @@ namespace ICSharpCode.ILSpy @@ -296,53 +310,53 @@ namespace ICSharpCode.ILSpy
{
if (searchTerm.Length == 1) {
if (searchTerm[0].StartsWith("tm:", StringComparison.Ordinal))
return new MemberSearchStrategy(language, searchTerm[0].Substring(3), resultQueue);
return new MemberSearchStrategy(language, apiVisibility, searchTerm[0].Substring(3), resultQueue);
if (searchTerm[0].StartsWith("t:", StringComparison.Ordinal))
return new MemberSearchStrategy(language, searchTerm[0].Substring(2), resultQueue, MemberSearchKind.Type);
return new MemberSearchStrategy(language, apiVisibility, searchTerm[0].Substring(2), resultQueue, MemberSearchKind.Type);
if (searchTerm[0].StartsWith("m:", StringComparison.Ordinal))
return new MemberSearchStrategy(language, searchTerm[0].Substring(2), resultQueue, MemberSearchKind.Member);
return new MemberSearchStrategy(language, apiVisibility, searchTerm[0].Substring(2), resultQueue, MemberSearchKind.Member);
if (searchTerm[0].StartsWith("md:", StringComparison.Ordinal))
return new MemberSearchStrategy(language, searchTerm[0].Substring(3), resultQueue, MemberSearchKind.Method);
return new MemberSearchStrategy(language, apiVisibility, searchTerm[0].Substring(3), resultQueue, MemberSearchKind.Method);
if (searchTerm[0].StartsWith("f:", StringComparison.Ordinal))
return new MemberSearchStrategy(language, searchTerm[0].Substring(2), resultQueue, MemberSearchKind.Field);
return new MemberSearchStrategy(language, apiVisibility, searchTerm[0].Substring(2), resultQueue, MemberSearchKind.Field);
if (searchTerm[0].StartsWith("p:", StringComparison.Ordinal))
return new MemberSearchStrategy(language, searchTerm[0].Substring(2), resultQueue, MemberSearchKind.Property);
return new MemberSearchStrategy(language, apiVisibility, searchTerm[0].Substring(2), resultQueue, MemberSearchKind.Property);
if (searchTerm[0].StartsWith("e:", StringComparison.Ordinal))
return new MemberSearchStrategy(language, searchTerm[0].Substring(2), resultQueue, MemberSearchKind.Event);
return new MemberSearchStrategy(language, apiVisibility, searchTerm[0].Substring(2), resultQueue, MemberSearchKind.Event);
if (searchTerm[0].StartsWith("c:", StringComparison.Ordinal))
return new LiteralSearchStrategy(language, resultQueue, searchTerm[0].Substring(2));
return new LiteralSearchStrategy(language, apiVisibility, resultQueue, searchTerm[0].Substring(2));
if (searchTerm[0].StartsWith("@", StringComparison.Ordinal))
return new MetadataTokenSearchStrategy(language, resultQueue, searchTerm[0].Substring(1));
return new MetadataTokenSearchStrategy(language, apiVisibility, resultQueue, searchTerm[0].Substring(1));
}
switch (searchMode)
{
case SearchMode.TypeAndMember:
return new MemberSearchStrategy(language, resultQueue, searchTerm);
return new MemberSearchStrategy(language, apiVisibility, resultQueue, searchTerm);
case SearchMode.Type:
return new MemberSearchStrategy(language, resultQueue, searchTerm, MemberSearchKind.Type);
return new MemberSearchStrategy(language, apiVisibility, resultQueue, searchTerm, MemberSearchKind.Type);
case SearchMode.Member:
return new MemberSearchStrategy(language, resultQueue, searchTerm, MemberSearchKind.Member);
return new MemberSearchStrategy(language, apiVisibility, resultQueue, searchTerm, MemberSearchKind.Member);
case SearchMode.Literal:
return new LiteralSearchStrategy(language, resultQueue, searchTerm);
return new LiteralSearchStrategy(language, apiVisibility, resultQueue, searchTerm);
case SearchMode.Method:
return new MemberSearchStrategy(language, resultQueue, searchTerm, MemberSearchKind.Method);
return new MemberSearchStrategy(language, apiVisibility, resultQueue, searchTerm, MemberSearchKind.Method);
case SearchMode.Field:
return new MemberSearchStrategy(language, resultQueue, searchTerm, MemberSearchKind.Field);
return new MemberSearchStrategy(language, apiVisibility, resultQueue, searchTerm, MemberSearchKind.Field);
case SearchMode.Property:
return new MemberSearchStrategy(language, resultQueue, searchTerm, MemberSearchKind.Property);
return new MemberSearchStrategy(language, apiVisibility, resultQueue, searchTerm, MemberSearchKind.Property);
case SearchMode.Event:
return new MemberSearchStrategy(language, resultQueue, searchTerm, MemberSearchKind.Event);
return new MemberSearchStrategy(language, apiVisibility, resultQueue, searchTerm, MemberSearchKind.Event);
case SearchMode.Token:
return new MetadataTokenSearchStrategy(language, resultQueue, searchTerm);
return new MetadataTokenSearchStrategy(language, apiVisibility, resultQueue, searchTerm);
}
return null;

Loading…
Cancel
Save