Skip to content

Allow other VS Code extensions to install LSP middleware on language feature responses - #64583

Open
Andrew Branch (andrewbranch) wants to merge 7 commits into
microsoft:mainfrom
andrewbranch:agents/add-lsp-middleware-api-vscode-extension
Open

Andrew Branch (andrewbranch) wants to merge 7 commits into
microsoft:mainfrom
andrewbranch:agents/add-lsp-middleware-api-vscode-extension

Conversation

@andrewbranch

Copy link
Copy Markdown
Member

Closes #63800

The second commit moves types for our VS Code extension API into the typescript package, generating a big chunk of the language server protocol, since middleware registration exposes it.

Example usage:

import * as vscode from "vscode";
import type { ExtensionAPI } from "typescript/unstable/vscode";

export async function activate(context: vscode.ExtensionContext) {
    const extension = vscode.extensions.getExtension<ExtensionAPI>(
        "TypeScriptTeam.native-preview",
    );
    if (!extension) return;

    const extensionAPI = await extension.activate();
    context.subscriptions.push(
        extensionAPI.registerLspMiddleware("textDocument/hover", (hover, context) => {
            if (!hover || !context.params.textDocument.uri.endsWith(".vue")) {
                return hover;
            }
            return {
                ...hover,
                contents: { kind: "markdown", value: "Custom hover for Vue files" },
            };
        }),
    );
}

Copilot AI balanced review requested due to automatic review settings October 1, 2026 23:32
@typescript-automation typescript-automation Bot added Author: Team For Uncommitted Bug PR for untriaged, rejected, closed or missing bug labels Oct 1, 2026
@@ -0,0 +1,31 @@
import fs from "node:fs";

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps time we just move LSP gen all the way up to the main scripts dir

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟢 Approval recommended

The implementation is internally consistent, fault-isolated, and covered by focused runtime and generation tests.

Review effort: Balanced
Findings: None

What changed in this PR

Adds a public unstable VS Code extension API for transforming supported LSP language-feature responses.

Changes:

  • Implements restart-safe middleware registration, chaining, cancellation, disposal, and error recovery.
  • Generates strongly typed middleware protocol definitions from the shared LSP model.
  • Adds comprehensive runtime, protocol, public-type, and generation tests.
File Description
tsc/​internal/​lsp/​lsproto/​_generate/​typeScript.mts Generates reachable TypeScript LSP types.
tsc/​internal/​lsp/​lsproto/​_generate/​generateTypeScript.mts Drives protocol type generation.
tsc/​internal/​lsp/​lsproto/​_generate/​generate.mts Exposes an isolated wire-model snapshot.
tools/​scripts/​gen/​lspTypeScript.test.mts Tests protocol generation and parsing.
tools/​scripts/​gen/​generatedFile.test.mts Verifies both generated LSP outputs remain current.
packages/​vscode-typescript/​tsconfig.json Resolves the shared extension API source.
packages/​vscode-typescript/​test/​tsconfig.json Scopes extension test compilation.
packages/​vscode-typescript/​test/​lspMiddleware.test.ts Tests middleware behavior and public types.
packages/​vscode-typescript/​test/​index.test.ts Registers the middleware test suite.
packages/​vscode-typescript/​src/​session.ts Owns middleware across server restarts.
packages/​vscode-typescript/​src/​lspMiddleware.ts Implements middleware registration and execution.
packages/​vscode-typescript/​src/​extension.ts Exposes middleware registration publicly.
packages/​vscode-typescript/​src/​contentMapperContributions.ts Uses shared extension API types.
packages/​vscode-typescript/​src/​client.ts Routes requests through the registry.
packages/​vscode-typescript/​package.json Adds the local API package dependency.
packages/​typescript/​src/​vscode/​protocol.generated.ts Provides generated middleware protocol types.
packages/​typescript/​src/​vscode/​extensionApi.ts Defines the unstable extension API.
packages/​typescript/​package.json Exports the new type-only API path.
package-lock.json Records the workspace dependency.
Herebyfile.mjs Integrates protocol type generation.

💡 Add a code-review agent skill for context-aware, tailored reviews. Learn more in the docs.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Author: Team For Uncommitted Bug PR for untriaged, rejected, closed or missing bug

Projects

Status: Not started

Development

Successfully merging this pull request may close these issues.

API usage patterns for complex editor extensions

3 participants