提交 b29a186d 编写于 作者: H HeeJae Chang

add new vs search provider to Roslyn

vs search is new search experience VS is adding. this new feature is based on LSP extensions. so we added ILanguageClient and LSP server in Roslyn which for now only support new vs search capability.

in future, we might move some features over to LSP such as existing GoTo or FAR.
上级 6a81069d
......@@ -106,9 +106,10 @@
<MicrosoftVisualStudioLanguageCallHierarchyVersion>15.8.27812-alpha</MicrosoftVisualStudioLanguageCallHierarchyVersion>
<MicrosoftVisualStudioLanguageIntellisenseVersion>$(VisualStudioEditorPackagesVersion)</MicrosoftVisualStudioLanguageIntellisenseVersion>
<MicrosoftVisualStudioLanguageNavigateToInterfacesVersion>16.0.467</MicrosoftVisualStudioLanguageNavigateToInterfacesVersion>
<MicrosoftVisualStudioLanguageServerProtocolVersion>16.2.1078</MicrosoftVisualStudioLanguageServerProtocolVersion>
<MicrosoftVisualStudioLanguageServerProtocolExtensionsVersion>16.2.1078</MicrosoftVisualStudioLanguageServerProtocolExtensionsVersion>
<MicrosoftVisualStudioLanguageServerProtocolVersion>16.3.25-develop-g6ca6456f</MicrosoftVisualStudioLanguageServerProtocolVersion>
<MicrosoftVisualStudioLanguageServerProtocolExtensionsVersion>16.3.25-develop-g6ca6456f</MicrosoftVisualStudioLanguageServerProtocolExtensionsVersion>
<MicrosoftVisualStudioLanguageStandardClassificationVersion>$(VisualStudioEditorPackagesVersion)</MicrosoftVisualStudioLanguageStandardClassificationVersion>
<MicrosoftVisualStudioLanguageServerClientVersion>16.3.25-develop-g6ca6456f</MicrosoftVisualStudioLanguageServerClientVersion>
<MicrosoftVisualStudioLiveShareLanguageServicesVersion>1.0.181</MicrosoftVisualStudioLiveShareLanguageServicesVersion>
<MicrosoftVisualStudioLiveShareWebEditorsVersion>2.2.0-preview1-t001</MicrosoftVisualStudioLiveShareWebEditorsVersion>
<MicrosoftVisualStudioOLEInteropVersion>7.10.6071</MicrosoftVisualStudioOLEInteropVersion>
......@@ -170,7 +171,7 @@
<RoslynToolsLightUpSystemRuntimeLoaderFixedVersion>4.3.0</RoslynToolsLightUpSystemRuntimeLoaderFixedVersion>
<RoslynMicrosoftVisualStudioExtensionManagerVersion>0.0.4</RoslynMicrosoftVisualStudioExtensionManagerVersion>
<SourceBrowserVersion>1.0.21</SourceBrowserVersion>
<StreamJsonRpcVersion>2.0.167</StreamJsonRpcVersion>
<StreamJsonRpcVersion>2.0.187</StreamJsonRpcVersion>
<SystemBuffersVersion>4.5.0</SystemBuffersVersion>
<SystemCollectionsImmutableVersion>1.5.0</SystemCollectionsImmutableVersion>
<SystemCommandLineExperimentalVersion>0.1.0-alpha-63729-01</SystemCommandLineExperimentalVersion>
......
......@@ -10,6 +10,8 @@
<ServiceHubService Include="roslynRemoteHost" ClassName="Microsoft.CodeAnalysis.Remote.RemoteHostService" />
<ServiceHubService Include="roslynSnapshot" ClassName="Microsoft.CodeAnalysis.Remote.SnapshotService" />
<ServiceHubService Include="roslynRemoteSymbolSearchUpdateEngine" ClassName="Microsoft.CodeAnalysis.Remote.RemoteSymbolSearchUpdateEngine" />
<ServiceHubService Include="roslynCSharpLanguageServer" ClassName="Microsoft.CodeAnalysis.Remote.CSharpLanguageServer" />
<ServiceHubService Include="roslynVisualBasicLanguageServer" ClassName="Microsoft.CodeAnalysis.Remote.VisualBasicLanguageServer" />
</ItemGroup>
<PropertyGroup>
......
......@@ -9,6 +9,7 @@
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.Remote;
using Microsoft.CodeAnalysis.Remote.Services;
using Microsoft.VisualStudio.LanguageServices.Remote;
using Nerdbank;
using Roslyn.Utilities;
......@@ -142,23 +143,25 @@ public object GetService(Type serviceType)
private class InProcRemoteServices
{
private readonly ServiceProvider _serviceProvider;
private readonly Dictionary<string, Func<Stream, IServiceProvider, ServiceHubServiceBase>> _creatorMap;
private readonly Dictionary<string, Func<Stream, IServiceProvider, ServiceBase>> _creatorMap;
public InProcRemoteServices(bool runCacheCleanup)
{
_serviceProvider = new ServiceProvider(runCacheCleanup);
_creatorMap = new Dictionary<string, Func<Stream, IServiceProvider, ServiceHubServiceBase>>();
_creatorMap = new Dictionary<string, Func<Stream, IServiceProvider, ServiceBase>>();
RegisterService(WellKnownRemoteHostServices.RemoteHostService, (s, p) => new RemoteHostService(s, p));
RegisterService(WellKnownServiceHubServices.CodeAnalysisService, (s, p) => new CodeAnalysisService(s, p));
RegisterService(WellKnownServiceHubServices.SnapshotService, (s, p) => new SnapshotService(s, p));
RegisterService(WellKnownServiceHubServices.RemoteSymbolSearchUpdateEngine, (s, p) => new RemoteSymbolSearchUpdateEngine(s, p));
RegisterService(WellKnownServiceHubServices.CSharpLanguageServer, (s, p) => new CSharpLanguageServer(s, p));
RegisterService(WellKnownServiceHubServices.VisualBasicLanguageServer, (s, p) => new VisualBasicLanguageServer(s, p));
}
public AssetStorage AssetStorage => _serviceProvider.AssetStorage;
public TraceSource Logger { get; } = new TraceSource("Default");
public void RegisterService(string name, Func<Stream, IServiceProvider, ServiceHubServiceBase> serviceCreator)
public void RegisterService(string name, Func<Stream, IServiceProvider, ServiceBase> serviceCreator)
{
_creatorMap.Add(name, serviceCreator);
}
......
......@@ -5,7 +5,7 @@
<OutputType>Library</OutputType>
<RootNamespace>Microsoft.CodeAnalysis.LanguageServer</RootNamespace>
<TargetFramework>net472</TargetFramework>
<IsPackable>true</IsPackable>
<PackageDescription>
.NET Compiler Platform ("Roslyn") support for Language Server Protocol.
......@@ -16,7 +16,7 @@
<ProjectReference Include="..\..\..\Compilers\CSharp\Portable\Microsoft.CodeAnalysis.CSharp.csproj" />
<ProjectReference Include="..\..\..\EditorFeatures\Core\Microsoft.CodeAnalysis.EditorFeatures.csproj" />
</ItemGroup>
<ItemGroup>
<Reference Include="System.ComponentModel.Composition" />
<PackageReference Include="Microsoft.VisualStudio.LanguageServer.Protocol.Extensions" Version="$(MicrosoftVisualStudioLanguageServerProtocolExtensionsVersion)" />
......@@ -28,9 +28,10 @@
<InternalsVisibleTo Include="Microsoft.CodeAnalysis.LanguageServer.Protocol.UnitTests" />
<InternalsVisibleTo Include="Microsoft.VisualStudio.LanguageServices.LiveShare" />
<InternalsVisibleTo Include="Microsoft.VisualStudio.LanguageServices.LiveShare.UnitTests" />
<InternalsVisibleTo Include="Microsoft.CodeAnalysis.Remote.ServiceHub" />
<InternalsVisibleTo Include="Roslyn.Services.Test.Utilities" />
</ItemGroup>
<ItemGroup>
<PublicAPI Include="PublicAPI.Shipped.txt" />
<PublicAPI Include="PublicAPI.Unshipped.txt" />
......
......@@ -168,6 +168,15 @@ internal class CSharpVSResources {
}
}
/// <summary>
/// Looks up a localized string similar to C# Language Server Client.
/// </summary>
internal static string CSharp_language_server_client {
get {
return ResourceManager.GetString("CSharp_language_server_client", resourceCulture);
}
}
/// <summary>
/// Looks up a localized string similar to Discard.
/// </summary>
......
......@@ -600,4 +600,7 @@
<data name="Prefer_switch_expression" xml:space="preserve">
<value>Prefer switch expression</value>
</data>
<data name="CSharp_language_server_client" xml:space="preserve">
<value>C# Language Server Client</value>
</data>
</root>
\ No newline at end of file
// 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.ComponentModel.Composition;
using Microsoft.CodeAnalysis.Editor;
using Microsoft.CodeAnalysis.Remote;
using Microsoft.VisualStudio.Composition;
using Microsoft.VisualStudio.LanguageServer.Client;
using Microsoft.VisualStudio.LanguageServices.Implementation.LanguageService;
using Microsoft.VisualStudio.Utilities;
namespace Microsoft.VisualStudio.LanguageServices.CSharp.LanguageClient
{
// currently, platform doesn't allow multiple content types
// to be associated with 1 ILanguageClient forcing us to
// create multiple ILanguageClients for each content type
[ContentType(ContentTypeNames.CSharpContentType)]
[Export(typeof(ILanguageClient))]
[ExportMetadata("Capabilities", "WorkspaceStreamingSymbolProvider")]
internal class CSharpLanguageServerClient : AbstractLanguageServerClient
{
[ImportingConstructor]
public CSharpLanguageServerClient(VisualStudioWorkspace workspace)
: base(workspace,
WellKnownServiceHubServices.CSharpLanguageServer,
"ManagedLanguage.IDE.CSharpLanguageServer")
{
}
public override string Name => CSharpVSResources.CSharp_language_server_client;
}
}
......@@ -22,6 +22,11 @@
<target state="translated">Pravidla formátování jazyka C#</target>
<note />
</trans-unit>
<trans-unit id="CSharp_language_server_client">
<source>C# Language Server Client</source>
<target state="new">C# Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="Discard">
<source>Discard</source>
<target state="translated">Zahodit</target>
......
......@@ -22,6 +22,11 @@
<target state="translated">C#-Formatierungsregeln</target>
<note />
</trans-unit>
<trans-unit id="CSharp_language_server_client">
<source>C# Language Server Client</source>
<target state="new">C# Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="Discard">
<source>Discard</source>
<target state="translated">Verwerfen</target>
......
......@@ -22,6 +22,11 @@
<target state="translated">Reglas de formato de C#</target>
<note />
</trans-unit>
<trans-unit id="CSharp_language_server_client">
<source>C# Language Server Client</source>
<target state="new">C# Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="Discard">
<source>Discard</source>
<target state="translated">Descartar</target>
......
......@@ -22,6 +22,11 @@
<target state="translated">Règles de formatage C#</target>
<note />
</trans-unit>
<trans-unit id="CSharp_language_server_client">
<source>C# Language Server Client</source>
<target state="new">C# Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="Discard">
<source>Discard</source>
<target state="translated">Annuler</target>
......
......@@ -22,6 +22,11 @@
<target state="translated">Regole di formattazione C#</target>
<note />
</trans-unit>
<trans-unit id="CSharp_language_server_client">
<source>C# Language Server Client</source>
<target state="new">C# Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="Discard">
<source>Discard</source>
<target state="translated">Scarta</target>
......
......@@ -22,6 +22,11 @@
<target state="translated">C# 書式ルール</target>
<note />
</trans-unit>
<trans-unit id="CSharp_language_server_client">
<source>C# Language Server Client</source>
<target state="new">C# Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="Discard">
<source>Discard</source>
<target state="translated">破棄</target>
......
......@@ -22,6 +22,11 @@
<target state="translated">C# 서식 설정 규칙</target>
<note />
</trans-unit>
<trans-unit id="CSharp_language_server_client">
<source>C# Language Server Client</source>
<target state="new">C# Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="Discard">
<source>Discard</source>
<target state="translated">폐기</target>
......
......@@ -22,6 +22,11 @@
<target state="translated">Reguły formatowania kodu C#</target>
<note />
</trans-unit>
<trans-unit id="CSharp_language_server_client">
<source>C# Language Server Client</source>
<target state="new">C# Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="Discard">
<source>Discard</source>
<target state="translated">Odrzuć</target>
......
......@@ -22,6 +22,11 @@
<target state="translated">Regras de Formatação de C#</target>
<note />
</trans-unit>
<trans-unit id="CSharp_language_server_client">
<source>C# Language Server Client</source>
<target state="new">C# Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="Discard">
<source>Discard</source>
<target state="translated">Descarte</target>
......
......@@ -22,6 +22,11 @@
<target state="translated">Правила форматирования C#</target>
<note />
</trans-unit>
<trans-unit id="CSharp_language_server_client">
<source>C# Language Server Client</source>
<target state="new">C# Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="Discard">
<source>Discard</source>
<target state="translated">Отменить</target>
......
......@@ -22,6 +22,11 @@
<target state="translated">C# biçimlendirme kuralları</target>
<note />
</trans-unit>
<trans-unit id="CSharp_language_server_client">
<source>C# Language Server Client</source>
<target state="new">C# Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="Discard">
<source>Discard</source>
<target state="translated">At</target>
......
......@@ -22,6 +22,11 @@
<target state="translated">C# 格式规则</target>
<note />
</trans-unit>
<trans-unit id="CSharp_language_server_client">
<source>C# Language Server Client</source>
<target state="new">C# Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="Discard">
<source>Discard</source>
<target state="translated">放弃</target>
......
......@@ -22,6 +22,11 @@
<target state="translated">C# 格式化規則</target>
<note />
</trans-unit>
<trans-unit id="CSharp_language_server_client">
<source>C# Language Server Client</source>
<target state="new">C# Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="Discard">
<source>Discard</source>
<target state="translated">捨棄</target>
......
// 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.ComponentModel.Composition;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.VisualStudio.LanguageServer.Client;
using Microsoft.VisualStudio.Threading;
using Microsoft.CodeAnalysis.Remote;
using Microsoft.ServiceHub.Client;
using Microsoft.VisualStudio.LanguageServices.Remote;
namespace Microsoft.VisualStudio.LanguageServices.Implementation.LanguageService
{
internal abstract class AbstractLanguageServerClient : ILanguageClient
{
private readonly Workspace _workspace;
private readonly string _clientName;
private readonly string _languageServerName;
/// <summary>
/// Gets the name of the language client (displayed to the user).
/// </summary>
public abstract string Name { get; }
/// <summary>
/// Gets the configuration section names for the language client. This may be null if the language client
/// does not provide settings.
/// </summary>
public virtual IEnumerable<string> ConfigurationSections { get; } = null;
/// <summary>
/// Gets the initialization options object the client wants to send when 'initialize' message is sent.
/// This may be null if the client does not need custom initialization options.
/// </summary>
public virtual object InitializationOptions { get; } = null;
/// <summary>
/// Gets the list of file names to watch for changes. Changes will be sent to the server via 'workspace/didChangeWatchedFiles'
/// message. The files to watch must be under the current active workspace. The file names can be specified as a relative
/// paths to the exact file, or as glob patterns following the standard in .gitignore see https://www.kernel.org/pub/software/scm/git/docs/gitignore.html files.
/// </summary>
public virtual IEnumerable<string> FilesToWatch { get; } = null;
public event AsyncEventHandler<EventArgs> StartAsync;
public event AsyncEventHandler<EventArgs> StopAsync;
public AbstractLanguageServerClient(Workspace workspace, string languageServerName, string clientName)
{
_workspace = workspace;
_clientName = clientName;
_languageServerName = languageServerName;
}
public async Task<Connection> ActivateAsync(CancellationToken cancellationToken)
{
var client = await _workspace.TryGetRemoteHostClientAsync(cancellationToken).ConfigureAwait(false);
if (client == null)
{
// there is no OOP. either user turned it off, or process got killed.
}
var hostGroup = new HostGroup(client.ClientId);
var hubClient = new HubClient(_clientName);
var stream = await ServiceHubRemoteHostClient.Connections.RequestServiceAsync(
_workspace,
hubClient,
_languageServerName,
hostGroup,
TimeSpan.FromMinutes(60),
cancellationToken).ConfigureAwait(false);
return new Connection(stream, stream);
}
/// <summary>
/// Signals that the extension has been loaded. The server can be started immediately, or wait for user action to start.
/// To start the server, invoke the <see cref="StartAsync"/> event;
/// </summary>
public async Task OnLoadedAsync()
{
EnusreRemoteHost();
// wait until remote host is available before let platform know that they can activate our LSP
var client = await _workspace.TryGetRemoteHostClientAsync(CancellationToken.None).ConfigureAwait(false);
if (client == null)
{
// there is no OOP. either user turned it off, or process got killed.
// don't ask platform to start LSP
return;
}
// let platform know that they can start us
await StartAsync.InvokeAsync(this, EventArgs.Empty).ConfigureAwait(false);
void EnusreRemoteHost()
{
// this might get called before solution is fully loaded and before file is opened.
// we delay our OOP start until then, but user might do vsstart before that. so we make sure we start OOP if
// it is not running yet. multiple start is no-op
((RemoteHostClientServiceFactory.RemoteHostClientService)_workspace.Services.GetService<IRemoteHostClientService>()).Enable();
}
}
/// <summary>
/// Signals the extension that the language server has been successfully initialized.
/// </summary>
public Task OnServerInitializedAsync()
{
return Task.CompletedTask;
}
/// <summary>
/// Signals the extension that the language server failed to initialize.
/// </summary>
public Task OnServerInitializeFailedAsync(Exception e)
{
return Task.CompletedTask;
}
}
}
......@@ -6,8 +6,6 @@
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.ErrorReporting;
using Microsoft.CodeAnalysis.Extensions;
using Microsoft.CodeAnalysis.Remote;
using Microsoft.ServiceHub.Client;
using Roslyn.Utilities;
......@@ -17,7 +15,7 @@ namespace Microsoft.VisualStudio.LanguageServices.Remote
{
internal sealed partial class ServiceHubRemoteHostClient : RemoteHostClient
{
private static class Connections
internal static class Connections
{
/// <summary>
/// call <paramref name="funcAsync"/> and retry up to <paramref name="timeout"/> if the call throws
......
......@@ -179,6 +179,7 @@
<PackageReference Include="Microsoft.VisualStudio.Language.StandardClassification" Version="$(MicrosoftVisualStudioLanguageStandardClassificationVersion)" />
<PackageReference Include="Microsoft.VisualStudio.Language.Intellisense" Version="$(MicrosoftVisualStudioLanguageIntellisenseVersion)" />
<PackageReference Include="Microsoft.VisualStudio.LiveShare.LanguageServices" Version="$(MicrosoftVisualStudioLiveShareLanguageServicesVersion)" />
<PackageReference Include="Microsoft.VisualStudio.LanguageServer.Client" Version="$(MicrosoftVisualStudioLanguageServerClientVersion)" />
<PackageReference Include="Microsoft.Internal.VisualStudio.Shell.Interop.14.0.DesignTime" Version="$(MicrosoftInternalVisualStudioShellInterop140DesignTimeVersion)" />
<PackageReference Include="Microsoft.Internal.Performance.CodeMarkers.DesignTime" Version="$(MicrosoftInternalPerformanceCodeMarkersDesignTimeVersion)" />
<PackageReference Include="Microsoft.VisualStudio.Progression.CodeSchema" Version="$(MicrosoftVisualStudioProgressionCodeSchemaVersion)" />
......
......@@ -34,10 +34,14 @@
<Asset Type="Microsoft.ServiceHub.Service" d:Source="File" Path="roslynSnapshot.servicehub.service.json" />
<Asset Type="Microsoft.ServiceHub.Service" d:Source="File" Path="roslynCodeAnalysis.servicehub.service.json" />
<Asset Type="Microsoft.ServiceHub.Service" d:Source="File" Path="roslynRemoteSymbolSearchUpdateEngine.servicehub.service.json" />
<Asset Type="Microsoft.ServiceHub.Service" d:Source="File" Path="roslynCSharpLanguageServer.servicehub.service.json" />
<Asset Type="Microsoft.ServiceHub.Service" d:Source="File" Path="roslynVisualBasicLanguageServer.servicehub.service.json" />
<Asset Type="Microsoft.ServiceHub.Service" d:Source="File" Path="roslynRemoteHost64.servicehub.service.json" />
<Asset Type="Microsoft.ServiceHub.Service" d:Source="File" Path="roslynSnapshot64.servicehub.service.json" />
<Asset Type="Microsoft.ServiceHub.Service" d:Source="File" Path="roslynCodeAnalysis64.servicehub.service.json" />
<Asset Type="Microsoft.ServiceHub.Service" d:Source="File" Path="roslynRemoteSymbolSearchUpdateEngine64.servicehub.service.json" />
<Asset Type="Microsoft.ServiceHub.Service" d:Source="File" Path="roslynCSharpLanguageServer64.servicehub.service.json" />
<Asset Type="Microsoft.ServiceHub.Service" d:Source="File" Path="roslynVisualBasicLanguageServer64.servicehub.service.json" />
<Asset Type="Microsoft.VisualStudio.MefComponent" d:Source="Project" d:ProjectName="BasicVisualStudio" Path="|BasicVisualStudio|" />
<Asset Type="Microsoft.VisualStudio.MefComponent" d:Source="Project" d:ProjectName="CSharpVisualStudio" Path="|CSharpVisualStudio|" />
<Asset Type="Microsoft.VisualStudio.MefComponent" d:Source="Project" d:ProjectName="SolutionExplorerShim" Path="|SolutionExplorerShim|" />
......
......@@ -612,5 +612,14 @@ Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic
Return ResourceManager.GetString("VB_Coding_Conventions", resourceCulture)
End Get
End Property
'''<summary>
''' Looks up a localized string similar to VB Language Server Client.
'''</summary>
Friend Shared ReadOnly Property VB_language_server_client() As String
Get
Return ResourceManager.GetString("VB_language_server_client", resourceCulture)
End Get
End Property
End Class
End Namespace
......@@ -300,4 +300,7 @@
<data name="Show_items_from_unimported_namespaces" xml:space="preserve">
<value>Show items from unimported namespaces (experimental)</value>
</data>
<data name="VB_language_server_client" xml:space="preserve">
<value>VB Language Server Client</value>
</data>
</root>
\ No newline at end of file
' Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
Imports System.ComponentModel.Composition
Imports Microsoft.CodeAnalysis.Editor
Imports Microsoft.CodeAnalysis.Remote
Imports Microsoft.VisualStudio.LanguageServer.Client
Imports Microsoft.VisualStudio.LanguageServices.Implementation.LanguageService
Imports Microsoft.VisualStudio.Utilities
Namespace Microsoft.VisualStudio.LanguageServices.VisualBasic.LanguageClient
' currently, platform doesn't allow multiple content types
' to be associated with 1 ILanguageClient forcing us to
' create multiple ILanguageClients for each content type
<ContentType(ContentTypeNames.VisualBasicContentType)>
<Export(GetType(ILanguageClient))>
<ExportMetadata("Capabilities", "WorkspaceStreamingSymbolProvider")>
Friend Class VisualBasicLanguageServerClient
Inherits AbstractLanguageServerClient
<ImportingConstructor>
Public Sub New(workspace As VisualStudioWorkspace)
MyBase.New(workspace,
WellKnownServiceHubServices.VisualBasicLanguageServer,
"ManagedLanguage.IDE.VisualBasicLanguageServer")
End Sub
Public Overrides ReadOnly Property Name As String
Get
Return BasicVSResources.VB_language_server_client
End Get
End Property
End Class
End Namespace
......@@ -277,6 +277,11 @@
<target state="translated">Konvence kódování ve VB</target>
<note />
</trans-unit>
<trans-unit id="VB_language_server_client">
<source>VB Language Server Client</source>
<target state="new">VB Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="nothing_checking_colon">
<source>'nothing' checking:</source>
<target state="translated">'Kontrola hodnot nothing:</target>
......
......@@ -277,6 +277,11 @@
<target state="translated">VB-Codierungskonvention</target>
<note />
</trans-unit>
<trans-unit id="VB_language_server_client">
<source>VB Language Server Client</source>
<target state="new">VB Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="nothing_checking_colon">
<source>'nothing' checking:</source>
<target state="translated">'Überprüfung auf "nothing":</target>
......
......@@ -277,6 +277,11 @@
<target state="translated">Convenciones de código de VB</target>
<note />
</trans-unit>
<trans-unit id="VB_language_server_client">
<source>VB Language Server Client</source>
<target state="new">VB Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="nothing_checking_colon">
<source>'nothing' checking:</source>
<target state="translated">'Comprobación de "nothing":</target>
......
......@@ -277,6 +277,11 @@
<target state="translated">Conventions de codage VB</target>
<note />
</trans-unit>
<trans-unit id="VB_language_server_client">
<source>VB Language Server Client</source>
<target state="new">VB Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="nothing_checking_colon">
<source>'nothing' checking:</source>
<target state="translated">'Contrôle de 'nothing' :</target>
......
......@@ -277,6 +277,11 @@
<target state="translated">Convenzioni di scrittura codice VB</target>
<note />
</trans-unit>
<trans-unit id="VB_language_server_client">
<source>VB Language Server Client</source>
<target state="new">VB Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="nothing_checking_colon">
<source>'nothing' checking:</source>
<target state="translated">'Controllo 'nothing':</target>
......
......@@ -277,6 +277,11 @@
<target state="translated">VB コーディング規約</target>
<note />
</trans-unit>
<trans-unit id="VB_language_server_client">
<source>VB Language Server Client</source>
<target state="new">VB Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="nothing_checking_colon">
<source>'nothing' checking:</source>
<target state="translated">'nothing' のチェック中:</target>
......
......@@ -277,6 +277,11 @@
<target state="translated">VB 코딩 규칙</target>
<note />
</trans-unit>
<trans-unit id="VB_language_server_client">
<source>VB Language Server Client</source>
<target state="new">VB Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="nothing_checking_colon">
<source>'nothing' checking:</source>
<target state="translated">'nothing' 검사:</target>
......
......@@ -277,6 +277,11 @@
<target state="translated">Konwencje kodowania w języku VB</target>
<note />
</trans-unit>
<trans-unit id="VB_language_server_client">
<source>VB Language Server Client</source>
<target state="new">VB Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="nothing_checking_colon">
<source>'nothing' checking:</source>
<target state="translated">'Sprawdzanie „nothing”:</target>
......
......@@ -277,6 +277,11 @@
<target state="translated">Convenções do Codificação do VB</target>
<note />
</trans-unit>
<trans-unit id="VB_language_server_client">
<source>VB Language Server Client</source>
<target state="new">VB Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="nothing_checking_colon">
<source>'nothing' checking:</source>
<target state="translated">'verificação de 'nothing':</target>
......
......@@ -277,6 +277,11 @@
<target state="translated">Рекомендации по написанию кода VB</target>
<note />
</trans-unit>
<trans-unit id="VB_language_server_client">
<source>VB Language Server Client</source>
<target state="new">VB Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="nothing_checking_colon">
<source>'nothing' checking:</source>
<target state="translated">'Проверка значений "nothing":</target>
......
......@@ -277,6 +277,11 @@
<target state="translated">VB kodlama kuralları</target>
<note />
</trans-unit>
<trans-unit id="VB_language_server_client">
<source>VB Language Server Client</source>
<target state="new">VB Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="nothing_checking_colon">
<source>'nothing' checking:</source>
<target state="translated">'nothing' denetimi:</target>
......
......@@ -277,6 +277,11 @@
<target state="translated">vb 编码约定</target>
<note />
</trans-unit>
<trans-unit id="VB_language_server_client">
<source>VB Language Server Client</source>
<target state="new">VB Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="nothing_checking_colon">
<source>'nothing' checking:</source>
<target state="translated">'"nothing" 检查:</target>
......
......@@ -277,6 +277,11 @@
<target state="translated">VB 編碼慣例</target>
<note />
</trans-unit>
<trans-unit id="VB_language_server_client">
<source>VB Language Server Client</source>
<target state="new">VB Language Server Client</target>
<note />
</trans-unit>
<trans-unit id="nothing_checking_colon">
<source>'nothing' checking:</source>
<target state="translated">'nothing' 檢查:</target>
......
......@@ -11,11 +11,15 @@ public static void Set64bit(bool x64)
SnapshotService = "roslynSnapshot" + bit;
CodeAnalysisService = "roslynCodeAnalysis" + bit;
RemoteSymbolSearchUpdateEngine = "roslynRemoteSymbolSearchUpdateEngine" + bit;
CSharpLanguageServer = "roslynCSharpLanguageServer" + bit;
VisualBasicLanguageServer = "roslynVisualBasicLanguageServer" + bit;
}
public static string SnapshotService { get; private set; } = "roslynSnapshot";
public static string CodeAnalysisService { get; private set; } = "roslynCodeAnalysis";
public static string RemoteSymbolSearchUpdateEngine { get; private set; } = "roslynRemoteSymbolSearchUpdateEngine";
public static string CSharpLanguageServer { get; private set; } = "roslynCSharpLanguageServer";
public static string VisualBasicLanguageServer { get; private set; } = "roslynVisualBasicLanguageServer";
// these are OOP implementation itself should care. not features that consume OOP care
public const string ServiceHubServiceBase_Initialize = "Initialize";
......
......@@ -19,6 +19,7 @@
<ProjectReference Include="..\..\..\EditorFeatures\Core.Wpf\Microsoft.CodeAnalysis.EditorFeatures.Wpf.csproj" />
<ProjectReference Include="..\..\..\EditorFeatures\Core\Microsoft.CodeAnalysis.EditorFeatures.csproj" />
<ProjectReference Include="..\..\..\Features\Core\Portable\Microsoft.CodeAnalysis.Features.csproj" />
<ProjectReference Include="..\..\..\Features\LanguageServer\Protocol\Microsoft.CodeAnalysis.LanguageServer.Protocol.csproj" />
<ProjectReference Include="..\..\Core\Portable\Microsoft.CodeAnalysis.Workspaces.csproj" />
<ProjectReference Include="..\Core\Microsoft.CodeAnalysis.Remote.Workspaces.csproj" />
</ItemGroup>
......
// 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.Immutable;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.CodeAnalysis.Editor.Shared.Extensions;
using Microsoft.CodeAnalysis.LanguageServer;
using Microsoft.CodeAnalysis.NavigateTo;
using Microsoft.VisualStudio.LanguageServer.Protocol;
using Newtonsoft.Json;
using Roslyn.Utilities;
using StreamJsonRpc;
using LSP = Microsoft.VisualStudio.LanguageServer.Protocol;
namespace Microsoft.CodeAnalysis.Remote
{
// we need per language server for now since ILanguageClient
// doesn't allow multiple content types to be associated with
// one language server
internal class CSharpLanguageServer : LanguageServer
{
public CSharpLanguageServer(Stream stream, IServiceProvider serviceProvider)
: base(stream, serviceProvider, LanguageNames.CSharp)
{
}
}
internal class VisualBasicLanguageServer : LanguageServer
{
public VisualBasicLanguageServer(Stream stream, IServiceProvider serviceProvider)
: base(stream, serviceProvider, LanguageNames.VisualBasic)
{
}
}
internal abstract class LanguageServer : ServiceBase
{
private static readonly IImmutableSet<string> s_supportedKinds =
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);
private readonly string _languageName;
public LanguageServer(Stream stream, IServiceProvider serviceProvider, string languageName)
: base(serviceProvider, stream, SpecializedCollections.EmptyEnumerable<JsonConverter>())
{
_languageName = languageName;
StartService();
}
[JsonRpcMethod(Methods.InitializeName)]
public object Initialize(int? processId, string rootPath, Uri rootUri, ClientCapabilities capabilities, TraceSetting trace, CancellationToken cancellationToken)
{
// our LSP server only supports WorkspaceStreamingSymbolProvider capability
// for now
return new InitializeResult()
{
Capabilities = new VSServerCapabilities()
{
WorkspaceStreamingSymbolProvider = true
}
};
}
[JsonRpcMethod(Methods.InitializedName)]
public Task Initialized()
{
return Task.CompletedTask;
}
[JsonRpcMethod(Methods.ShutdownName)]
public void Shutdown(CancellationToken cancellationToken)
{
// our language server shutdown when VS shutdown
}
[JsonRpcMethod(VSSymbolMethods.WorkspaceBeginSymbolName)]
public Task<VSBeginSymbolParams> WorkspaceBeginSymbolAsync(string query, int searchId, CancellationToken cancellationToken)
{
return RunServiceAsync(async () =>
{
using (UserOperationBooster.Boost())
{
// for now, we use whatever solution we have currently. in future, we will add an ability to sync VS's current solution
// on demand from OOP side
await SearchAsync(SolutionService.PrimaryWorkspace.CurrentSolution, query, searchId, cancellationToken).ConfigureAwait(false);
return new VSBeginSymbolParams();
}
}, cancellationToken);
}
private async Task SearchAsync(Solution solution, string query, int searchId, CancellationToken cancellationToken)
{
foreach (var project in solution.Projects.Where(p => p.Language == _languageName))
{
cancellationToken.ThrowIfCancellationRequested();
var results = await AbstractNavigateToSearchService.SearchProjectInCurrentProcessAsync(
project,
ImmutableArray<Document>.Empty,
query,
s_supportedKinds,
cancellationToken).ConfigureAwait(false);
var lspResults = await Convert(results, cancellationToken).ConfigureAwait(false);
await InvokeAsync(
VSSymbolMethods.WorkspacePublishSymbolName,
new object[] { new VSPublishSymbolParams() { SearchId = searchId, Symbols = lspResults } },
cancellationToken).ConfigureAwait(false);
}
}
private static async Task<VSSymbolInformation[]> Convert(
ImmutableArray<INavigateToSearchResult> results, CancellationToken cancellationToken)
{
var symbols = new VSSymbolInformation[results.Length];
for (var i = 0; i < results.Length; i++)
{
var text = await results[i].NavigableItem.Document.GetTextAsync(cancellationToken).ConfigureAwait(false);
symbols[i] = new VSSymbolInformation()
{
Name = results[i].Name,
ContainerName = results[i].AdditionalInformation,
Kind = ProtocolConversions.NavigateToKindToSymbolKind(results[i].Kind),
Location = new LSP.Location()
{
Uri = new Uri(results[i].NavigableItem.Document.FilePath),
Range = ProtocolConversions.TextSpanToRange(results[i].NavigableItem.SourceSpan, text)
},
Icon = new VisualStudio.Text.Adornments.ImageElement(results[i].NavigableItem.Glyph.GetImageId())
};
}
return symbols;
}
}
}
......@@ -4,7 +4,6 @@
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
......@@ -17,20 +16,8 @@ namespace Microsoft.CodeAnalysis.Remote
{
// TODO: all service hub service should be extract to interface so that it can support multiple hosts.
// right now, tightly coupled to service hub
internal abstract class ServiceHubServiceBase : IDisposable
internal abstract class ServiceHubServiceBase : ServiceBase
{
private static int s_instanceId;
private readonly JsonRpc _rpc;
protected readonly int InstanceId;
protected readonly TraceSource Logger;
protected readonly AssetStorage AssetStorage;
[Obsolete("don't use RPC directly but use it through StartService and InvokeAsync", error: true)]
protected readonly JsonRpc Rpc;
/// <summary>
/// PinnedSolutionInfo.ScopeId. scope id of the solution. caller and callee share this id which one
/// can use to find matching caller and callee while exchanging data
......@@ -46,14 +33,76 @@ internal abstract class ServiceHubServiceBase : IDisposable
private RoslynServices _lazyRoslynServices;
private bool _disposed;
protected ServiceHubServiceBase(IServiceProvider serviceProvider, Stream stream)
: this(serviceProvider, stream, SpecializedCollections.EmptyEnumerable<JsonConverter>())
{
}
protected ServiceHubServiceBase(IServiceProvider serviceProvider, Stream stream, IEnumerable<JsonConverter> jsonConverters)
: base(serviceProvider, stream, jsonConverters)
{
}
protected RoslynServices RoslynServices
{
get
{
if (_lazyRoslynServices == null)
{
_lazyRoslynServices = new RoslynServices(_solutionInfo.ScopeId, AssetStorage, RoslynServices.HostServices);
}
return _lazyRoslynServices;
}
}
protected Task<Solution> GetSolutionAsync(CancellationToken cancellationToken)
{
Contract.ThrowIfNull(_solutionInfo);
return GetSolutionAsync(RoslynServices, _solutionInfo, cancellationToken);
}
protected Task<Solution> GetSolutionAsync(PinnedSolutionInfo solutionInfo, CancellationToken cancellationToken)
{
var localRoslynService = new RoslynServices(solutionInfo.ScopeId, AssetStorage, RoslynServices.HostServices);
return GetSolutionAsync(localRoslynService, solutionInfo, cancellationToken);
}
public virtual void Initialize(PinnedSolutionInfo info)
{
// set pinned solution info
_lazyRoslynServices = null;
_solutionInfo = info;
}
private static Task<Solution> GetSolutionAsync(RoslynServices roslynService, PinnedSolutionInfo solutionInfo, CancellationToken cancellationToken)
{
var solutionController = (ISolutionController)roslynService.SolutionService;
return solutionController.GetSolutionAsync(solutionInfo.SolutionChecksum, solutionInfo.FromPrimaryBranch, solutionInfo.WorkspaceVersion, cancellationToken);
}
}
/// <summary>
/// Base type with helper methods. this is not tied to how Roslyn OOP works. just servicehub helpers.
/// </summary>
internal abstract class ServiceBase : IDisposable
{
private static int s_instanceId;
private readonly JsonRpc _rpc;
protected readonly int InstanceId;
protected readonly TraceSource Logger;
protected readonly AssetStorage AssetStorage;
[Obsolete("don't use RPC directly but use it through StartService and InvokeAsync", error: true)]
protected readonly JsonRpc Rpc;
private bool _disposed;
protected ServiceBase(IServiceProvider serviceProvider, Stream stream, IEnumerable<JsonConverter> jsonConverters)
{
InstanceId = Interlocked.Add(ref s_instanceId, 1);
_disposed = false;
......@@ -82,19 +131,6 @@ protected ServiceHubServiceBase(IServiceProvider serviceProvider, Stream stream,
protected string DebugInstanceString => $"{GetType()} ({InstanceId})";
protected RoslynServices RoslynServices
{
get
{
if (_lazyRoslynServices == null)
{
_lazyRoslynServices = new RoslynServices(_solutionInfo.ScopeId, AssetStorage, RoslynServices.HostServices);
}
return _lazyRoslynServices;
}
}
protected bool IsDisposed => ((IDisposableObservable)_rpc).IsDisposed;
protected void StartService()
......@@ -131,19 +167,6 @@ protected Task InvokeAsync(string targetName, CancellationToken cancellationToke
return _rpc.InvokeWithCancellationAsync(targetName, arguments?.AsArray(), cancellationToken);
}
protected Task<Solution> GetSolutionAsync(CancellationToken cancellationToken)
{
Contract.ThrowIfNull(_solutionInfo);
return GetSolutionAsync(RoslynServices, _solutionInfo, cancellationToken);
}
protected Task<Solution> GetSolutionAsync(PinnedSolutionInfo solutionInfo, CancellationToken cancellationToken)
{
var localRoslynService = new RoslynServices(solutionInfo.ScopeId, AssetStorage, RoslynServices.HostServices);
return GetSolutionAsync(localRoslynService, solutionInfo, cancellationToken);
}
protected virtual void Dispose(bool disposing)
{
// do nothing here
......@@ -154,13 +177,6 @@ protected void LogError(string message)
Log(TraceEventType.Error, message);
}
public virtual void Initialize(PinnedSolutionInfo info)
{
// set pinned solution info
_lazyRoslynServices = null;
_solutionInfo = info;
}
public void Dispose()
{
if (_disposed)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册