Skip to content

Commit 03d89dd

Browse files
committed
treewide: do not overwrite lsp-client-settings changed by user
If a user has set a setting inside `lsp-client-settings`, changing its value will result in a silent bug in user configuration that looks like a regression from `lsp-mode` mode update. Let's avoid that by adding a new function `lsp-register-new-settings` that avoids overwritting whatever was set by user and make use of it treewide. While at it, prohibit `lsp-register-custom-settings` from internal use for all the same reasons. Fixes: #4420
1 parent 5b01984 commit 03d89dd

36 files changed

+70
-39
lines changed

Diff for: .github/workflows/lint.yml

+5
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ jobs:
2020
with:
2121
version: 'snapshot'
2222

23+
# `lsp-register-custom-settings` should not be used for defining client
24+
# settings, see its description for details
25+
- name: Do not overwrite user settings
26+
run: "! git grep lsp-register-custom-settings -- clients"
27+
2328
- name: Resolve dependency
2429
run: eask install-deps --dev
2530

Diff for: clients/lsp-ansible.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ Python virtual environment."
188188
'(:npm :package "@ansible/ansible-language-server"
189189
:path "ansible-language-server"))
190190

191-
(lsp-register-custom-settings
191+
(lsp-register-new-settings
192192
'(("ansible.ansible.path" lsp-ansible-ansible-path)
193193
("ansible.ansible.useFullyQualifiedCollectionNames" lsp-ansible-use-fully-qualified-collection-names t)
194194
("ansible.validation.enabled" lsp-ansible-validation-enabled t)

Diff for: clients/lsp-css.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ server."
198198
(const "messages")
199199
(const "verbose")))
200200

201-
(lsp-register-custom-settings
201+
(lsp-register-new-settings
202202
'(("css.trace.server" lsp-css-trace-server)
203203
("css.lint.unknownAtRules" lsp-css-lint-unknown-at-rules)
204204
("css.lint.idSelector" lsp-css-lint-id-selector)

Diff for: clients/lsp-elixir.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ be available here: https://github.com/elixir-lsp/elixir-ls/releases/"
169169
:binary-path lsp-elixir-server-command
170170
:set-executable? t))
171171

172-
(lsp-register-custom-settings
172+
(lsp-register-new-settings
173173
'(("elixirLS.dialyzerEnabled" lsp-elixir-dialyzer-enabled t)
174174
("elixirLS.dialyzerWarnOpts" lsp-elixir-dialyzer-warn-opts)
175175
("elixirLS.dialyzerFormat" lsp-elixir-dialyzer-format)

Diff for: clients/lsp-fsharp.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ available, else the globally installed tool."
249249
(push '(:AutomaticWorkspaceInit . t) opts)
250250
opts)))
251251

