From 4ef46a9f97a57aa1c18ee10ab8ea0d8a26bbd380 Mon Sep 17 00:00:00 2001 From: Princesseuh <3019731+Princesseuh@users.noreply.github.com> Date: Sun, 15 Dec 2024 03:35:13 +0100 Subject: [PATCH 1/3] feat(benchmark): Add benchmark for full language server --- .github/workflows/benchmark.yaml | 5 +- justfile | 2 + .../fixture/colors_benchmark.css | 17 ++ .../fixture/folding_benchmark.css | 74 ++++++ .../fixture/hover_benchmark.css | 3 + .../package.json | 8 +- .../src/benchmarks/css/colors.bench.ts | 54 +++++ .../src/benchmarks/css/folding.bench.ts | 32 +++ .../src/benchmarks/css/hover.bench.ts | 38 ++++ .../src}/server.ts | 69 ++++-- .../src}/tests/css/colors.test.ts | 0 .../src}/tests/css/folding.test.ts | 0 .../src}/tests/css/hover.test.ts | 0 .../src}/tests/init.test.ts | 0 .../src/tests/setup.ts | 9 + .../src}/tests/shutdown.test.ts | 1 - .../tsconfig.json | 0 .../vitest.config.bench.ts | 14 ++ .../vitest.config.ts | 4 +- .../language-server-tests/fixture/.gitkeep | 0 packages/language-server-tests/tests/setup.ts | 9 - pnpm-lock.yaml | 214 +++++++++++++++++- 22 files changed, 520 insertions(+), 33 deletions(-) create mode 100644 packages/language-server-tests-benchmarks/fixture/colors_benchmark.css create mode 100644 packages/language-server-tests-benchmarks/fixture/folding_benchmark.css create mode 100644 packages/language-server-tests-benchmarks/fixture/hover_benchmark.css rename packages/{language-server-tests => language-server-tests-benchmarks}/package.json (52%) create mode 100644 packages/language-server-tests-benchmarks/src/benchmarks/css/colors.bench.ts create mode 100644 packages/language-server-tests-benchmarks/src/benchmarks/css/folding.bench.ts create mode 100644 packages/language-server-tests-benchmarks/src/benchmarks/css/hover.bench.ts rename packages/{language-server-tests/tests => language-server-tests-benchmarks/src}/server.ts (90%) rename packages/{language-server-tests => language-server-tests-benchmarks/src}/tests/css/colors.test.ts (100%) rename packages/{language-server-tests => language-server-tests-benchmarks/src}/tests/css/folding.test.ts (100%) rename packages/{language-server-tests => language-server-tests-benchmarks/src}/tests/css/hover.test.ts (100%) rename packages/{language-server-tests => language-server-tests-benchmarks/src}/tests/init.test.ts (100%) create mode 100644 packages/language-server-tests-benchmarks/src/tests/setup.ts rename packages/{language-server-tests => language-server-tests-benchmarks/src}/tests/shutdown.test.ts (82%) rename packages/{language-server-tests => language-server-tests-benchmarks}/tsconfig.json (100%) create mode 100644 packages/language-server-tests-benchmarks/vitest.config.bench.ts rename packages/{language-server-tests => language-server-tests-benchmarks}/vitest.config.ts (92%) delete mode 100644 packages/language-server-tests/fixture/.gitkeep delete mode 100644 packages/language-server-tests/tests/setup.ts diff --git a/.github/workflows/benchmark.yaml b/.github/workflows/benchmark.yaml index b31c7a0..9e18824 100644 --- a/.github/workflows/benchmark.yaml +++ b/.github/workflows/benchmark.yaml @@ -37,6 +37,9 @@ jobs: - name: Install dependencies run: just install + - name: Build (native) + run: just build release + - name: Build (WASM) run: just build-wasm benchmark @@ -46,5 +49,5 @@ jobs: - name: Run the benchmarks uses: CodSpeedHQ/action@v3 with: - run: cargo codspeed run && pnpm -C ./packages/benchmark-wasm run benchmark-codspeed + run: cargo codspeed run && pnpm -C ./packages/benchmark-wasm run benchmark-codspeed && pnpm -C ./packages/language-server-tests-benchmarks run benchmark-codspeed token: ${{ secrets.CODSPEED_TOKEN }} diff --git a/justfile b/justfile index fdd8958..0615d2d 100644 --- a/justfile +++ b/justfile @@ -33,3 +33,5 @@ benchmark: cargo bench echo "Running WASM benchmarks..." pnpm -C ./packages/benchmark-wasm run benchmark --run + echo "Running Language Server benchmarks..." + pnpm -C ./packages/language-server-tests-benchmarks run benchmark --run diff --git a/packages/language-server-tests-benchmarks/fixture/colors_benchmark.css b/packages/language-server-tests-benchmarks/fixture/colors_benchmark.css new file mode 100644 index 0000000..4cbcf04 --- /dev/null +++ b/packages/language-server-tests-benchmarks/fixture/colors_benchmark.css @@ -0,0 +1,17 @@ +.header { + background-color: #333; + color: white; + padding: 15px 20px; + text-align: center; +} + +h1 { + color: red; + background-color: lab(50% 50% 50%); +} + +.header .logo { + font-size: 2rem; + font-weight: bold; + color: lch(50% 50% 50%); +} diff --git a/packages/language-server-tests-benchmarks/fixture/folding_benchmark.css b/packages/language-server-tests-benchmarks/fixture/folding_benchmark.css new file mode 100644 index 0000000..6255c22 --- /dev/null +++ b/packages/language-server-tests-benchmarks/fixture/folding_benchmark.css @@ -0,0 +1,74 @@ +/* General Layout */ +.container { + width: 100%; + padding: 20px; + margin: 0 auto; + max-width: 1200px; +} + +.header { + background-color: #333; + color: white; + padding: 15px 20px; + text-align: center; +} + +.header .logo { + font-size: 2rem; + font-weight: bold; +} + +.sidebar { + flex: 1; + padding: 20px; + background-color: #fff; + border-radius: 8px; + box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1); +} + +.footer { + margin-top: 40px; + padding: 20px; + background-color: #222; + color: white; + text-align: center; + font-size: 0.9rem; +} + +/* Media Queries */ +@media (max-width: 1024px) { + .content { + flex-direction: column; + align-items: center; + } + .main, + .sidebar { + width: 80%; + margin-bottom: 20px; + } +} + +@media (max-width: 768px) { + .header .logo { + font-size: 1.5rem; + } + .footer { + font-size: 0.8rem; + } +} + +@media (max-width: 480px) { + .container { + padding: 10px; + } + .header { + padding: 10px; + } + .content { + flex-direction: column; + } + .main, + .sidebar { + padding: 10px; + } +} diff --git a/packages/language-server-tests-benchmarks/fixture/hover_benchmark.css b/packages/language-server-tests-benchmarks/fixture/hover_benchmark.css new file mode 100644 index 0000000..d224431 --- /dev/null +++ b/packages/language-server-tests-benchmarks/fixture/hover_benchmark.css @@ -0,0 +1,3 @@ +h1 { + color: red; +} diff --git a/packages/language-server-tests/package.json b/packages/language-server-tests-benchmarks/package.json similarity index 52% rename from packages/language-server-tests/package.json rename to packages/language-server-tests-benchmarks/package.json index a1a3bfb..f359356 100644 --- a/packages/language-server-tests/package.json +++ b/packages/language-server-tests-benchmarks/package.json @@ -1,13 +1,17 @@ { - "name": "language-server-tests", + "name": "language-server-tests-benchmarks", "type": "module", "private": true, "scripts": { - "test": "vitest" + "test": "vitest", + "benchmark": "vitest bench -c vitest.config.bench.ts", + "benchmark-codspeed": "CODSPEED=true pnpm run benchmark" }, "dependencies": { + "@codspeed/vitest-plugin": "^3.1.1", "@types/node": "^22.10.1", "vitest": "^2.1.8", + "vscode-langservers-extracted": "^4.10.0", "vscode-languageclient": "^9.0.1", "vscode-languageserver-protocol": "^3.17.5", "vscode-languageserver-textdocument": "^1.0.12", diff --git a/packages/language-server-tests-benchmarks/src/benchmarks/css/colors.bench.ts b/packages/language-server-tests-benchmarks/src/benchmarks/css/colors.bench.ts new file mode 100644 index 0000000..1145676 --- /dev/null +++ b/packages/language-server-tests-benchmarks/src/benchmarks/css/colors.bench.ts @@ -0,0 +1,54 @@ +import { afterAll, bench, describe } from "vitest"; +import { startLanguageServer } from "../../server"; +import { fileURLToPath } from "url"; + +const filePath = fileURLToPath( + new URL("../../../fixture/colors_benchmark.css", import.meta.url) +); + +const weblsp = await startLanguageServer(undefined, "weblsp"); +const weblspUri = (await weblsp.openTextDocument(filePath, "css")).uri; +const weblspColors = await weblsp.sendDocumentColorRequest(weblspUri); + +const vscodeLsp = await startLanguageServer(undefined, "vscode-css"); +const vscodeLspUri = (await vscodeLsp.openTextDocument(filePath, "css")).uri; +const vscodeColors = await vscodeLsp.sendDocumentColorRequest(vscodeLspUri); + +describe("Document Colors", async () => { + bench("weblsp - Document Colors", async () => { + await weblsp.sendDocumentColorRequest(weblspUri); + }); + + if (!process.env.CODSPEED) { + bench("vscode-css-languageserver - Document Colors", async () => { + await vscodeLsp.sendDocumentColorRequest(vscodeLspUri); + }); + } +}); + +describe("Color Presentations", async () => { + bench("weblsp - Color Presentation", async () => { + await weblsp.sendColorPresentationRequest( + weblspUri, + weblspColors[0].color, + weblspColors[0].range + ); + }); + + if (!process.env.CODSPEED) { + bench("vscode-css-languageserver - Color Presentation", async () => { + await vscodeLsp.sendColorPresentationRequest( + vscodeLspUri, + vscodeColors[0].color, + vscodeColors[0].range + ); + }); + } + + afterAll(async () => { + await weblsp.shutdown(); + await vscodeLsp.shutdown(); + await weblsp.exit(); + await vscodeLsp.exit(); + }); +}); diff --git a/packages/language-server-tests-benchmarks/src/benchmarks/css/folding.bench.ts b/packages/language-server-tests-benchmarks/src/benchmarks/css/folding.bench.ts new file mode 100644 index 0000000..645e9da --- /dev/null +++ b/packages/language-server-tests-benchmarks/src/benchmarks/css/folding.bench.ts @@ -0,0 +1,32 @@ +import { afterAll, bench, describe } from "vitest"; +import { startLanguageServer } from "../../server"; +import { fileURLToPath } from "url"; + +const filePath = fileURLToPath( + new URL("../../../fixture/folding_benchmark.css", import.meta.url) +); + +const weblsp = await startLanguageServer(undefined, "weblsp"); +const weblspUri = (await weblsp.openTextDocument(filePath, "css")).uri; + +const vscodeLsp = await startLanguageServer(undefined, "vscode-css"); +const vscodeLspUri = (await vscodeLsp.openTextDocument(filePath, "css")).uri; + +describe("Folding Ranges", async () => { + bench("weblsp - Folding Ranges", async () => { + await weblsp.sendFoldingRangesRequest(weblspUri); + }); + + if (!process.env.CODSPEED) { + bench("vscode-css-languageserver - Folding Ranges", async () => { + await vscodeLsp.sendFoldingRangesRequest(vscodeLspUri); + }); + } + + afterAll(async () => { + await weblsp.shutdown(); + await vscodeLsp.shutdown(); + await weblsp.exit(); + await vscodeLsp.exit(); + }); +}); diff --git a/packages/language-server-tests-benchmarks/src/benchmarks/css/hover.bench.ts b/packages/language-server-tests-benchmarks/src/benchmarks/css/hover.bench.ts new file mode 100644 index 0000000..85ccfc7 --- /dev/null +++ b/packages/language-server-tests-benchmarks/src/benchmarks/css/hover.bench.ts @@ -0,0 +1,38 @@ +import { afterAll, bench, describe } from "vitest"; +import { startLanguageServer } from "../../server"; +import { fileURLToPath } from "url"; + +const filePath = fileURLToPath( + new URL("../../../fixture/hover_benchmark.css", import.meta.url) +); + +const weblsp = await startLanguageServer(undefined, "weblsp"); +const weblspUri = (await weblsp.openTextDocument(filePath, "css")).uri; + +const vscodeLsp = await startLanguageServer(undefined, "vscode-css"); +const vscodeLspUri = (await vscodeLsp.openTextDocument(filePath, "css")).uri; + +describe("Hover", async () => { + bench("weblsp - Hover", async () => { + await weblsp.sendHoverRequest(weblspUri, { + line: 1, + character: 6, + }); + }); + + if (!process.env.CODSPEED) { + bench("vscode-css-languageserver - Hover", async () => { + await vscodeLsp.sendHoverRequest(vscodeLspUri, { + line: 1, + character: 6, + }); + }); + } + + afterAll(async () => { + await weblsp.shutdown(); + await vscodeLsp.shutdown(); + await weblsp.exit(); + await vscodeLsp.exit(); + }); +}); diff --git a/packages/language-server-tests/tests/server.ts b/packages/language-server-tests-benchmarks/src/server.ts similarity index 90% rename from packages/language-server-tests/tests/server.ts rename to packages/language-server-tests-benchmarks/src/server.ts index c9a5db8..1fe2732 100644 --- a/packages/language-server-tests/tests/server.ts +++ b/packages/language-server-tests-benchmarks/src/server.ts @@ -8,35 +8,61 @@ import { TextDocument } from "vscode-languageserver-textdocument"; import { URI } from "vscode-uri"; import * as assert from "node:assert/strict"; import { fileURLToPath } from "node:url"; -import { createHash, randomBytes } from "node:crypto"; +import { randomBytes } from "node:crypto"; -const pathToBinary = fileURLToPath( - new URL("../../../target/debug/weblsp", import.meta.url) -); +let pathToBinary: string; +if (process.env.BENCHMARK === "true" || process.env.RELEASE === "true") { + pathToBinary = fileURLToPath( + new URL("../../../target/release/weblsp", import.meta.url) + ); +} else { + pathToBinary = fileURLToPath( + new URL("../../../target/debug/weblsp", import.meta.url) + ); +} export const fixtureDir = URI.file( fileURLToPath(new URL("./fixture", import.meta.url)) ).toString(); -export type LanguageServerHandle = ReturnType; +export type LanguageServerHandle = Awaited< + ReturnType +>; -export async function startLanguageServer(cwd?: string | undefined) { - console.info(`Starting language server at ${pathToBinary}`); - const childProcess = cp.spawn(pathToBinary, [], { - env: process.env, - cwd, - stdio: "pipe", - }); +export async function startLanguageServer( + cwd?: string | undefined, + which: "weblsp" | "vscode-css" = "weblsp" +) { + if (which === "weblsp") + console.info(`Starting language server at ${pathToBinary}`); + + const childProcess = + which === "weblsp" + ? cp.spawn(pathToBinary, [], { + env: process.env, + cwd, + stdio: "pipe", + }) + : cp.fork( + "node_modules/vscode-langservers-extracted/bin/vscode-css-language-server", + ["--stdio", `--clientProcessId=${process.pid.toString()}`], + { + execArgv: ["--nolazy"], + env: process.env, + cwd, + stdio: "pipe", + } + ); if (!childProcess.stdout || !childProcess.stdin) { throw new Error("Bad stdio configuration, should be pipe"); } - if (process.env.DEBUG) { - childProcess.stderr?.on("data", (data) => { + childProcess.stderr?.on("data", (data) => { + if (process.env.DEBUG) { console.error(data.toString()); - }); - } + } + }); const connection = _.createProtocolConnection( childProcess.stdout, @@ -48,7 +74,7 @@ export async function startLanguageServer(cwd?: string | undefined) { connection.onClose((e) => console.log("Closed", e)); connection.onUnhandledNotification((e) => - console.log("Unhandled notificaiton", e) + console.log("Unhandled notification", e) ); connection.onError((e) => console.log("Error:", e)); @@ -149,6 +175,15 @@ export async function startLanguageServer(cwd?: string | undefined) { } ); + // VS Code's CSS language server crashes if this is not set + if (which === "vscode-css") { + Object.assign(settings, { "css.lint.validProperties": [] }); + await connection.sendNotification( + _.DidChangeConfigurationNotification.type, + { settings } satisfies _.DidChangeConfigurationParams + ); + } + return { process: childProcess, connection, diff --git a/packages/language-server-tests/tests/css/colors.test.ts b/packages/language-server-tests-benchmarks/src/tests/css/colors.test.ts similarity index 100% rename from packages/language-server-tests/tests/css/colors.test.ts rename to packages/language-server-tests-benchmarks/src/tests/css/colors.test.ts diff --git a/packages/language-server-tests/tests/css/folding.test.ts b/packages/language-server-tests-benchmarks/src/tests/css/folding.test.ts similarity index 100% rename from packages/language-server-tests/tests/css/folding.test.ts rename to packages/language-server-tests-benchmarks/src/tests/css/folding.test.ts diff --git a/packages/language-server-tests/tests/css/hover.test.ts b/packages/language-server-tests-benchmarks/src/tests/css/hover.test.ts similarity index 100% rename from packages/language-server-tests/tests/css/hover.test.ts rename to packages/language-server-tests-benchmarks/src/tests/css/hover.test.ts diff --git a/packages/language-server-tests/tests/init.test.ts b/packages/language-server-tests-benchmarks/src/tests/init.test.ts similarity index 100% rename from packages/language-server-tests/tests/init.test.ts rename to packages/language-server-tests-benchmarks/src/tests/init.test.ts diff --git a/packages/language-server-tests-benchmarks/src/tests/setup.ts b/packages/language-server-tests-benchmarks/src/tests/setup.ts new file mode 100644 index 0000000..144be3e --- /dev/null +++ b/packages/language-server-tests-benchmarks/src/tests/setup.ts @@ -0,0 +1,9 @@ +import { startLanguageServer } from "../server"; + +declare global { + var languageServer: import("../server").LanguageServerHandle; +} + +if (!globalThis.languageServer) { + globalThis.languageServer = await startLanguageServer(); +} diff --git a/packages/language-server-tests/tests/shutdown.test.ts b/packages/language-server-tests-benchmarks/src/tests/shutdown.test.ts similarity index 82% rename from packages/language-server-tests/tests/shutdown.test.ts rename to packages/language-server-tests-benchmarks/src/tests/shutdown.test.ts index 3790c9d..0c5dabb 100644 --- a/packages/language-server-tests/tests/shutdown.test.ts +++ b/packages/language-server-tests-benchmarks/src/tests/shutdown.test.ts @@ -1,5 +1,4 @@ import { describe, expect, it } from "vitest"; -import { ServerCapabilities } from "vscode-languageserver-protocol/node"; describe("Language server initilization", () => { it("Can shutdown server", async () => { diff --git a/packages/language-server-tests/tsconfig.json b/packages/language-server-tests-benchmarks/tsconfig.json similarity index 100% rename from packages/language-server-tests/tsconfig.json rename to packages/language-server-tests-benchmarks/tsconfig.json diff --git a/packages/language-server-tests-benchmarks/vitest.config.bench.ts b/packages/language-server-tests-benchmarks/vitest.config.bench.ts new file mode 100644 index 0000000..b317fa9 --- /dev/null +++ b/packages/language-server-tests-benchmarks/vitest.config.bench.ts @@ -0,0 +1,14 @@ +import codspeedPlugin from "@codspeed/vitest-plugin"; +import { defineConfig } from "vitest/config"; + +const plugins = process.env.CODSPEED ? [codspeedPlugin()] : []; + +export default defineConfig({ + plugins, + test: { + dir: "src/benchmarks", + env: { + BENCHMARK: "true", + }, + }, +}); diff --git a/packages/language-server-tests/vitest.config.ts b/packages/language-server-tests-benchmarks/vitest.config.ts similarity index 92% rename from packages/language-server-tests/vitest.config.ts rename to packages/language-server-tests-benchmarks/vitest.config.ts index cd3d53b..a776ddf 100644 --- a/packages/language-server-tests/vitest.config.ts +++ b/packages/language-server-tests-benchmarks/vitest.config.ts @@ -18,11 +18,11 @@ class Sequencer extends BaseSequencer { export default defineConfig({ test: { - dir: "tests", + dir: "src/tests", watch: false, isolate: false, fileParallelism: false, - setupFiles: ["./tests/setup.ts"], + setupFiles: ["./src/tests/setup.ts"], sequence: { sequencer: Sequencer, }, diff --git a/packages/language-server-tests/fixture/.gitkeep b/packages/language-server-tests/fixture/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/packages/language-server-tests/tests/setup.ts b/packages/language-server-tests/tests/setup.ts deleted file mode 100644 index 41e934e..0000000 --- a/packages/language-server-tests/tests/setup.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { startLanguageServer } from "./server"; - -declare global { - var languageServer: Awaited; -} - -if (!globalThis.languageServer) { - globalThis.languageServer = await startLanguageServer(); -} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8a4a229..b9f6bbb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,14 +50,20 @@ importers: specifier: ^2.1.8 version: 2.1.8(@types/node@22.9.3) - packages/language-server-tests: + packages/language-server-tests-benchmarks: dependencies: + '@codspeed/vitest-plugin': + specifier: ^3.1.1 + version: 3.1.1(vite@5.4.11(@types/node@22.10.1))(vitest@2.1.8(@types/node@22.10.1)) '@types/node': specifier: ^22.10.1 version: 22.10.1 vitest: specifier: ^2.1.8 version: 2.1.8(@types/node@22.10.1) + vscode-langservers-extracted: + specifier: ^4.10.0 + version: 4.10.0 vscode-languageclient: specifier: ^9.0.1 version: 9.0.1 @@ -370,6 +376,9 @@ packages: '@vitest/utils@2.1.8': resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==} + '@vscode/l10n@0.0.10': + resolution: {integrity: sha512-E1OCmDcDWa0Ya7vtSjp/XfHFGqYJfh+YPC1RkATU71fTac+j1JjCcB3qwSzmlKAighx2WxhLlfhS0RwAN++PFQ==} + '@vscode/l10n@0.0.18': resolution: {integrity: sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==} @@ -389,6 +398,9 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -408,6 +420,16 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + core-js@3.39.0: + resolution: {integrity: sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==} + + css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -425,6 +447,23 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + + domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + + domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + + domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + es-module-lexer@1.5.4: resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} @@ -462,6 +501,13 @@ packages: engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + + jsonc-parser@3.3.1: + resolution: {integrity: sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==} + locate-path@7.2.0: resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -496,6 +542,12 @@ packages: resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} hasBin: true + node-html-parser@6.1.13: + resolution: {integrity: sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==} + + nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + p-limit@4.0.0: resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -518,6 +570,10 @@ packages: picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + postcss@8.4.49: resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} @@ -525,6 +581,12 @@ packages: proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + + request-light@0.7.0: + resolution: {integrity: sha512-lMbBMrDoxgsyO+yB3sDcrDuX85yYt7sS8BfQd11jtbW/z5ZWgLZRcEGLsLoYw7I0WSUGQBs8CC8ScIxkTX1+6Q==} + rollup@4.28.0: resolution: {integrity: sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -566,6 +628,11 @@ packages: resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} + typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + typescript@5.7.2: resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==} engines: {node: '>=14.17'} @@ -641,10 +708,24 @@ packages: vscode-css-languageservice@6.3.1: resolution: {integrity: sha512-1BzTBuJfwMc3A0uX4JBdJgoxp74cjj4q2mDJdp49yD/GuAq4X0k5WtK6fNcMYr+FfJ9nqgR6lpfCSZDkARJ5qQ==} + vscode-html-languageservice@5.3.1: + resolution: {integrity: sha512-ysUh4hFeW/WOWz/TO9gm08xigiSsV/FOAZ+DolgJfeLftna54YdmZ4A+lIn46RbdO3/Qv5QHTn1ZGqmrXQhZyA==} + + vscode-json-languageservice@5.4.2: + resolution: {integrity: sha512-2qujUseKRbLEwLXvEOFAxaz3y1ssdNCXXi95LRdG8AFchJHSnmI2qCg9ixoYxbJtSehIrXOmkhV87Y9lIivOgQ==} + vscode-jsonrpc@8.2.0: resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} engines: {node: '>=14.0.0'} + vscode-jsonrpc@9.0.0-next.6: + resolution: {integrity: sha512-KCSvUNsFiVciG9iqjJKBZOd66CN3ZKohDlYRmoOi+pd8l15MFLZ8wRG4c+wuzePGba/8WcCG2TM+C/GVlvuaeA==} + engines: {node: '>=14.0.0'} + + vscode-langservers-extracted@4.10.0: + resolution: {integrity: sha512-EFf9uQI4dAKbzMQFjDvVm1xJq1DXAQvBEuEfPGrK/xzfsL5xWTfIuRr90NgfmqwO+IEt6vLZm9EOj6R66xIifg==} + hasBin: true + vscode-languageclient@9.0.1: resolution: {integrity: sha512-JZiimVdvimEuHh5olxhxkht09m3JzUGwggb5eRUkzzJhZ2KjCN0nh55VfiED9oez9DyF8/fz1g1iBV3h+0Z2EA==} engines: {vscode: ^1.82.0} @@ -652,12 +733,28 @@ packages: vscode-languageserver-protocol@3.17.5: resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} + vscode-languageserver-protocol@3.17.6-next.11: + resolution: {integrity: sha512-GeJxEp1TiLsp79f8WG5n10wLViXfgFKb99hU9K8m7KDWM95/QFEqWkm79f9LVm54tUK74I91a9EeiQLCS/FABQ==} + vscode-languageserver-textdocument@1.0.12: resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} vscode-languageserver-types@3.17.5: resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} + vscode-languageserver-types@3.17.6-next.5: + resolution: {integrity: sha512-QFmf3Yl1tCgUQfA77N9Me/LXldJXkIVypQbty2rJ1DNHQkC+iwvm4Z2tXg9czSwlhvv0pD4pbF5mT7WhAglolw==} + + vscode-languageserver@10.0.0-next.11: + resolution: {integrity: sha512-cmobSrVDYhlh/t02vz/bV8nNpds8mus5HnILULae2iAvOjoaJPnTAp0jJWoYdUqTpIVzT9JV6JMKqLEvdqpeqg==} + hasBin: true + + vscode-markdown-languageservice@0.5.0-alpha.8: + resolution: {integrity: sha512-b2NgVMZvzI/7hRL32Kcu9neAAPFQzkcf/Fqwlxbz9p1/Q7aIorGACOGGo00s72AJtwjkCJ29eVJwUlFMFbPKqA==} + + vscode-nls@5.2.0: + resolution: {integrity: sha512-RAaHx7B14ZU04EU31pT+rKz2/zSl7xMsfIZuo8pd+KZO6PXtQmpevpq3vxvWNcrGbdmhM/rr5Uw5Mz+NBfhVng==} + vscode-uri@3.0.8: resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} @@ -874,6 +971,8 @@ snapshots: loupe: 3.1.2 tinyrainbow: 1.2.0 + '@vscode/l10n@0.0.10': {} + '@vscode/l10n@0.0.18': {} '@vscode/web-custom-data@0.4.13': {} @@ -892,6 +991,8 @@ snapshots: balanced-match@1.0.2: {} + boolbase@1.0.0: {} + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 @@ -912,6 +1013,18 @@ snapshots: dependencies: delayed-stream: 1.0.0 + core-js@3.39.0: {} + + css-select@5.1.0: + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + + css-what@6.1.0: {} + debug@4.3.7: dependencies: ms: 2.1.3 @@ -920,6 +1033,26 @@ snapshots: delayed-stream@1.0.0: {} + dom-serializer@2.0.0: + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + + domelementtype@2.3.0: {} + + domhandler@5.0.3: + dependencies: + domelementtype: 2.3.0 + + domutils@3.1.0: + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + + entities@4.5.0: {} + es-module-lexer@1.5.4: {} esbuild@0.21.5: @@ -970,6 +1103,10 @@ snapshots: fsevents@2.3.3: optional: true + he@1.2.0: {} + + jsonc-parser@3.3.1: {} + locate-path@7.2.0: dependencies: p-locate: 6.0.0 @@ -996,6 +1133,15 @@ snapshots: node-gyp-build@4.8.4: {} + node-html-parser@6.1.13: + dependencies: + css-select: 5.1.0 + he: 1.2.0 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + p-limit@4.0.0: dependencies: yocto-queue: 1.1.1 @@ -1012,6 +1158,8 @@ snapshots: picocolors@1.1.1: {} + picomatch@2.3.1: {} + postcss@8.4.49: dependencies: nanoid: 3.3.8 @@ -1020,6 +1168,10 @@ snapshots: proxy-from-env@1.1.0: {} + regenerator-runtime@0.13.11: {} + + request-light@0.7.0: {} + rollup@4.28.0: dependencies: '@types/estree': 1.0.6 @@ -1064,6 +1216,8 @@ snapshots: tinyspy@3.0.2: {} + typescript@4.9.5: {} + typescript@5.7.2: {} undici-types@6.19.8: {} @@ -1201,8 +1355,44 @@ snapshots: vscode-languageserver-types: 3.17.5 vscode-uri: 3.0.8 + vscode-html-languageservice@5.3.1: + dependencies: + '@vscode/l10n': 0.0.18 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 + + vscode-json-languageservice@5.4.2: + dependencies: + '@vscode/l10n': 0.0.18 + jsonc-parser: 3.3.1 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-uri: 3.0.8 + vscode-jsonrpc@8.2.0: {} + vscode-jsonrpc@9.0.0-next.6: {} + + vscode-langservers-extracted@4.10.0: + dependencies: + '@vscode/l10n': 0.0.18 + core-js: 3.39.0 + jsonc-parser: 3.3.1 + regenerator-runtime: 0.13.11 + request-light: 0.7.0 + semver: 7.6.3 + typescript: 4.9.5 + vscode-css-languageservice: 6.3.1 + vscode-html-languageservice: 5.3.1 + vscode-json-languageservice: 5.4.2 + vscode-languageserver: 10.0.0-next.11 + vscode-languageserver-textdocument: 1.0.12 + vscode-languageserver-types: 3.17.5 + vscode-markdown-languageservice: 0.5.0-alpha.8 + vscode-nls: 5.2.0 + vscode-uri: 3.0.8 + vscode-languageclient@9.0.1: dependencies: minimatch: 5.1.6 @@ -1214,10 +1404,32 @@ snapshots: vscode-jsonrpc: 8.2.0 vscode-languageserver-types: 3.17.5 + vscode-languageserver-protocol@3.17.6-next.11: + dependencies: + vscode-jsonrpc: 9.0.0-next.6 + vscode-languageserver-types: 3.17.6-next.5 + vscode-languageserver-textdocument@1.0.12: {} vscode-languageserver-types@3.17.5: {} + vscode-languageserver-types@3.17.6-next.5: {} + + vscode-languageserver@10.0.0-next.11: + dependencies: + vscode-languageserver-protocol: 3.17.6-next.11 + + vscode-markdown-languageservice@0.5.0-alpha.8: + dependencies: + '@vscode/l10n': 0.0.10 + node-html-parser: 6.1.13 + picomatch: 2.3.1 + vscode-languageserver-protocol: 3.17.5 + vscode-languageserver-textdocument: 1.0.12 + vscode-uri: 3.0.8 + + vscode-nls@5.2.0: {} + vscode-uri@3.0.8: {} why-is-node-running@2.3.0: From 7526fb28ed3e6d119d7f8b37879b3d44fd207199 Mon Sep 17 00:00:00 2001 From: Princesseuh <3019731+Princesseuh@users.noreply.github.com> Date: Sun, 15 Dec 2024 03:37:50 +0100 Subject: [PATCH 2/3] chore: lockfile --- pnpm-lock.yaml | 88 ++------------------------------------------------ 1 file changed, 3 insertions(+), 85 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b9f6bbb..5e9fb49 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,13 +42,13 @@ importers: devDependencies: '@types/node': specifier: ^22.8.0 - version: 22.9.3 + version: 22.10.1 typescript: specifier: ^5.6.3 version: 5.7.2 vitest: specifier: ^2.1.8 - version: 2.1.8(@types/node@22.9.3) + version: 2.1.8(@types/node@22.10.1) packages/language-server-tests-benchmarks: dependencies: @@ -85,7 +85,7 @@ importers: devDependencies: '@types/node': specifier: ^22.9.1 - version: 22.9.3 + version: 22.10.1 '@types/vscode': specifier: ^1.95.0 version: 1.95.0 @@ -341,9 +341,6 @@ packages: '@types/node@22.10.1': resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==} - '@types/node@22.9.3': - resolution: {integrity: sha512-F3u1fs/fce3FFk+DAxbxc78DF8x0cY09RRL8GnXLmkJ1jvx3TtPdWoTT5/NiYfI5ASqXBmfqJi9dZ3gxMx4lzw==} - '@types/vscode@1.95.0': resolution: {integrity: sha512-0LBD8TEiNbet3NvWsmn59zLzOFu/txSlGxnv5yAFHCrhG9WvAnR3IvfHzMOs2aeWqgvNjq9pO99IUw8d3n+unw==} @@ -638,9 +635,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - undici-types@6.20.0: resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} @@ -917,10 +911,6 @@ snapshots: dependencies: undici-types: 6.20.0 - '@types/node@22.9.3': - dependencies: - undici-types: 6.19.8 - '@types/vscode@1.95.0': {} '@vitest/expect@2.1.8': @@ -938,14 +928,6 @@ snapshots: optionalDependencies: vite: 5.4.11(@types/node@22.10.1) - '@vitest/mocker@2.1.8(vite@5.4.11(@types/node@22.9.3))': - dependencies: - '@vitest/spy': 2.1.8 - estree-walker: 3.0.3 - magic-string: 0.30.14 - optionalDependencies: - vite: 5.4.11(@types/node@22.9.3) - '@vitest/pretty-format@2.1.8': dependencies: tinyrainbow: 1.2.0 @@ -1220,8 +1202,6 @@ snapshots: typescript@5.7.2: {} - undici-types@6.19.8: {} - undici-types@6.20.0: {} vite-node@2.1.8(@types/node@22.10.1): @@ -1242,24 +1222,6 @@ snapshots: - supports-color - terser - vite-node@2.1.8(@types/node@22.9.3): - dependencies: - cac: 6.7.14 - debug: 4.3.7 - es-module-lexer: 1.5.4 - pathe: 1.1.2 - vite: 5.4.11(@types/node@22.9.3) - transitivePeerDependencies: - - '@types/node' - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - vite@5.4.11(@types/node@22.10.1): dependencies: esbuild: 0.21.5 @@ -1269,15 +1231,6 @@ snapshots: '@types/node': 22.10.1 fsevents: 2.3.3 - vite@5.4.11(@types/node@22.9.3): - dependencies: - esbuild: 0.21.5 - postcss: 8.4.49 - rollup: 4.28.0 - optionalDependencies: - '@types/node': 22.9.3 - fsevents: 2.3.3 - vitest@2.1.8(@types/node@22.10.1): dependencies: '@vitest/expect': 2.1.8 @@ -1313,41 +1266,6 @@ snapshots: - supports-color - terser - vitest@2.1.8(@types/node@22.9.3): - dependencies: - '@vitest/expect': 2.1.8 - '@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@22.9.3)) - '@vitest/pretty-format': 2.1.8 - '@vitest/runner': 2.1.8 - '@vitest/snapshot': 2.1.8 - '@vitest/spy': 2.1.8 - '@vitest/utils': 2.1.8 - chai: 5.1.2 - debug: 4.3.7 - expect-type: 1.1.0 - magic-string: 0.30.14 - pathe: 1.1.2 - std-env: 3.8.0 - tinybench: 2.9.0 - tinyexec: 0.3.1 - tinypool: 1.0.2 - tinyrainbow: 1.2.0 - vite: 5.4.11(@types/node@22.9.3) - vite-node: 2.1.8(@types/node@22.9.3) - why-is-node-running: 2.3.0 - optionalDependencies: - '@types/node': 22.9.3 - transitivePeerDependencies: - - less - - lightningcss - - msw - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - vscode-css-languageservice@6.3.1: dependencies: '@vscode/l10n': 0.0.18 From 41893daee916d009b3dcd12fb0bf01284d9d41cf Mon Sep 17 00:00:00 2001 From: Princesseuh <3019731+Princesseuh@users.noreply.github.com> Date: Sun, 15 Dec 2024 04:13:28 +0100 Subject: [PATCH 3/3] docs: add README --- packages/language-server-tests-benchmarks/README.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 packages/language-server-tests-benchmarks/README.md diff --git a/packages/language-server-tests-benchmarks/README.md b/packages/language-server-tests-benchmarks/README.md new file mode 100644 index 0000000..b6fb946 --- /dev/null +++ b/packages/language-server-tests-benchmarks/README.md @@ -0,0 +1,9 @@ +# language-server-tests-benchmarks + +The tests and benchmarks in this folder aims to test and benchmark the language server in a close-to-reality scenario, using the same JavaScript client powered by `vscode-jsonrpc` used in VS Code. + +## Why are the benchmarks so slow? + +If you're used to the numbers from the benchmarks of the language services, the numbers here might be surprisingly slow. The reason for that is that the benchmark also includes the large overhead caused by the client-server communication. Even if the language server can sometimes answer in 50-100μs, just sending and waiting for the response can take 95-99% of the time the benchmark measures, leading to times closer to 1-2ms. + +Unfortunately, due to the multiple processes involved it's not possible to get accurate flamegraphs from CodSpeed for these benchmarks at the time of writing. Locally, [flamegraph](https://github.com/flamegraph-rs/flamegraph) can be used, but it requires a bit of setup, especially on non-Linux systems.