言語サーバー プロトコルの拡張機能を追加します。Add a Language Server Protocol extension

言語サーバー プロトコル (LSP) は、JSON RPC v2.0 では、言語のさまざまなコード エディターにサービスの機能を提供するために使用の形式での一般的なプロトコルです。The Language Server Protocol (LSP) is a common protocol, in the form of JSON RPC v2.0, used to provide language service features to various code editors. プロトコルを使用して、言語の IntelliSense、エラーの診断のようなサービスの機能を提供する、すべての参照、お客様の LSP をサポートするさまざまなコード エディターになどを検索するサーバーを 1 つの言語を記述できます。Using the protocol, developers can write a single language server to provide language service features like IntelliSense, error diagnostics, find all references, etc. to various code editors that support the LSP. Visual Studio での言語サービスを追加して、いずれかでこれまでは、構文の強調表示など、または Visual Studio 機能拡張 Api の完全なセットを使用してカスタム言語サービスを記述することで、基本的な機能を提供する TextMate 文法ファイルを使用するには高度なデータを提供します。Traditionally, language services in Visual Studio can be added by either using TextMate grammar files to provide basic functionalities such as syntax highlighting, or by writing custom language services using the full set of Visual Studio extensibility APIs to provide richer data. お客様の LSP は、3 番目のオプション、サポートします。Now, support for the LSP offers a third option.

Visual Studio での言語サーバー プロトコルのサービス

言語サーバー プロトコルLanguage Server Protocol

言語サーバー プロトコルの実装

この記事では、LSP に基づく言語を使用している Visual Studio 拡張機能を作成する方法について説明します。This article describes how to create a Visual Studio extension that uses an LSP-based language server. LSP ベースの言語、サーバーが既に開発し、Visual Studio に統合することが想定しています。It assumes that you have already developed an LSP-based language server and just want to integrate it into Visual Studio.

Visual Studio 内でサポートについては、言語のサーバーは、ストリーム ベースの転送メカニズムを使用して、クライアント (Visual Studio) との通信できます。For support within Visual Studio, language servers can communicate with the client (Visual Studio) via any stream based transmission mechanism, for example:

  • 標準の入力/出力ストリームStandard input/output streams
  • 名前付きパイプNamed pipes
  • ソケット (TCP のみ)Sockets (TCP only)

