サーバー プロトコルの言語拡張機能を追加します。Adding 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. プロトコルを使用して、すべての参照、LSP をサポートするさまざまなコード エディターになどを検索して、IntelliSense、エラーの診断などのサービス機能の言語を提供するサーバーを 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 での言語サービスを追加して、いずれかで従来、TextMate 文法ファイルを使用した、または Visual Studio 機能拡張 Api の完全なセットを使用してカスタム言語サービスを記述して構文を強調表示などの基本的な機能を提供するには多くのデータを提供します。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

詳細については、プロトコル自体に、ドキュメントを参照してここです。For more information on the protocol itself, see the documentation here. 言語のサーバー プロトコルの visual Studio の実装は、プレビュー段階とサポートは、実験的な考慮する必要があります。Visual Studio’s implementation of Language Server Protocol is in preview, and support should be considered experimental. このプレビュー リリースは、拡張機能の形式で (言語サーバー プロトコル クライアント プレビュー)、この拡張機能をインストールできるのみで、プレビュー チャネルの Visual Studio ですがです。The preview release is in the form of an extension (Language Server Protocol Client Preview), but this extension can only be installed on the preview channel of Visual Studio. Visual Studio の今後のリリースでは、プレビュー フラグの削除時に、言語のサーバー プロトコルの組み込みサポートが含まれます。A later release of Visual Studio will include built-in support for Language Server Protocol, at which time the Preview flag will be dropped. 運用環境ではプレビューを使用する必要があります。You should not use the preview for production purposes.

作成する方法の詳細については、サンプルの言語のサーバーまたは 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.

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

この記事では、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 the following mechanisms:

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

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).

サポートされている言語サーバー プロトコルの機能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
入力候補および resolvecompletion/resolve yes
textDocument/hovertextDocument/hover yes
textDocument/signatureHelptextDocument/signatureHelp yes
textDocument/参照textDocument/references yes
textDocument/documentHighlighttextDocument/documentHighlight
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

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 プロジェクトを作成します。

プレビュー リリースでは、LSP の VS サポートは、VSIX の形式になります (Microsoft.VisualStudio.LanguageServer.Client.Preview)。For the preview release, VS support for the LSP will be in the form of a VSIX (Microsoft.VisualStudio.LanguageServer.Client.Preview). LSP 言語サーバーを使用して拡張機能を作成する拡張機能の開発者は、この VSIX に依存関係を受け取る必要があります。Extension developers who wish to create an extension using LSP language servers must take a dependency on this VSIX. そのため、お客様をサーバーの言語拡張機能をインストールする言語サーバー プロトコル クライアント プレビュー VSIX 最初にインストールする必要があります。Therefore, customers wishing to install a language server extension must first install the Language Server Protocol Client Preview VSIX.

VSIX の依存関係を定義する (ダブルクリックして、プロジェクトの source.extension.vsixmanifest ファイル)、VSIX の VSIX マニフェスト デザイナーを開きに移動の依存関係:To define the VSIX dependency, open the VSIX manifest designer for your VSIX (by double-clicking the source.extension.vsixmanifest file in your project) and navigate to Dependencies:

言語のサーバー プロトコルのクライアントへの参照を追加します。

次のように新しい依存関係を作成します。Create a new dependency like the following:

言語サーバー プロトコルのクライアントの依存関係を定義します。

注意

ダウンロード URLユーザーの拡張機能のインストールが必要な依存関係をインストールする方法を知っているように入力する必要があります。The Download URL must be filled in so users installing your extension know how to install the required dependency.

言語のサーバーとランタイムのインストール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. 拡張機能内の「文法」をという名前のフォルダーを作成 (または、選択した任意の名前を指定できます)。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) このディレクトリ内および 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.

シンプルな言語のクライアントを作成します。Creating a simple language client

メインのインターフェイスのILanguageClientMain Interface - ILanguageClient

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

注意

前の手順を完了したら、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. コンテンツの種類の定義が「バー」という名前を指定し、必要がありますから派生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

カスタム言語固有サーバーの設定が、Visual Studio での LSP サポートのプレビュー リリースで使用可能ですが、改善が図ら処理中のサポートです。Support for custom language-server-specific settings is available for Preview release of LSP support in Visual Studio, 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. 変更、ビルド"Content"アクションおよび"VSIX に含める ' プロパティを true にします。Change the Build action to "Content" and the "Include in VSIX' property to true.

  3. ConfigurationSections を実装し、JSON ファイルで定義されている設定のプレフィックスの一覧を返します (Visual Studio コードで、これにマップ 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. 変更、ビルド"Content"と"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. ユーザーは、"VSWorkspaceSettings.json"と呼ばれる".vs"フォルダーにファイルを追加します。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.server.trace": "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]-[Datetime Stamp].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 言語サーバー拡張機能のインストール (linting) などの追加機能を提供するしますか。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.