未验证 提交 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> ...@@ -6891,7 +6891,7 @@ public class D : List<Y>
Diagnostic(ErrorCode.ERR_DeprecatedSymbolStr, "X").WithArguments("N.A", "Do not use").WithLocation(15, 16)); 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")] [WorkItem(580832, "http://vstfdevdiv:8080/DevDiv2/DevDiv/_workitems/edit/580832")]
public void ObsoleteOnVirtual_OnBase() 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. // 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;
using System.Collections.Generic; using System.Collections.Immutable;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
...@@ -25,7 +25,7 @@ private class Searcher ...@@ -25,7 +25,7 @@ private class Searcher
private readonly INavigateToCallback _callback; private readonly INavigateToCallback _callback;
private readonly string _searchPattern; private readonly string _searchPattern;
private readonly bool _searchCurrentDocument; private readonly bool _searchCurrentDocument;
private readonly ISet<string> _kinds; private readonly IImmutableSet<string> _kinds;
private readonly Document _currentDocument; private readonly Document _currentDocument;
private readonly ProgressTracker _progress; private readonly ProgressTracker _progress;
private readonly IAsynchronousOperationListener _asyncListener; private readonly IAsynchronousOperationListener _asyncListener;
...@@ -38,7 +38,7 @@ private class Searcher ...@@ -38,7 +38,7 @@ private class Searcher
INavigateToCallback callback, INavigateToCallback callback,
string searchPattern, string searchPattern,
bool searchCurrentDocument, bool searchCurrentDocument,
ISet<string> kinds, IImmutableSet<string> kinds,
CancellationToken cancellationToken) CancellationToken cancellationToken)
{ {
_solution = solution; _solution = solution;
...@@ -108,7 +108,7 @@ private async Task SearchAsyncWorker(Project project) ...@@ -108,7 +108,7 @@ private async Task SearchAsyncWorker(Project project)
{ {
using (cacheService.EnableCaching(project.Id)) using (cacheService.EnableCaching(project.Id))
{ {
var service = project.LanguageServices.GetService<INavigateToSearchService>(); var service = TryGetNavigateToSearchService(project);
if (service != null) if (service != null)
{ {
var searchTask = _currentDocument != null var searchTask = _currentDocument != null
......
...@@ -4,9 +4,13 @@ ...@@ -4,9 +4,13 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Threading; using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.NavigateTo;
using Microsoft.CodeAnalysis.Shared.TestHooks; using Microsoft.CodeAnalysis.Shared.TestHooks;
using Microsoft.VisualStudio.Language.NavigateTo.Interfaces; using Microsoft.VisualStudio.Language.NavigateTo.Interfaces;
using Roslyn.Utilities; using Roslyn.Utilities;
using INavigateToSearchService = Microsoft.CodeAnalysis.NavigateTo.INavigateToSearchService;
using INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate = Microsoft.CodeAnalysis.NavigateTo.INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate;
namespace Microsoft.CodeAnalysis.Editor.Implementation.NavigateTo namespace Microsoft.CodeAnalysis.Editor.Implementation.NavigateTo
{ {
...@@ -30,21 +34,50 @@ internal partial class NavigateToItemProvider : INavigateToItemProvider2 ...@@ -30,21 +34,50 @@ internal partial class NavigateToItemProvider : INavigateToItemProvider2
_displayFactory = new NavigateToItemDisplayFactory(); _displayFactory = new NavigateToItemDisplayFactory();
} }
public ISet<string> KindsProvided { get; } = ImmutableHashSet.Create( ISet<string> INavigateToItemProvider2.KindsProvided => KindsProvided;
NavigateToItemKind.Class,
NavigateToItemKind.Constant, public ImmutableHashSet<string> KindsProvided
NavigateToItemKind.Delegate, {
NavigateToItemKind.Enum, get
NavigateToItemKind.EnumItem, {
NavigateToItemKind.Event, var result = ImmutableHashSet.Create<string>(StringComparer.Ordinal);
NavigateToItemKind.Field, foreach (var project in _workspace.CurrentSolution.Projects)
NavigateToItemKind.Interface, {
NavigateToItemKind.Method, var navigateToSearchService = TryGetNavigateToSearchService(project);
NavigateToItemKind.Module, if (navigateToSearchService != null)
NavigateToItemKind.Property, {
NavigateToItemKind.Structure); result = result.Union(navigateToSearchService.KindsProvided);
}
public bool CanFilter => true; }
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() public void StopSearch()
{ {
...@@ -87,10 +120,10 @@ private bool GetSearchCurrentDocumentOptionWorker(INavigateToCallback callback) ...@@ -87,10 +120,10 @@ private bool GetSearchCurrentDocumentOptionWorker(INavigateToCallback callback)
public void StartSearch(INavigateToCallback callback, string searchValue, INavigateToFilterParameters filter) 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(); this.StopSearch();
...@@ -118,5 +151,47 @@ private void StartSearch(INavigateToCallback callback, string searchValue, ISet< ...@@ -118,5 +151,47 @@ private void StartSearch(INavigateToCallback callback, string searchValue, ISet<
searcher.Search(); 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 @@ ...@@ -6,7 +6,7 @@
namespace Microsoft.CodeAnalysis.CSharp.NavigateTo namespace Microsoft.CodeAnalysis.CSharp.NavigateTo
{ {
[ExportLanguageService(typeof(INavigateToSearchService), LanguageNames.CSharp), Shared] [ExportLanguageService(typeof(INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate), LanguageNames.CSharp), Shared]
internal class CSharpNavigateToSearchService : AbstractNavigateToSearchService internal class CSharpNavigateToSearchService : AbstractNavigateToSearchService
{ {
} }
......
...@@ -23,21 +23,21 @@ internal abstract partial class AbstractNavigateToSearchService ...@@ -23,21 +23,21 @@ internal abstract partial class AbstractNavigateToSearchService
new ConditionalWeakTable<Project, Tuple<string, ImmutableArray<SearchResult>>>(); new ConditionalWeakTable<Project, Tuple<string, ImmutableArray<SearchResult>>>();
public static Task<ImmutableArray<INavigateToSearchResult>> SearchProjectInCurrentProcessAsync( 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( return FindSearchResultsAsync(
project, searchDocument: null, pattern: searchPattern, kinds, cancellationToken: cancellationToken); project, searchDocument: null, pattern: searchPattern, kinds, cancellationToken: cancellationToken);
} }
public static Task<ImmutableArray<INavigateToSearchResult>> SearchDocumentInCurrentProcessAsync( 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( return FindSearchResultsAsync(
document.Project, document, searchPattern, kinds, cancellationToken); document.Project, document, searchPattern, kinds, cancellationToken);
} }
private static async Task<ImmutableArray<INavigateToSearchResult>> FindSearchResultsAsync( 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 // If the user created a dotted pattern then we'll grab the last part of the name
var (patternName, patternContainerOpt) = PatternMatcher.GetNameAndContainer(pattern); var (patternName, patternContainerOpt) = PatternMatcher.GetNameAndContainer(pattern);
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Remote; using Microsoft.CodeAnalysis.Remote;
...@@ -12,25 +13,25 @@ namespace Microsoft.CodeAnalysis.NavigateTo ...@@ -12,25 +13,25 @@ namespace Microsoft.CodeAnalysis.NavigateTo
internal abstract partial class AbstractNavigateToSearchService internal abstract partial class AbstractNavigateToSearchService
{ {
private async Task<ImmutableArray<INavigateToSearchResult>> SearchDocumentInRemoteProcessAsync( 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 solution = document.Project.Solution;
var serializableResults = await client.TryRunCodeAnalysisRemoteAsync<IList<SerializableNavigateToSearchResult>>( var serializableResults = await client.TryRunCodeAnalysisRemoteAsync<IList<SerializableNavigateToSearchResult>>(
solution, nameof(IRemoteNavigateToSearchService.SearchDocumentAsync), 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)); return serializableResults.SelectAsArray(r => r.Rehydrate(solution));
} }
private async Task<ImmutableArray<INavigateToSearchResult>> SearchProjectInRemoteProcessAsync( 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 solution = project.Solution;
var serializableResults = await client.TryRunCodeAnalysisRemoteAsync<IList<SerializableNavigateToSearchResult>>( var serializableResults = await client.TryRunCodeAnalysisRemoteAsync<IList<SerializableNavigateToSearchResult>>(
solution, nameof(IRemoteNavigateToSearchService.SearchProjectAsync), 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)); return serializableResults.SelectAsArray(r => r.Rehydrate(solution));
} }
......
...@@ -7,10 +7,26 @@ ...@@ -7,10 +7,26 @@
namespace Microsoft.CodeAnalysis.NavigateTo 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( 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); var client = await TryGetRemoteHostClientAsync(document.Project, cancellationToken).ConfigureAwait(false);
if (client == null) if (client == null)
...@@ -26,7 +42,7 @@ internal abstract partial class AbstractNavigateToSearchService : INavigateToSea ...@@ -26,7 +42,7 @@ internal abstract partial class AbstractNavigateToSearchService : INavigateToSea
} }
public async Task<ImmutableArray<INavigateToSearchResult>> SearchProjectAsync( 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); var client = await TryGetRemoteHostClientAsync(project, cancellationToken).ConfigureAwait(false);
if (client == null) 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. // 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.Collections.Immutable;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
...@@ -8,9 +8,27 @@ ...@@ -8,9 +8,27 @@
namespace Microsoft.CodeAnalysis.NavigateTo namespace Microsoft.CodeAnalysis.NavigateTo
{ {
[Obsolete("Use " + nameof(INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate) + " instead.")]
internal interface INavigateToSearchService : ILanguageService internal interface INavigateToSearchService : ILanguageService
{ {
Task<ImmutableArray<INavigateToSearchResult>> SearchProjectAsync(Project project, 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, ISet<string> kinds, 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 ...@@ -5,7 +5,7 @@ Imports Microsoft.CodeAnalysis.Host.Mef
Imports Microsoft.CodeAnalysis.NavigateTo Imports Microsoft.CodeAnalysis.NavigateTo
Namespace Microsoft.CodeAnalysis.VisualBasic.NavigateTo Namespace Microsoft.CodeAnalysis.VisualBasic.NavigateTo
<ExportLanguageService(GetType(INavigateToSearchService), LanguageNames.VisualBasic), [Shared]> <ExportLanguageService(GetType(INavigateToSearchService_RemoveInterfaceAboveAndRenameThisAfterInternalsVisibleToUsersUpdate), LanguageNames.VisualBasic), [Shared]>
Friend Class VisualBasicNavigateToSearchService Friend Class VisualBasicNavigateToSearchService
Inherits AbstractNavigateToSearchService Inherits AbstractNavigateToSearchService
End Class End Class
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册