LSP と Visual Studio でのサポートの目的は、Visual Studio 製品の一部ではない言語のオンボード サービスです。The intent of the LSP and support for it in Visual Studio is to onboard language services that are not part of Visual Studio product. (C# のような) Visual Studio での既存の言語サービスを拡張するものではありません。It is not intended to extend existing language services (like C#) in Visual Studio. 既存の言語を拡張するには、言語サービスの機能拡張ガイドを参照してください (たとえば、 "Roslyn".NET コンパイラ プラットフォーム)。To extend existing languages, refer to the language service’s extensibility guide (for example, the "Roslyn" .NET Compiler Platform).

ドキュメントを参照して、プロトコル自体の詳細については、ここします。For more information on the protocol itself, see the documentation here.

作成する方法の詳細については、サンプルの言語のサーバーまたは Visual Studio のコードに既存言語のサーバーを統合する方法ドキュメントを参照して、ここします。For more information on how to create a sample language server or how to integrate an existing language server into Visual Studio Code, see the documentation here.

言語サーバー プロトコルの機能がサポートされていますLanguage Server Protocol features supported

次の LSP 機能は、これまでに Visual Studio でサポートされます。The following LSP features are supported in Visual Studio so far:

メッセージMessage Visual Studio でサポートされていますHas Support in Visual Studio
初期化します。initialize yes
初期化済みinitialized yes
シャットダウンshutdown yes
終了exit yes
$/cancelRequest$/cancelRequest yes
window/showMessagewindow/showMessage yes
window/showMessageRequestwindow/showMessageRequest yes
ウィンドウ/logMessagewindow/logMessage yes
製品利用統計情報/イベントtelemetry/event
client/registerCapabilityclient/registerCapability
client/unregisterCapabilityclient/unregisterCapability
workspace/didChangeConfigurationworkspace/didChangeConfiguration yes
workspace/didChangeWatchedFilesworkspace/didChangeWatchedFiles yes
ワークスペース、またはシンボルworkspace/symbol yes
workspace/executeCommandworkspace/executeCommand yes
workspace/applyEditworkspace/applyEdit yes
textDocument/publishDiagnosticstextDocument/publishDiagnostics yes
textDocument/didOpentextDocument/didOpen yes
textDocument/didChangetextDocument/didChange yes
textDocument/willSavetextDocument/willSave
textDocument/willSaveWaitUntiltextDocument/willSaveWaitUntil
textDocument/didSavetextDocument/didSave yes
textDocument/didClosetextDocument/didClose yes
textDocument/完了textDocument/completion yes
完了/解決completion/resolve yes
textDocument/hovertextDocument/hover yes
textDocument/signatureHelptextDocument/signatureHelp yes
textDocument/参照textDocument/references yes
textDocument/documentHighlighttextDocument/documentHighlight yes
textDocument/documentSymboltextDocument/documentSymbol yes
textDocument/書式設定textDocument/formatting yes
textDocument/rangeFormattingtextDocument/rangeFormatting yes
textDocument/onTypeFormattingtextDocument/onTypeFormatting
textDocument/definitiontextDocument/definition yes
textDocument/codeActiontextDocument/codeAction yes
textDocument/codeLenstextDocument/codeLens
codeLens/resolvecodeLens/resolve
textDocument/documentLinktextDocument/documentLink
documentLink/resolvedocumentLink/resolve
textDocument/renametextDocument/rename yes

作業の開始Getting started

Note

以降では、Visual Studio 15.8 Preview 3、一般的な言語サーバー プロトコルのサポートは、Visual Studio に組み込まれています。Starting with Visual Studio 15.8 Preview 3, support for the common Language Server Protocol is built into Visual Studio. LSP 拡張機能のプレビューを使用して構築した場合言語サーバー クライアントの VSIXバージョンについてに 15.8 Preview 3 以降にアップグレードした後の操作停止されます。If you've built LSP extensions using our preview Language Server Client VSIX version, they will stop working once to you've upgraded to 15.8 Preview 3 or higher. 再度動作している LSP 拡張機能を取得するには、次を実行する必要があります。You will need to do the following to get your LSP extensions working again:

  1. Microsoft Visual Studio の言語サーバー プロトコル Preview VSIX をアンインストールします。Uninstall the Microsoft Visual Studio Language Server Protocol Preview VSIX. 15.8 Preview 4 以降、Visual Studio で、アップグレードを実行するたびに自動的に検出しのアップグレード処理中に VSIX のプレビューの削除します。Starting with 15.8 Preview 4, every time you perform an upgrade in Visual Studio, we will automatically detect and remove the preview VSIX for you during the upgrade process.

  2. Nuget 参照を最新の非プレビュー バージョンに更新LSP パッケージします。Update your Nuget reference to the latest non-preview version for LSP packages.

  3. VSIX マニフェストで、Microsoft Visual Studio 言語サーバー プロトコル プレビュー VSIX への依存関係を削除します。Remove the dependency to the Microsoft Visual Studio Language Server Protocol Preview VSIX in your VSIX manifest.

  4. VSIX は、インストール先の下限の境界として Visual Studio 15.8 Preview 3 を指定することを確認します。Make sure your VSIX specifies Visual Studio 15.8 Preview 3 as the lower bound for install target.

  5. 再構築し、再デプロイします。Rebuild and re-deploy.

VSIX プロジェクトを作成します。Create a VSIX project

LSP に基づく言語サーバーを使用して、言語サービス拡張を作成するには、最初に確認がある、 Visual Studio 拡張機能の開発ワークロードの VS インスタンスをインストールします。To create a language service extension using an LSP-based language server, first make sure you have the Visual Studio extension development Workload installed for your instance of VS.

次に移動して新しい空白 VSIXProject を作成ファイル > 新しいプロジェクト > Visual c# > 機能拡張 > VSIX プロジェクト:Next create a new blank VSIXProject by navigating to File > New Project > Visual C# > Extensibility > VSIX Project:

vsix プロジェクトを作成します。

言語のサーバーとランタイムのインストールLanguage server and runtime installation

既定では、言語もサーバー自体またはそれらを実行するために必要なランタイムで、Visual Studio の言語の LSP ベースのサーバーをサポートするために作成した拡張機能は含まれません。By default, the extensions created to support LSP-based language servers in Visual Studio will not contain the language servers themselves or the runtimes needed to execute them. 拡張機能の開発者は、言語のサーバーおよび必要なランタイムを配布する責任を負います。Extension developers are responsible for distributing the language servers and the runtimes needed. そのためにはいくつかの方法はあります。There are several ways to do so:

  • 言語のサーバーは、コンテンツ ファイルとして VSIX に埋め込むことができます。Language servers can be embedded in the VSIX as content files.
  • 言語サーバーをインストールする MSI の作成や、ランタイムが必要です。Create an MSI to install the language server and/or needed runtimes.
  • Marketplace をユーザーに伝えるのランタイムと言語のサーバーを取得する方法の手順を説明します。Provide instructions on Marketplace informing users how to obtain runtimes and language servers.

TextMate 文法ファイルTextMate grammar files

お客様の LSP では、言語のテキストの色づけを提供する方法の仕様は含まれません。The LSP does not include specification on how to provide text colorization for languages. カスタムの色づけの Visual Studio での言語を提供するには、拡張機能の開発者は、TextMate の文法ファイルを使用できます。To provide custom colorization for languages in Visual Studio, extension developers can use a TextMate grammar file. カスタム TextMate 文法またはテーマ ファイルを追加するには、次の手順を実行します。To add custom TextMate grammar or theme files, follow these steps:

  1. 拡張機能内で"Grammars"をという名前のフォルダーの作成 (または、選択した任意の名前であることができます)。Create a folder called "Grammars" inside your extension (or it can be whatever name you choose).

  2. 内で、文法フォルダーが含まれて *.tmlanguage*.plist*.tmtheme、または *.jsonするカスタムの色づけを提供するファイル。Inside the Grammars folder, include any *.tmlanguage, *.plist, *.tmtheme, or *.json files you’d like which provides custom colorization.

  3. クリックし、ファイルを右クリックしてプロパティします。Right-click on the files and select Properties. 変更、ビルドアクションをコンテンツVSIX に含めるプロパティを true にします。Change the Build action to Content and the Include in VSIX property to true.

  4. 作成、 .pkgdefファイルし、次のように行を追加します。Create a .pkgdef file and add a line similar to this:

    [$RootKey$\TextMate\Repositories]
    "MyLang"="$PackageFolder$\Grammars"
    
  5. クリックし、ファイルを右クリックしてプロパティします。Right-click on the files and select Properties. 変更、ビルドアクションをコンテンツVSIX に含めるプロパティを true にします。Change the Build action to Content and the Include in VSIX property to true.

前の手順が完了したら、文法フォルダー、パッケージのインストールに追加されますリポジトリ ソースとしてのディレクトリの名前 'MyLang' ('MyLang' 曖昧性除去の名ですし、一意の文字列を指定できます)。After completing the previous steps, a Grammars folder is added to the package’s install directory as a repository source named 'MyLang' ('MyLang' is just a name for disambiguation and can be any unique string). すべての文法 (.tmlanguageファイル) とテーマ ファイル (.tmthemeファイル) この directory が電位として選択し、TextMate で提供される組み込みの文法によりも優先されます。All of the grammars (.tmlanguage files) and theme files (.tmtheme files) in this directory are picked up as potentials and they supersede the built-in grammars provided with TextMate. 文法ファイルの宣言された拡張機能が開かれているファイルの拡張子に一致する場合は、TextMate は進みます。If the grammar file's declared extensions match the extension of the file being opened, TextMate will step in.

単純な言語のクライアントを作成します。Create a simple language client

メイン インターフェイス - ILanguageClientMain interface - ILanguageClient

VSIX プロジェクトを作成した後は、次の NuGet パッケージをプロジェクトに追加します。After creating your VSIX project, add the following NuGet package(s) to your project:

Note

前の手順が完了したら、NuGet パッケージの依存関係を取得すると、Newtonsoft.Json および StreamJsonRpc パッケージもプロジェクトに追加されます。When you take a dependency on the NuGet package after you complete the previous steps, the Newtonsoft.Json and StreamJsonRpc packages are added to your project as well. 特定のバージョンの Visual Studio でこれらの新しいバージョンをインストールすることがない場合に、これらのパッケージを更新できませんが、拡張機能のターゲットします。Do not update these packages unless you are certain that those new versions will be installed on the version of Visual Studio that your extension targets. アセンブリを含めることができません--、VSIX の代わりに、それらを集荷する Visual Studio のインストール ディレクトリから。The assemblies will not be included in your VSIX -- instead, they will be picked up from the Visual Studio installation directory. かどうか、拡張機能であるユーザーのコンピューターにインストールされている内容よりも新しいバージョンのアセンブリを参照しているは機能しませんします。If you are referencing a newer version of the assemblies than what is installed on a user's machine, your extension will not work.

実装する新しいクラスを作成し、 ILanguageClientインターフェイス、言語のクライアント言語の LSP ベース サーバーに接続するのに必要なメイン インターフェイスです。You can then create a new class that implements the ILanguageClient interface, the main interface needed for language clients connecting to an LSP-based language server.

サンプルを次に示します。The following is a sample:

namespace MockLanguageExtension
{
    [ContentType("bar")]
    [Export(typeof(ILanguageClient))]
    public class BarLanguageClient : ILanguageClient
    {
        public string Name => "Bar Language Extension";

        public IEnumerable<string> ConfigurationSections => null;

        public object InitializationOptions => null;

        public IEnumerable<string> FilesToWatch => null;

        public event AsyncEventHandler<EventArgs> StartAsync;
        public event AsyncEventHandler<EventArgs> StopAsync;

        public async Task<Connection> ActivateAsync(CancellationToken token)
        {
            await Task.Yield();

            ProcessStartInfo info = new ProcessStartInfo();
            info.FileName = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Server", @"MockLanguageServer.exe");
            info.Arguments = "bar";
            info.RedirectStandardInput = true;
            info.RedirectStandardOutput = true;
            info.UseShellExecute = false;
            info.CreateNoWindow = true;

            Process process = new Process();
            process.StartInfo = info;

            if (process.Start())
            {
                return new Connection(process.StandardOutput.BaseStream, process.StandardInput.BaseStream);
            }

            return null;
        }

        public async Task OnLoadedAsync()
        {
            await StartAsync?.InvokeAsync(this, EventArgs.Empty);
        }

        public async Task OnServerInitializeFailedAsync(Exception e)
        {
            return Task.CompletedTask;
        }

        public async Task OnServerInitializedAsync()
        {
            return Task.CompletedTask;
        }
    }
}

実装する必要がある主な方法はOnLoadedAsyncActivateAsyncします。The main methods that need to be implemented are OnLoadedAsync and ActivateAsync. OnLoadedAsync Visual Studio の拡張機能が読み込まれ、言語のサーバーを開始する準備がときに呼び出されます。OnLoadedAsync is called when Visual Studio has loaded your extension and your language server is ready to be started. このメソッドで呼び出すことができます、 StartAsync言語サーバーを起動する必要があります、または追加ロジックを実行し、呼び出すことができますを通知するには、すぐにデリゲートStartAsync以降。In this method, you can invoke the StartAsync delegate immediately to signal that the language server should be started, or you can do additional logic and invoke StartAsync later. 言語のサーバーを有効にするには、ある時点で StartAsync を呼び出す必要があります。To activate your language server, you must call StartAsync at some point.

ActivateAsync最終的に呼び出すことによって呼び出されたメソッドには、 StartAsync委任; 言語のサーバーを起動し、それへの接続を確立するためのロジックが含まれています。ActivateAsync is the method eventually invoked by calling the StartAsync delegate; it contains the logic to start the language server and establish connection to it. サーバーへの書き込みと、サーバーから読み取るのためのストリームを含む接続オブジェクトを返す必要があります。A connection object that contains streams for writing to the server and reading from the server must be returned. ここでスローされた例外がキャッチされ、Visual Studio での情報バー メッセージを使用してユーザーに表示されます。Any exceptions thrown here are caught and displayed to user via an InfoBar message in Visual Studio.

アクティベーションActivation

言語クライアント クラスが実装されると、その方法は Visual Studio に読み込まれるされ、アクティブ化を定義する 2 つの属性を定義する必要があります。Once your language client class is implemented, you'll need to define two attributes for it to define how it will be loaded into Visual Studio and activated:

  [Export(typeof(ILanguageClient))]
  [ContentType("bar")]

MEFMEF

Visual Studio を使用してMEF (Managed Extensibility Framework) の機能拡張ポイントを管理します。Visual Studio uses MEF (Managed Extensibility Framework) to manage its extensibility points. エクスポート属性は、このクラスを拡張ポイントとして選択し、適切な時に読み込まれることを Visual Studio を示します。The Export attribute indicates to Visual Studio that this class should be picked up as an extension point and loaded at the appropriate time.

MEF を使用して、VSIX マニフェストで、資産として MEF を定義することもあります。To use MEF, you must also define MEF as an Asset in the VSIX manifest.

VSIX マニフェスト デザイナーを開きに移動、資産 タブ。Open up your VSIX manifest designer and navigate to the Assets tab:

MEF の資産を追加します。

新しい資産を作成する新規をクリックします。Click new to create a new Asset:

MEF の資産を定義します。

  • : [microsoft.visualstudio.mefcomponent]Type: Microsoft.VisualStudio.MefComponent
  • ソース: 現在のソリューション内のプロジェクトSource: A project in the current solution
  • プロジェクト: [プロジェクト]Project: [Your project]

コンテンツ タイプの定義Content type definition

現在、LSP に基づく言語拡張を読み込めません唯一の方法は、ファイル コンテンツの種類ことです。Currently the only way to load your LSP-based language server extension is by file content type. つまり、言語クライアント クラスを定義するときに (実装ILanguageClient) の型を定義する必要がありますファイルを開くと、により、拡張機能を読み込むときにします。That is, when defining your language client class (which implements ILanguageClient), you will need to define the types of files that, when opened, will cause your extension to load. 定義されている、コンテンツの種類に一致するファイルは開かれず、拡張機能は読み込まれません。If no files that match your defined content type are opened, then your extension will not be loaded.

これは、1 つまたは複数の ContentTypeDefinition クラスの定義を通じて実行されます。This is done through defining one or more ContentTypeDefinition classes:

namespace MockLanguageExtension
{
    public class BarContentDefinition
    {
        [Export]
        [Name("bar")]
        [BaseDefinition(CodeRemoteContentDefinition.CodeRemoteContentTypeName)]
        internal static ContentTypeDefinition BarContentTypeDefinition;


        [Export]
        [FileExtension(".bar")]
        [ContentType("bar")]
        internal static FileExtensionToContentTypeDefinition BarFileExtensionDefinition;
    }
}

終わるファイルのコンテンツ タイプの定義を作成する前の例では、 .barファイル拡張子。In the previous example, a content type definition is created for files that end in .bar file extension. コンテンツ タイプの定義が"bar"という名前を指定し、する必要がありますから派生CodeRemoteContentTypeNameします。The content type definition is given the name "bar" and must derive from CodeRemoteContentTypeName.

コンテンツ タイプの定義を追加した後に言語クライアント クラスの拡張機能の言語クライアントを定義することができますし。After adding a content type definition, you can then define when to load your language client extension in the language client class:

    [ContentType("bar")]
    [Export(typeof(ILanguageClient))]
    public class BarLanguageClient : ILanguageClient
    {
    }

LSP 言語のサーバーのサポートの追加の場合、Visual Studio で独自のプロジェクト システムを実装するためにする必要はありません。Adding support for LSP language servers does not require you to implement your own project system in Visual Studio. 顧客は、Visual Studio で、言語サービスの使用を開始する 1 つのファイルまたはフォルダーを開くことができます。Customers can open a single file or a folder in Visual Studio to start using your language service. 実際には、LSP 言語のサーバーが開いているフォルダーまたはファイルのシナリオでのみ動作するように設計をサポートします。In fact, support for LSP language servers is designed to work only in open folder/file scenarios. カスタム プロジェクト システムが実装されている場合 (設定) などの一部の機能は機能しません。If a custom project system is implemented, some features (such as settings) will not work.

高度な機能Advanced features

設定Settings

カスタム言語固有サーバーの設定のサポートが使用可能なには、改善されて処理中です。Support for custom language-server-specific settings is available, but it is still in the process of being improved. 設定は、特定の言語のサーバーでサポートを通知し、通常、言語のサーバーがデータを出力する方法を制御します。Settings are specific to what the language server supports and usually control how the language server emits data. たとえば、言語サーバーには、報告されたエラーの最大数の設定があります。For example, a language server might have a setting for the maximum number of errors reported. 拡張機能の作成者は、特定のプロジェクトに対してユーザーによって変更できる既定値を定義します。Extension authors would define a default value, which can be changed by users for specific projects.

LSP 言語サービス拡張機能への設定のサポートを追加する以下の手順に従います。Follow these steps below to add support for settings to your LSP language service extension:

  1. JSON ファイルを追加 (たとえば、 MockLanguageExtensionSettings.json) 設定とその既定値を含むプロジェクト。Add a JSON file (for example, MockLanguageExtensionSettings.json) in your project that contains the settings and their default values. 例えば:For example:

    {
     "foo.maxNumberOfProblems": -1
    }
    
  2. JSON ファイルを右クリックし、選択プロパティします。Right-click on the JSON file and select Properties. 変更、ビルドアクションを「コンテンツ」、"VSIX に含める ' プロパティを true にします。Change the Build action to "Content" and the "Include in VSIX' property to true.

  3. ConfigurationSections を実装し、JSON ファイルで定義された設定のプレフィックスの一覧を返します (Visual Studio Code で、これにマップ package.json 内の構成セクション名)。Implement ConfigurationSections and return the list of prefixes for the settings defined in the JSON file (In Visual Studio Code, this would map to the configuration section name in package.json):

    public IEnumerable<string> ConfigurationSections
    {
       get
       {
           yield return "foo";
       }
    }
    
  4. .Pkgdef ファイルをプロジェクトに追加する (新しいテキスト ファイルを追加して、.pkgdef ファイル拡張子を変更)。Add a .pkgdef file to the project (add new text file and change the file extension to .pkgdef). Pkgdef ファイルには、この情報を含める必要があります。The pkgdef file should contain this info:

     [$RootKey$\OpenFolder\Settings\VSWorkspaceSettings\[settings-name]]
     @="$PackageFolder$\[settings-file-name].json"
    
  5. .Pkgdef ファイルを右クリックし、選択プロパティします。Right click on the .pkgdef file and select Properties. 変更、ビルドアクションをコンテンツVSIX に含めるプロパティを true にします。Change the Build action to Content and the Include in VSIX property to true.

  6. 開き、 source.extension.vsixmanifestファイルを開き、資産を追加、資産 タブ。Open up the source.extension.vsixmanifest file and add an asset in the Asset tab:

    vspackage の資産を編集します。

    • : Microsoft.VisualStudio.VsPackageType: Microsoft.VisualStudio.VsPackage
    • ソース: ファイル システム上のファイルSource: File on filesystem
    • パス: [へのパス、 .pkgdefファイル]Path: [Path to your .pkgdef file]

ユーザーのワークスペースの設定の編集User editing of settings for a workspace

  1. ユーザーは、サーバーを所有するファイルを含むワークスペースを開きます。User opens a workspace containing files your server owns.
  2. ユーザーが内のファイルを追加、 .vsという名前のフォルダー VSWorkspaceSettings.jsonします。User adds a file in the .vs folder called VSWorkspaceSettings.json.
  3. ユーザーは、線を追加、 VSWorkspaceSettings.jsonファイルの設定、サーバーを提供します。User adds a line to the VSWorkspaceSettings.json file for a setting the server provides. 例えば:For example:

    {
     "foo.maxNumberOfProblems": 10
    }
    

    診断トレースを有効にします。Enabling diagnostics tracing

    クライアントとサーバーで、問題をデバッグするときに役に立ちます間のすべてのメッセージを出力する診断トレースを有効にすることができます。Diagnostics tracing can be enabled to output all messages between the client and server, which can be useful when debugging issues. 診断トレースを有効にするには、次の操作を行います。To enable diagnostic tracing, do the following:

  4. 開くか、ワークスペースの設定ファイルを作成するVSWorkspaceSettings.json (「ユーザーのワークスペースの設定の編集」を参照してください)。Open or create the workspace settings file VSWorkspaceSettings.json (see "User editing of settings for a workspace").

  5. 設定の json ファイルでは、次の行を追加します。Add the following line in the settings json file:
{
    "foo.trace.server": "Off"
}

トレースの詳細度の 3 つの値があります。There are three possible values for trace verbosity:

  • オフ: トレースは完全にオフ"Off": tracing turned off completely
  • "Messages": トレースをオンが唯一のメソッドの名前、および応答の ID がトレースされます。"Messages": tracing turned on but only method name and response ID are traced.
  • "Verbose"トレースを有効にする場合。全体の rpc メッセージがトレースされます。"Verbose": tracing turned on; the entire rpc message is traced.

内のファイルに書き込まれるコンテンツにトレースを有効にする場合、 %temp%\VisualStudio\LSPディレクトリ。When tracing is turned on the content is written to a file in the %temp%\VisualStudio\LSP directory. 名前付け形式に依存して、ログ [LanguageClientName]-[時刻のタイムスタンプ] .logします。The log follows the naming format [LanguageClientName]-[Datetime Stamp].log. 現時点では、トレースは、フォルダーを開く場合のみ有効にできます。Currently, tracing can only be enabled for open folder scenarios. 言語サーバーをアクティブ化する 1 つのファイルを開くしても、診断トレースのサポートはありません。Opening a single file to activate a language server does not have diagnostics tracing support.

カスタム メッセージCustom messages

メッセージを渡すと、標準の言語サーバー プロトコルの一部ではない言語のサーバーから受信側のメッセージを容易にインプレース Api があります。There are APIs in place to facilitate passing messages to and receiving messages from the language server that are not part of the standard Language Server Protocol. カスタム メッセージを処理するために実装ILanguageClientCustomMessage言語クライアント クラスのインターフェイス。To handle custom messages, implement ILanguageClientCustomMessage interface in your language client class. VS StreamJsonRpcライブラリ、言語のクライアントとサーバーの言語の間でのカスタム メッセージの送信に使用されます。VS-StreamJsonRpc library is used to transmit custom messages between your language client and language server. LSP 言語クライアント拡張機能では、その他の Visual Studio 拡張機能と同様であるため (その他の Visual Studio Api を使用して) Visual Studio に、カスタム メッセージを介して、拡張機能の追加の機能 (お客様の LSP でサポートされていない) を追加するを決定できます。Since your LSP language client extension is just like any other Visual Studio extension, you can decide to add additional features (that are not supported by the LSP) to Visual Studio (using other Visual Studio APIs) in your extension through custom messages.

カスタム メッセージの受信Receiving custom messages

言語サーバーからのカスタム メッセージを受信するには、実装、 CustomMessageTargetプロパティILanguageClientCustomMessageカスタム メッセージを処理する方法を認識しているオブジェクトを返す.To receive custom messages from the language server, implement the CustomMessageTarget property on ILanguageClientCustomMessage and return an object that knows how to handle your custom messages. 次の例:Example below:

internal class MockCustomLanguageClient : MockLanguageClient, ILanguageClientCustomMessage
{
    private JsonRpc customMessageRpc;

    public MockCustomLanguageClient() : base()
    {
        CustomMessageTarget = new CustomTarget();
    }

    public object CustomMessageTarget
    {
        get;
        set;
    }

    public class CustomTarget
    {
        public void OnCustomNotification(JToken arg)
        {
            // Provide logic on what happens OnCustomNotification is called from the language server
        }

        public string OnCustomRequest(string test)
        {
            // Provide logic on what happens OnCustomRequest is called from the language server
        }
    }
}

カスタム メッセージを送信します。Sending custom messages

言語サーバーにカスタム メッセージを送信するには、実装、 AttachForCustomMessageAsyncメソッドILanguageClientCustomMessageします。To send custom messages to the language server, implement the AttachForCustomMessageAsync method on ILanguageClientCustomMessage. 言語のサーバーが開始され、メッセージを受信する準備がこのメソッドが呼び出されます。This method is invoked when your language server is started and ready to receive messages. A JsonRpcオブジェクトが、言語を使用してサーバーにメッセージを送信し、保持することができますをパラメーターとして渡されるVS StreamJsonRpc Api。A JsonRpc object is passed as a parameter, which you can then keep to send messages to the language server using VS-StreamJsonRpc APIs. 次の例:Example below:

internal class MockCustomLanguageClient : MockLanguageClient, ILanguageClientCustomMessage
{
    private JsonRpc customMessageRpc;

    public MockCustomLanguageClient() : base()
    {
        CustomMessageTarget = new CustomTarget();
    }

    public async Task AttachForCustomMessageAsync(JsonRpc rpc)
    {
        await Task.Yield();

        this.customMessageRpc = rpc;
    }

    public async Task SendServerCustomNotification(object arg)
    {    
        await this.customMessageRpc.NotifyWithParameterObjectAsync("OnCustomNotification", arg);
    }

    public async Task<string> SendServerCustomMessage(string test)
    {
        return await this.customMessageRpc.InvokeAsync<string>("OnCustomRequest", test);
    }
}

中間層Middle layer

場合によって、拡張機能の開発者は、言語のサーバーから送受信 LSP メッセージを途中受信する可能性があります。Sometimes an extension developer may want to intercept LSP messages sent to and received from the language server. など、拡張機能、開発者は、LSP メッセージを特定するには、送信されるメッセージ パラメーターを変更するまたは LSP 機能 (たとえば、入力候補) の言語のサーバーから返される結果を変更する可能性があります。For example, an extension developer may want to alter the message parameter sent for a particular LSP message, or modify the results returned from the language server for an LSP feature (for example completions). これが必要な場合、拡張機能の開発者は、LSP メッセージを先に MiddleLayer API を使用できます。When this is necessary, extension developers can use the MiddleLayer API to intercept LSP messages.

各 LSP メッセージには、傍受のための独自の中間層インターフェイスがあります。Each LSP message has its own middle layer interface for interception. 特定のメッセージを受信するには、そのメッセージを中間層インターフェイスを実装するクラスを作成します。To intercept a particular message, create a class that implements the middle layer interface for that message. 次に、実装、 ILanguageClientCustomMessage言語クライアント クラスのインターフェイスし、で、オブジェクトのインスタンスを返す、 MiddleLayerプロパティ。Then, implement the ILanguageClientCustomMessage interface in your language client class and return an instance of your object in the MiddleLayer property. 次の例:Example below:

public class MockLanguageClient: ILanguageClient, ILanguageClientCustomMessage
{
    public object MiddleLayer => MiddleLayerProvider.Instance;

    private class MiddleLayerProvider : ILanguageClientWorkspaceSymbolProvider
    {
        internal readonly static MiddleLayerProvider Instance = new MiddleLayerProvider();

        private MiddleLayerProvider()
        {
        }

        public async Task<SymbolInformation[]> RequestWorkspaceSymbols(WorkspaceSymbolParams param, Func<WorkspaceSymbolParams, Task<SymbolInformation[]>> sendRequest)
        {
            // Send along the request as given
            SymbolInformation[] symbols = await sendRequest(param);

            // Only return symbols that are "files"
            return symbols.Where(sym => string.Equals(new Uri(sym.Location.Uri).Scheme, "file", StringComparison.OrdinalIgnoreCase)).ToArray();
        }
    }
}

中間層機能は、まだ開発中とまだ包括的なです。The middle layer feature is still under development and not yet comprehensive.

LSP 言語サーバー拡張機能のサンプルSample LSP language server extension

Visual Studio での LSP クライアント API を使用して拡張機能のサンプルのソース コードについては、VSSDK のサンプル拡張機能を参照してください。 LSP サンプルします。To see the source code of a sample extension using the LSP client API in Visual Studio, see VSSDK-Extensibility-Samples LSP sample.

FAQFAQ

Visual Studio より豊富な機能のサポートを提供するために LSP 言語サーバーを補足するカスタム プロジェクト システムを構築したいこと移動する方法でしょうか。I would like to build a custom project system to supplement my LSP language server to provide richer feature support in Visual Studio, how do I go about doing that?

Visual Studio でサーバーを LSP ベースの言語のサポートに依存、フォルダーを開く機能カスタム プロジェクト システムを必要としないものでは具体的には。Support for LSP-based language servers in Visual Studio relies on the open folder feature and is specifically designed to not require a custom project system. 次の手順については、独自のカスタム プロジェクト システムを構築できますここ、設定など、一部の機能は機能しません。You can build your own custom project system following instructions here, but some features, such as settings, may not work. LSP 言語のサーバーの既定の初期化ロジックがカスタム プロジェクト システムを使用する場合は、言語、サーバーはことを確認するために初期化中にカスタム ロジックを提供する必要がありますので、現在開いているフォルダーのルート フォルダーの場所で渡すには正常に起動します。The default initialization logic for LSP language servers is to pass in the root folder location of the folder currently being opened, so if you use a custom project system, you may need to provide custom logic during initialization to ensure your language server can start properly.

デバッガーのサポートを追加する方法はありますかHow do I add debugger support?

サポートを提供する、共通のプロトコルをデバッグ将来のリリースでします。We will be providing support for the common debugging protocol in a future release.

VS サポートされている言語サービス インストールされている (たとえば、JavaScript など) が既にあるを場合できますはまだ LSP 言語サーバー拡張機能のインストール (lint 処理) などの他の機能を提供するでしょうか。If there is already a VS supported language service installed (for example, JavaScript), can I still install an LSP language server extension that offers additional features (such as linting)?

[はい] が、すべての機能は正常に動作します。Yes, but not all features will work properly. LSP 言語サーバー拡張機能の最終的な目標は、Visual Studio でネイティブにサポートされている言語サービスを有効にします。The ultimate goal for LSP language server extensions is to enable language services not natively supported by Visual Studio. LSP 言語のサーバーを使用して追加のサポートを提供する拡張機能を作成することができますが、一部の機能 (IntelliSense) などには、滑らかなエクスペリエンスはできません。You can create extensions that offer additional support using LSP language servers, but some features (such as IntelliSense) will not be a smooth experience. 一般に、LSP 言語サーバー拡張機能がない既存の拡張する、言語の新しいエクスペリエンスを提供することで使用することをお勧めします。In general, it is advised that LSP language server extensions be used for providing new language experiences, not extending existing ones.

完了 LSP 言語サーバー VSIX を発行場所ですか。Where do I publish my completed LSP language server VSIX?

Marketplace を参照してくださいここします。See the Marketplace instructions here.