252-
(lsp-register-custom-settings
252+
(lsp-register-new-settings
253253
`(("FSharp.KeywordsAutocomplete" lsp-fsharp-keywords-autocomplete t)
254254
("FSharp.ExternalAutocomplete" lsp-fsharp-external-autocomplete t)
255255
("FSharp.Linter" lsp-fsharp-linter t)

Diff for: clients/lsp-go.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ $GOPATH/pkg/mod along with the value of
301301
:risky t
302302
:package-version '(lsp-mode "8.0.0"))
303303

304-
(lsp-register-custom-settings
304+
(lsp-register-new-settings
305305
'(("gopls.usePlaceholders" lsp-go-use-placeholders t)
306306
("gopls.hoverKind" lsp-go-hover-kind)
307307
("gopls.buildFlags" lsp-go-build-flags)

Diff for: clients/lsp-groovy.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
:risky t
4949
:type 'lsp-string-vector)
5050

51-
(lsp-register-custom-settings
51+
(lsp-register-new-settings
5252
'(("groovy.classpath" lsp-groovy-classpath)))
5353

5454
(lsp-register-client

Diff for: clients/lsp-haxe.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@
170170
:type 'string
171171
:group 'lsp-haxe)
172172

173-
(lsp-register-custom-settings
173+
(lsp-register-new-settings
174174
'(("haxe.hxml" lsp-haxe-hxml)
175175
("haxe.postfixCompletion" lsp-haxe-postfix-completion)
176176
("haxe.exclude" lsp-haxe-exclude)

Diff for: clients/lsp-html.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ styles."
159159
:group 'lsp-html
160160
:package-version '(lsp-mode . "6.1"))
161161

162-
(lsp-register-custom-settings
162+
(lsp-register-new-settings
163163
'(("html.trace.server" lsp-html-trace-server)
164164
("html.autoClosingTags" lsp-html-auto-closing-tags t)
165165
("html.validate.styles" lsp-html-validate-styles t)

Diff for: clients/lsp-idris.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@
4848
:type '(choice (:tag "off" "messages" "verbose"))
4949
:package-version '(lsp-mode . "9.0.0"))
5050

51-
(lsp-register-custom-settings
51+
(lsp-register-new-settings
5252
'(("idris2-lsp.trace.server" lsp-idris2-lsp-trace-server)
5353
("idris2-lsp.path" lsp-idris2-lsp-path)))
5454

Diff for: clients/lsp-javascript.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -648,7 +648,7 @@ name (e.g. `data' variable passed as `data' parameter)."
648648
:type 'boolean
649649
:package-version '(lsp-mode . "9.0.0"))
650650

651-
(lsp-register-custom-settings
651+
(lsp-register-new-settings
652652
'(("javascript.autoClosingTags" lsp-javascript-auto-closing-tags t)
653653
("javascript.implicitProjectConfig.checkJs" lsp-javascript-implicit-project-config-check-js t)
654654
("javascript.implicitProjectConfig.experimentalDecorators" lsp-javascript-implicit-project-config-experimental-decorators t)

Diff for: clients/lsp-json.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ here, https://github.com/emacs-lsp/lsp-mode/issues/3368#issuecomment-1049635155.
5454
:group 'lsp-json
5555
:package-version '(lsp-mode . "6.3"))
5656

57-
(lsp-register-custom-settings
57+
(lsp-register-new-settings
5858
'(("json.schemas" lsp-json-schemas)
5959
("http.proxy" lsp-http-proxy)
6060
("http.proxyStrictSSL" lsp-http-proxyStrictSSL)))

Diff for: clients/lsp-kotlin.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ Requires lsp-inlay-hints-mode."
149149
:type 'boolean
150150
:group 'lsp-kotlin)
151151

152-
(lsp-register-custom-settings
152+
(lsp-register-new-settings
153153
'(("kotlin.externalSources.autoConvertToKotlin" lsp-kotlin-external-sources-auto-convert-to-kotlin t)
154154
("kotlin.externalSources.useKlsScheme" lsp-kotlin-external-sources-use-kls-scheme t)
155155
("kotlin.debugAdapter.path" lsp-kotlin-debug-adapter-path)

Diff for: clients/lsp-lua.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,7 @@ and `../lib` ,exclude `../lib/temp`.
488488
:package-version '(lsp-mode . "8.0.0")
489489
:group 'lsp-lua-language-server)
490490

491-
(lsp-register-custom-settings
491+
(lsp-register-new-settings
492492
'(("files.associations" lsp-lua-files-associations t)
493493
("files.exclude" lsp-lua-files-exclude t)
494494
("Lua.workspace.useGitIgnore" lsp-lua-workspace-use-git-ignore t)

Diff for: clients/lsp-magik.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@
121121
(lsp--set-configuration (lsp-configuration-section "magik"))))
122122
:server-id 'magik))
123123

124-
(lsp-register-custom-settings
124+
(lsp-register-new-settings
125125
`(("magik.javaHome" lsp-magik-java-home)
126126
("magik.smallworldGis" lsp-magik-smallworld-gis)
127127
("magik.typing.typeDatabasePaths" lsp-magik-typing-type-database-paths)

Diff for: clients/lsp-markdown.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ For a complete list of plugins, check:
7979
'(:npm :package "unified-language-server"
8080
:path "unified-language-server"))
8181

82-
(lsp-register-custom-settings
82+
(lsp-register-new-settings
8383
`(("unified-language-server.remark-parse.plugins" lsp-markdown-remark-plugins)
8484
("unified-language-server.remark-parse.checkTextWith.setting" lsp-markdown-remark-check-text-with-setting)
8585
("unified-language-server.remark-parse.checkTextWith.mutator" lsp-markdown-remark-check-text-with-mutator)))

Diff for: clients/lsp-openscad.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
:type 'string
6161
:group 'lsp-openscad)
6262

63-
(lsp-register-custom-settings
63+
(lsp-register-new-settings
6464
'(("openscad.search_paths" lsp-openscad-search-paths)
6565
("openscad.fmt_exe" lsp-openscad-format-exe)
6666
("openscad.fmt_style" lsp-openscad-format-style)))

Diff for: clients/lsp-perl.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ Defaults to 0."
8888
:group 'lsp-perl
8989
:package-version '(lsp-mode . "8.0.0"))
9090

91-
(lsp-register-custom-settings
91+
(lsp-register-new-settings
9292
'(("perl.perlCmd" lsp-perl-perl-cmd)
9393
("perl.perlInc" lsp-perl-perl-inc)
9494
("perl.fileFilter" lsp-perl-file-filter)

Diff for: clients/lsp-perlnavigator.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ default to ~/.perlcriticrc. (no aliases, .bat files or ~/)."
111111
:group 'lsp-perlnavigator
112112
:package-version '(lsp-mode . "9.0.0"))
113113

114-
(lsp-register-custom-settings
114+
(lsp-register-new-settings
115115
'(("perlnavigator.trace.server" lsp-perlnavigator-trace-server)
116116
("perlnavigator.logging" lsp-perlnavigator-logging t)
117117
("perlnavigator.includePaths" lsp-perlnavigator-include-paths)

Diff for: clients/lsp-pls.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ changes behavior depending on the contents of @ARGV."
103103
:group 'lsp-pls
104104
:package-version '(lsp-mode . "9.0.0"))
105105

106-
(lsp-register-custom-settings
106+
(lsp-register-new-settings
107107
'(("pls.cmd" lsp-pls-executable)
108108
("pls.args" lsp-pls-arguments)
109109
("pls.cwd" lsp-pls-working-dir)

Diff for: clients/lsp-pwsh.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ extension."
195195
:group 'lsp-pwsh
196196
:package-version '(lsp-mode . "6.2"))
197197

198-
(lsp-register-custom-settings
198+
(lsp-register-new-settings
199199
'(("powershell.developer.featureFlags" lsp-pwsh-developer-feature-flags)
200200
("powershell.developer.editorServicesWaitForDebugger" lsp-pwsh-developer-editor-services-wait-for-debugger t)
201201
("powershell.codeFormatting.useCorrectCasing" lsp-pwsh-code-formatting-use-correct-casing t)

Diff for: clients/lsp-pyls.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -430,7 +430,7 @@ So it will rename only references it can find."
430430
(setenv "PYENV_VERSION" pyenv-version)
431431
python-env))))))
432432

433-
(lsp-register-custom-settings
433+
(lsp-register-new-settings
434434
'(("pyls.rope.ropeFolder" lsp-pyls-rope-rope-folder)
435435
("pyls.rope.extensionModules" lsp-pyls-rope-extension-modules)
436436
("pyls.plugins.rope_rename.enabled" (lambda () (eq lsp-pyls-rename-backend 'rope)) t)

Diff for: clients/lsp-pylsp.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -573,7 +573,7 @@ So it will rename only references it can find."
573573
(setenv "PYENV_VERSION" pyenv-version)
574574
python-env))))))
575575

576-
(lsp-register-custom-settings
576+
(lsp-register-new-settings
577577
'(("pylsp.rope.ropeFolder" lsp-pylsp-rope-rope-folder)
578578
("pylsp.rope.extensionModules" lsp-pylsp-rope-extension-modules)
579579
("pylsp.plugins.rope_rename.enabled" (lambda () (eq lsp-pylsp-rename-backend 'rope)) t)

Diff for: clients/lsp-rf.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ Glob patterns as strings are accepted (eg. *bad.robot between double quotes)"
108108
x))
109109
seq)))
110110

111-
(lsp-register-custom-settings
111+
(lsp-register-new-settings
112112
'(
113113
("rfLanguageServer.trace.server" lsp-rf-language-server-trace-server)
114114
("rfLanguageServer.logLevel" lsp-rf-language-server-log-level)

Diff for: clients/lsp-rust.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -285,7 +285,7 @@ is often the type local variable declaration."
285285
:group 'lsp-rust-rls
286286
:package-version '(lsp-mode . "6.1"))
287287

288-
(lsp-register-custom-settings
288+
(lsp-register-new-settings
289289
'(("rust.show_hover_context" lsp-rust-show-hover-context t)
290290
("rust.full_docs" lsp-rust-full-docs t)
291291
("rust.build_command" lsp-rust-build-command)

Diff for: clients/lsp-sml.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ more information."
7070
:type 'string
7171
:group 'lsp-sml)
7272

73-
(lsp-register-custom-settings
73+
(lsp-register-new-settings
7474
'(("millet.format.engine" lsp-sml-millet-format-engine)
7575
("millet.server.diagnostics.filter" lsp-sml-millet-server-diagnostics-filter)
7676
("millet.server.diagnostics.moreInfoHint.enable" lsp-sml-millet-server-diagnostics-moreInfoHint-enable)

Diff for: clients/lsp-solargraph.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@
136136
(append '("bundle" "exec") lsp-solargraph-server-command)
137137
lsp-solargraph-server-command))
138138

139-
(lsp-register-custom-settings
139+
(lsp-register-new-settings
140140
'(("solargraph.logLevel" lsp-solargraph-log-level)
141141
("solargraph.folding" lsp-solargraph-folding t)
142142
("solargraph.references" lsp-solargraph-references t)

Diff for: clients/lsp-svelte.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ Example: `((css-unused-selector . ignore) (unused-export-let . error))"
225225
:type 'boolean
226226
:package-version '(lsp-mode . "8.0.0"))
227227

228-
(lsp-register-custom-settings
228+
(lsp-register-new-settings
229229
'(("svelte.plugin.svelte.rename.enable" lsp-svelte-plugin-svelte-rename-enable t)
230230
("svelte.plugin.svelte.selectionRange.enable" lsp-svelte-plugin-svelte-selection-range-enable t)
231231
("svelte.plugin.svelte.codeActions.enable" lsp-svelte-plugin-svelte-code-actions-enable t)

Diff for: clients/lsp-verilog.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@
160160
:library-folders-fn 'lsp-clients-svlangserver-get-workspace-additional-dirs
161161
:server-id 'svlangserver))
162162

163-
(lsp-register-custom-settings '(("systemverilog.includeIndexing" lsp-clients-svlangserver-includeIndexing)
163+
(lsp-register-new-settings '(("systemverilog.includeIndexing" lsp-clients-svlangserver-includeIndexing)
164164
("systemverilog.excludeIndexing" lsp-clients-svlangserver-excludeIndexing)
165165
("systemverilog.defines" lsp-clients-svlangserver-defines)
166166
("systemverilog.launchConfiguration" lsp-clients-svlangserver-launchConfiguration)

Diff for: clients/lsp-vetur.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ Set a source to \"\" to disable it.
264264
:group 'lsp-vetur
265265
:package-version '(lsp-mode . "6.1"))
266266

267-
(lsp-register-custom-settings
267+
(lsp-register-new-settings
268268
'(("vetur.trace.server" lsp-vetur-trace-server)
269269
("vetur.ignoreProjectWarning" lsp-vetur-ignore-project-warning t)
270270
("vetur.format.scriptInitialIndent" lsp-vetur-format-script-initial-indent t)

Diff for: clients/lsp-volar.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@
7676
'(:system "vue-language-server")
7777
'(:npm :package "@vue/language-server" :path "vue-language-server"))
7878

79-
(lsp-register-custom-settings
79+
(lsp-register-new-settings
8080
'(("typescript.tsdk"
8181
(lambda ()
8282
(if-let ((project-root (lsp-workspace-root))

Diff for: clients/lsp-xml.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,7 @@ The value for `enabled' can be always, never or onValidSchema."
255255
:group 'lsp-xml
256256
:package-version '(lsp-mode . "6.1"))
257257

258-
(lsp-register-custom-settings '
258+
(lsp-register-new-settings '
259259
(("xml.validation.schema" lsp-xml-validation-schema)
260260
("xml.validation.resolveExternalEntities" lsp-xml-validation-resolve-external-entities)
261261
("xml.validation.enabled" lsp-xml-validation-enabled t)

Diff for: clients/lsp-yaml.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ Limited for performance reasons."
129129
(defvar lsp-yaml--schema-store-schemas-alist nil
130130
"A list of schemas fetched from schema stores.")
131131

132-
(lsp-register-custom-settings
132+
(lsp-register-new-settings
133133
'(("yaml.format.enable" lsp-yaml-format-enable t)
134134
("yaml.format.singleQuote" lsp-yaml-single-quote t)
135135
("yaml.format.bracketSpacing" lsp-yaml-bracket-spacing)

Diff for: clients/lsp-zig.el

+1-1
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,7 @@ and not the global storage."
250250
;;
251251
;;; Core
252252

253-
(lsp-register-custom-settings
253+
(lsp-register-new-settings
254254
'(("zls.enable_snippets" lsp-zls-enable-snippets t)
255255
("zls.enable_argument_placeholders" lsp-zig-enable-argument-placeholders t)
256256
("zls.enable_build_on_save" lsp-zig-enable-build-on-save t)

Diff for: lsp-mode.el

+28-2
Original file line numberDiff line numberDiff line change
@@ -8539,12 +8539,38 @@ optional flag that should be non-nil for boolean settings, when it is nil the
85398539
property will be ignored if the VALUE is nil.
85408540

85418541
Example: `(lsp-register-custom-settings `((\"foo.bar.buzz.enabled\" t t)))'
8542-
\(note the double parentheses)"
8542+
\(note the double parentheses)
8543+
8544+
Internal note: this function should not be used in by `lsp' interanlly
8545+
due to potentially overriding user settings. Use
8546+
`lsp-register-new-settings' instead."
85438547
(mapc
85448548
(-lambda ((path . rest))
85458549
(puthash path rest lsp-client-settings))
85468550
props))
85478551

8552+
(defun lsp-register-new-settings (props)
8553+
"Register PROPS that did not exist yet.
8554+
8555+
This function avoids overwriting a setting that has already existed. For
8556+
overwriting purposes use `lsp-register-custom-settings'.
8557+
8558+
PROPS is list of triple (path value boolean?) where PATH is the path to the
8559+
property; VALUE can be a literal value, symbol to be evaluated, or either a
8560+
function or lambda function to be called without arguments; BOOLEAN? is an
8561+
optional flag that should be non-nil for boolean settings, when it is nil the
8562+
property will be ignored if the VALUE is nil.
8563+
8564+
Example: `(lsp-register-new-settings `((\"foo.bar.buzz.enabled\" t t)))'
8565+
\(note the double parentheses)
8566+
8567+
"
8568+
(mapc
8569+
(-lambda ((path . rest))
8570+
(unless (gethash path lsp-client-settings)
8571+
(puthash path rest lsp-client-settings)))
8572+
props))
8573+
85488574
(defun lsp-region-text (region)
85498575
"Get the text for REGION in current buffer."
85508576
(-let (((start . end) (lsp--range-to-region region)))
@@ -8572,7 +8598,7 @@ TBL - a hash table, PATHS is the path to the nested VALUE."
85728598
(let ((path (plist-get args :lsp-path)))
85738599
(cl-remf args :lsp-path)
85748600
`(progn
8575-
(lsp-register-custom-settings
8601+
(lsp-register-new-settings
85768602
(quote ((,path ,symbol ,(equal ''boolean (plist-get args :type))))))
85778603

85788604
(defcustom ,symbol ,standard ,doc

Diff for: test/lsp-common-test.el

+4-4
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,8 @@
169169
:risky t
170170
:type 'string)
171171

172-
(lsp-register-custom-settings '(("section2.nested.prop1" lsp-nested-prop1)))
173-
(lsp-register-custom-settings '(("section2.nested.prop2" lsp-nested-prop2)))
172+
(lsp-register-new-settings '(("section2.nested.prop1" lsp-nested-prop1)))
173+
(lsp-register-new-settings '(("section2.nested.prop2" lsp-nested-prop2)))
174174

175175
(ert-deftest lsp--custom-settings-test-2 ()
176176
(let ((actual (lsp-ht->alist (lsp-configuration-section "section2"))))
@@ -192,7 +192,7 @@
192192
:risky t
193193
:type 'string)
194194

195-
(lsp-register-custom-settings '(("section3.prop1" lsp-prop3 t)))
195+
(lsp-register-new-settings '(("section3.prop1" lsp-prop3 t)))
196196

197197
(ert-deftest lsp--boolean-property ()
198198
(cl-assert (equal (lsp-ht->alist (lsp-configuration-section "section3"))
@@ -203,7 +203,7 @@
203203
(cl-assert (equal (aref (lsp--build-workspace-configuration-response request) 0)
204204
:json-false))))
205205

206-
(lsp-register-custom-settings '(("section4.prop1" "value")))
206+
(lsp-register-new-settings '(("section4.prop1" "value")))
207207

208208
(ert-deftest lsp--non-boolean-property ()
209209
(cl-assert (equal (lsp-ht->alist (lsp-configuration-section "section4"))

0 commit comments

Comments
 (0)