未验证 提交 8efda008 编写于 作者: D David Poeschl 提交者: GitHub

Merge pull request #28455 from dotnet/merges/dev15.8.x-to-dev15.8.x-vs-deps

Merge dev15.8.x to dev15.8.x-vs-deps
......@@ -6891,7 +6891,7 @@ public class D : List<Y>
Diagnostic(ErrorCode.ERR_DeprecatedSymbolStr, "X").WithArguments("N.A", "Do not use").WithLocation(15, 16));
}
[Fact]
[ConditionalFact(typeof(IsEnglishLocal), Skip = "https://github.com/dotnet/roslyn/issues/28328")]
[WorkItem(580832, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/580832")]
public void ObsoleteOnVirtual_OnBase()
{
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
......@@ -25,7 +25,7 @@ private class Searcher
private readonly INavigateToCallback _callback;
private readonly string _searchPattern;
private readonly bool _searchCurrentDocument;
private readonly ISet<string> _kinds;
private readonly IImmutableSet<string> _kinds;
private readonly Document _currentDocument;
private readonly ProgressTracker _progress;
private readonly IAsynchronousOperationListener _asyncListener;
......@@ -38,7 +38,7 @@ private class Searcher
INavigateToCallback callback,
string searchPattern,
bool searchCurrentDocument,
ISet<string> kinds,
IImmutableSet<string> kinds,
CancellationToken cancellationToken)
{
_solution = solution;
......@@ -108,7 +108,7 @@ private async Task SearchAsyncWorker(Project project)
{
using (cacheService.EnableCaching(project.Id))
{
var service = project.LanguageServices.GetService<INavigateToSearchService>();
var service = TryGetNavigateToSearchService(project);
if (service != null)
{
var searchTask = _currentDocument != null
......
......@@ -4,9 +4,13 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.NavigateTo;
using Microsoft.CodeAnalysis.Shared.TestHooks;
using Microsoft.VisualStudio.Language.NavigateTo.Interfaces;
using Roslyn.Utilities;
using INavigateToSearchService = Microsoft.CodeAnalysis.NavigateTo.INavigateToSearchService;
using INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate = Microsoft.CodeAnalysis.NavigateTo.INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate;
namespace Microsoft.CodeAnalysis.Editor.Implementation.NavigateTo
{
......@@ -30,21 +34,50 @@ internal partial class NavigateToItemProvider : INavigateToItemProvider2
_displayFactory = new NavigateToItemDisplayFactory();
}
public ISet<string> KindsProvided { get; } = ImmutableHashSet.Create(
NavigateToItemKind.Class,
NavigateToItemKind.Constant,
NavigateToItemKind.Delegate,
NavigateToItemKind.Enum,
NavigateToItemKind.EnumItem,
NavigateToItemKind.Event,
NavigateToItemKind.Field,
NavigateToItemKind.Interface,
NavigateToItemKind.Method,
NavigateToItemKind.Module,
NavigateToItemKind.Property,
NavigateToItemKind.Structure);
public bool CanFilter => true;
ISet<string> INavigateToItemProvider2.KindsProvided => KindsProvided;
public ImmutableHashSet<string> KindsProvided
{
get
{
var result = ImmutableHashSet.Create<string>(StringComparer.Ordinal);
foreach (var project in _workspace.CurrentSolution.Projects)
{
var navigateToSearchService = TryGetNavigateToSearchService(project);
if (navigateToSearchService != null)
{
result = result.Union(navigateToSearchService.KindsProvided);
}
}
return result;
}
}
public bool CanFilter
{
get
{
foreach (var project in _workspace.CurrentSolution.Projects)
{
var navigateToSearchService = TryGetNavigateToSearchService(project);
if (navigateToSearchService is null)
{
// If we reach here, it means the current project does not support Navigate To, which is
// functionally equivalent to supporting filtering.
continue;
}
if (!navigateToSearchService.CanFilter)
{
return false;
}
}
// All projects either support filtering or do not support Navigate To at all
return true;
}
}
public void StopSearch()
{
......@@ -87,10 +120,10 @@ private bool GetSearchCurrentDocumentOptionWorker(INavigateToCallback callback)
public void StartSearch(INavigateToCallback callback, string searchValue, INavigateToFilterParameters filter)
{
StartSearch(callback, searchValue, filter.Kinds);
StartSearch(callback, searchValue, filter.Kinds.ToImmutableHashSet(StringComparer.Ordinal));
}
private void StartSearch(INavigateToCallback callback, string searchValue, ISet<string> kinds)
private void StartSearch(INavigateToCallback callback, string searchValue, IImmutableSet<string> kinds)
{
this.StopSearch();
......@@ -118,5 +151,47 @@ private void StartSearch(INavigateToCallback callback, string searchValue, ISet<
searcher.Search();
}
private static INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate TryGetNavigateToSearchService(Project project)
{
var service = project.LanguageServices.GetService<INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate>();
if (service != null)
{
return service;
}
#pragma warning disable CS0618 // Type or member is obsolete
#pragma warning disable CS0612 // Type or member is obsolete
var legacyService = project.LanguageServices.GetService<INavigateToSearchService>();
if (legacyService != null)
{
return new ShimNavigateToSearchService(legacyService);
}
#pragma warning restore CS0612 // Type or member is obsolete
#pragma warning restore CS0618 // Type or member is obsolete
return null;
}
[Obsolete("https://github.com/dotnet/roslyn/issues/28343")]
private class ShimNavigateToSearchService : INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate
{
private readonly INavigateToSearchService _navigateToSearchService;
public ShimNavigateToSearchService(INavigateToSearchService navigateToSearchService)
{
_navigateToSearchService = navigateToSearchService;
}
public IImmutableSet<string> KindsProvided => ImmutableHashSet.Create<string>(StringComparer.Ordinal);
public bool CanFilter => false;
public Task<ImmutableArray<INavigateToSearchResult>> SearchDocumentAsync(Document document, string searchPattern, IImmutableSet<string> kinds, CancellationToken cancellationToken)
=> _navigateToSearchService.SearchDocumentAsync(document, searchPattern, cancellationToken);
public Task<ImmutableArray<INavigateToSearchResult>> SearchProjectAsync(Project project, string searchPattern, IImmutableSet<string> kinds, CancellationToken cancellationToken)
=> _navigateToSearchService.SearchProjectAsync(project, searchPattern, cancellationToken);
}
}
}
......@@ -6,7 +6,7 @@
namespace Microsoft.CodeAnalysis.CSharp.NavigateTo
{
[ExportLanguageService(typeof(INavigateToSearchService), LanguageNames.CSharp), Shared]
[ExportLanguageService(typeof(INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate), LanguageNames.CSharp), Shared]
internal class CSharpNavigateToSearchService : AbstractNavigateToSearchService
{
}
......
......@@ -23,21 +23,21 @@ internal abstract partial class AbstractNavigateToSearchService
new ConditionalWeakTable<Project, Tuple<string, ImmutableArray<SearchResult>>>();
public static Task<ImmutableArray<INavigateToSearchResult>> SearchProjectInCurrentProcessAsync(
Project project, string searchPattern, ISet<string> kinds, CancellationToken cancellationToken)
Project project, string searchPattern, IImmutableSet<string> kinds, CancellationToken cancellationToken)
{
return FindSearchResultsAsync(
project, searchDocument: null, pattern: searchPattern, kinds, cancellationToken: cancellationToken);
}
public static Task<ImmutableArray<INavigateToSearchResult>> SearchDocumentInCurrentProcessAsync(
Document document, string searchPattern, ISet<string> kinds, CancellationToken cancellationToken)
Document document, string searchPattern, IImmutableSet<string> kinds, CancellationToken cancellationToken)
{
return FindSearchResultsAsync(
document.Project, document, searchPattern, kinds, cancellationToken);
}
private static async Task<ImmutableArray<INavigateToSearchResult>> FindSearchResultsAsync(
Project project, Document searchDocument, string pattern, ISet<string> kinds, CancellationToken cancellationToken)
Project project, Document searchDocument, string pattern, IImmutableSet<string> kinds, CancellationToken cancellationToken)
{
// If the user created a dotted pattern then we'll grab the last part of the name
var (patternName, patternContainerOpt) = PatternMatcher.GetNameAndContainer(pattern);
......
......@@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Remote;
......@@ -12,25 +13,25 @@ namespace Microsoft.CodeAnalysis.NavigateTo
internal abstract partial class AbstractNavigateToSearchService
{
private async Task<ImmutableArray<INavigateToSearchResult>> SearchDocumentInRemoteProcessAsync(
RemoteHostClient client, Document document, string searchPattern, ISet<string> kinds, CancellationToken cancellationToken)
RemoteHostClient client, Document document, string searchPattern, IImmutableSet<string> kinds, CancellationToken cancellationToken)
{
var solution = document.Project.Solution;
var serializableResults = await client.TryRunCodeAnalysisRemoteAsync<IList<SerializableNavigateToSearchResult>>(
solution, nameof(IRemoteNavigateToSearchService.SearchDocumentAsync),
new object[] { document.Id, searchPattern, kinds }, cancellationToken).ConfigureAwait(false);
new object[] { document.Id, searchPattern, kinds.ToArray() }, cancellationToken).ConfigureAwait(false);
return serializableResults.SelectAsArray(r => r.Rehydrate(solution));
}
private async Task<ImmutableArray<INavigateToSearchResult>> SearchProjectInRemoteProcessAsync(
RemoteHostClient client, Project project, string searchPattern, ISet<string> kinds, CancellationToken cancellationToken)
RemoteHostClient client, Project project, string searchPattern, IImmutableSet<string> kinds, CancellationToken cancellationToken)
{
var solution = project.Solution;
var serializableResults = await client.TryRunCodeAnalysisRemoteAsync<IList<SerializableNavigateToSearchResult>>(
solution, nameof(IRemoteNavigateToSearchService.SearchProjectAsync),
new object[] { project.Id, searchPattern, kinds }, cancellationToken).ConfigureAwait(false);
new object[] { project.Id, searchPattern, kinds.ToArray() }, cancellationToken).ConfigureAwait(false);
return serializableResults.SelectAsArray(r => r.Rehydrate(solution));
}
......
......@@ -7,10 +7,26 @@
namespace Microsoft.CodeAnalysis.NavigateTo
{
internal abstract partial class AbstractNavigateToSearchService : INavigateToSearchService
internal abstract partial class AbstractNavigateToSearchService : INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate
{
public IImmutableSet<string> KindsProvided { get; } = ImmutableHashSet.Create(
NavigateToItemKind.Class,
NavigateToItemKind.Constant,
NavigateToItemKind.Delegate,
NavigateToItemKind.Enum,
NavigateToItemKind.EnumItem,
NavigateToItemKind.Event,
NavigateToItemKind.Field,
NavigateToItemKind.Interface,
NavigateToItemKind.Method,
NavigateToItemKind.Module,
NavigateToItemKind.Property,
NavigateToItemKind.Structure);
public bool CanFilter => true;
public async Task<ImmutableArray<INavigateToSearchResult>> SearchDocumentAsync(
Document document, string searchPattern, ISet<string> kinds, CancellationToken cancellationToken)
Document document, string searchPattern, IImmutableSet<string> kinds, CancellationToken cancellationToken)
{
var client = await TryGetRemoteHostClientAsync(document.Project, cancellationToken).ConfigureAwait(false);
if (client == null)
......@@ -26,7 +42,7 @@ internal abstract partial class AbstractNavigateToSearchService : INavigateToSea
}
public async Task<ImmutableArray<INavigateToSearchResult>> SearchProjectAsync(
Project project, string searchPattern, ISet<string> kinds, CancellationToken cancellationToken)
Project project, string searchPattern, IImmutableSet<string> kinds, CancellationToken cancellationToken)
{
var client = await TryGetRemoteHostClientAsync(project, cancellationToken).ConfigureAwait(false);
if (client == null)
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.Collections.Generic;
using System;
using System.Collections.Immutable;
using System.Threading;
using System.Threading.Tasks;
......@@ -8,9 +8,27 @@
namespace Microsoft.CodeAnalysis.NavigateTo
{
[Obsolete("Use " + nameof(INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate) + " instead.")]
internal interface INavigateToSearchService : ILanguageService
{
Task<ImmutableArray<INavigateToSearchResult>> SearchProjectAsync(Project project, string searchPattern, ISet<string> kinds, CancellationToken cancellationToken);
Task<ImmutableArray<INavigateToSearchResult>> SearchDocumentAsync(Document document, string searchPattern, ISet<string> kinds, CancellationToken cancellationToken);
Task<ImmutableArray<INavigateToSearchResult>> SearchProjectAsync(Project project, string searchPattern, CancellationToken cancellationToken);
Task<ImmutableArray<INavigateToSearchResult>> SearchDocumentAsync(Document document, string searchPattern, CancellationToken cancellationToken);
}
// This will be renamed to replace INavigateToSearchService as part of https://github.com/dotnet/roslyn/issues/28343
internal interface INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate : ILanguageService
{
IImmutableSet<string> KindsProvided
{
get;
}
bool CanFilter
{
get;
}
Task<ImmutableArray<INavigateToSearchResult>> SearchProjectAsync(Project project, string searchPattern, IImmutableSet<string> kinds, CancellationToken cancellationToken);
Task<ImmutableArray<INavigateToSearchResult>> SearchDocumentAsync(Document document, string searchPattern, IImmutableSet<string> kinds, CancellationToken cancellationToken);
}
}
......@@ -5,7 +5,7 @@ Imports Microsoft.CodeAnalysis.Host.Mef
Imports Microsoft.CodeAnalysis.NavigateTo
Namespace Microsoft.CodeAnalysis.VisualBasic.NavigateTo
<ExportLanguageService(GetType(INavigateToSearchService), LanguageNames.VisualBasic), [Shared]>
<ExportLanguageService(GetType(INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate), LanguageNames.VisualBasic), [Shared]>
Friend Class VisualBasicNavigateToSearchService
Inherits AbstractNavigateToSearchService
End Class
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册