Skip to content

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

Merged
Andrew Branch (andrewbranch) merged 11 commits into
microsoft:mainfrom
andrewbranch:agents/add-lsp-middleware-api-vscode-extension
Oct 2, 2026
Merged

Andrew Branch (andrewbranch) merged 11 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
Comment thread tools/scripts/lsp/generateTypeScript.mts

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.

Comment thread packages/vscode-typescript/tsconfig.json Outdated

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.

✅ if there's a good reason for the .. rootDir

Comment thread packages/vscode-typescript/tsconfig.json Outdated
Comment thread packages/typescript/src/vscode/protocol.generated.ts Outdated
@andrewbranch
Andrew Branch (andrewbranch) added this pull request to the merge queue Oct 2, 2026
Merged via the queue into microsoft:main with commit 0ad3777 Oct 2, 2026
29 checks passed
@andrewbranch
Andrew Branch (andrewbranch) deleted the agents/add-lsp-middleware-api-vscode-extension branch October 2, 2026 21:58
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: Done

Development

Successfully merging this pull request may close these issues.

API usage patterns for complex editor extensions

4 participants