Skip to content

Commit 645c353

Browse files
authored
fix(lsp): honor per-server formatting toggle (Acode-Foundation#1958)
1 parent 0835d63 commit 645c353

File tree

4 files changed

+28
-9
lines changed

4 files changed

+28
-9
lines changed

src/cm/lsp/clientManager.ts

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import NotificationManager from "lib/notificationManager";
1818
import Uri from "utils/Uri";
1919
import { clearDiagnosticsEffect } from "./diagnostics";
2020
import { documentHighlightsExtension } from "./documentHighlights";
21+
import { supportsBuiltinFormatting } from "./formattingSupport";
2122
import { inlayHintsExtension } from "./inlayHints";
2223
import { acodeRenameKeymap } from "./rename";
2324
import { ensureServerRunning } from "./serverLauncher";
@@ -60,13 +61,6 @@ function safeString(value: unknown): string {
6061
return value != null ? String(value) : "";
6162
}
6263

63-
const defaultKeymaps = keymap.of([
64-
...formatKeymap,
65-
...acodeRenameKeymap,
66-
...jumpToDefinitionKeymap,
67-
...findReferencesKeymap,
68-
]);
69-
7064
interface BuiltinExtensionsResult {
7165
extensions: Extension[];
7266
diagnosticsExtension: Extension | LSPClientExtension | null;
@@ -83,14 +77,25 @@ function buildBuiltinExtensions(
8377
diagnostics: includeDiagnostics = true,
8478
inlayHints: includeInlayHints = true,
8579
documentHighlights: includeDocumentHighlights = true,
80+
formatting: includeFormatting = true,
8681
} = config;
8782

8883
const extensions: Extension[] = [];
8984
let diagnosticsExtension: Extension | LSPClientExtension | null = null;
9085

9186
if (includeCompletion) extensions.push(serverCompletion());
9287
if (includeHover) extensions.push(hoverTooltips());
93-
if (includeKeymaps) extensions.push(defaultKeymaps);
88+
if (includeKeymaps) {
89+
const bindings = [
90+
...(includeFormatting ? formatKeymap : []),
91+
...acodeRenameKeymap,
92+
...jumpToDefinitionKeymap,
93+
...findReferencesKeymap,
94+
];
95+
if (bindings.length) {
96+
extensions.push(keymap.of(bindings));
97+
}
98+
}
9499
if (includeSignature) extensions.push(signatureHelp());
95100
if (includeDiagnostics) {
96101
const diagExt = serverDiagnostics();
@@ -263,6 +268,7 @@ export class LspClientManager {
263268
if (!servers.length) return false;
264269

265270
for (const server of servers) {
271+
if (!supportsBuiltinFormatting(server)) continue;
266272
try {
267273
const context: RootUriContext = {
268274
uri: normalizedUri,
@@ -437,6 +443,7 @@ export class LspClientManager {
437443
diagnostics: builtinConfig.diagnostics !== false,
438444
inlayHints: builtinConfig.inlayHints !== false,
439445
documentHighlights: builtinConfig.documentHighlights !== false,
446+
formatting: builtinConfig.formatting !== false,
440447
})
441448
: { extensions: [], diagnosticsExtension: null };
442449

src/cm/lsp/formatter.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import type { EditorView } from "@codemirror/view";
22
import { getModes } from "cm/modelist";
33
import toast from "components/toast";
44
import lspClientManager from "./clientManager";
5+
import { supportsBuiltinFormatting } from "./formattingSupport";
56
import serverRegistry from "./serverRegistry";
67
import type { AcodeApi, FileMetadata } from "./types";
78

@@ -32,6 +33,7 @@ function getActiveMetadata(
3233
export function registerLspFormatter(acode: AcodeApi): void {
3334
const languages = new Set<string>();
3435
serverRegistry.listServers().forEach((server) => {
36+
if (!supportsBuiltinFormatting(server)) return;
3537
(server.languages || []).forEach((lang) => {
3638
if (lang) languages.add(String(lang));
3739
});
@@ -56,7 +58,9 @@ export function registerLspFormatter(acode: AcodeApi): void {
5658
toast("Unknown language for LSP formatting");
5759
return false;
5860
}
59-
const servers = serverRegistry.getServersForLanguage(languageId);
61+
const servers = serverRegistry
62+
.getServersForLanguage(languageId)
63+
.filter(supportsBuiltinFormatting);
6064
if (!servers.length) {
6165
toast("No LSP formatter available");
6266
return false;

src/cm/lsp/formattingSupport.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import type { LspServerDefinition } from "./types";
2+
3+
export function supportsBuiltinFormatting(
4+
server: LspServerDefinition,
5+
): boolean {
6+
return server.clientConfig?.builtinExtensions?.formatting !== false;
7+
}

src/cm/lsp/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,7 @@ export interface BuiltinExtensionsConfig {
145145
diagnostics?: boolean;
146146
inlayHints?: boolean;
147147
documentHighlights?: boolean;
148+
formatting?: boolean;
148149
}
149150

150151
export interface AcodeClientConfig {

0 commit comments

Comments
 (0)