Browse Source

Make ShowApiLevel affect search

pull/1464/head
MCpiroman 7 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
protected readonly Regex regex; protected readonly Regex regex;
protected readonly bool fullNameSearch; protected readonly bool fullNameSearch;
protected readonly Language language; protected readonly Language language;
protected readonly ApiVisibility apiVisibility;
private readonly IProducerConsumerCollection<SearchResult> resultQueue; 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.language = language;
this.apiVisibility = apiVisibility;
this.resultQueue = resultQueue; this.resultQueue = resultQueue;
if (terms.Length == 1 && terms[0].Length > 2) { if (terms.Length == 1 && terms[0].Length > 2) {
@ -82,6 +84,28 @@ namespace ICSharpCode.ILSpy.Search
return true; 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) bool IsNoncontiguousMatch(string text, string searchTerm)
{ {
if (string.IsNullOrEmpty(text) || string.IsNullOrEmpty(searchTerm)) { if (string.IsNullOrEmpty(text) || string.IsNullOrEmpty(searchTerm)) {

6
ILSpy/Search/LiteralSearchStrategy.cs

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

13
ILSpy/Search/MemberSearchStrategy.cs

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

9
ILSpy/Search/MetadataTokenSearchStrategy.cs

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

56
ILSpy/Search/SearchPane.cs

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

Loading…
Cancel
Save