Skip to content

Commit 88b85f7

Browse files
committed
Let requests return errors
According to the spec, all requests are allowed to return errors. This adds coercers to permit that.
1 parent 92665ae commit 88b85f7

File tree

1 file changed

+82
-2
lines changed

1 file changed

+82
-2
lines changed

src/lsp4clj/coercer.clj

Lines changed: 82 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,16 @@
8080
:opt-un [::additional-text-edits ::filter-text ::detail ::text-edit
8181
:completion-item/kind ::documentation ::data
8282
::insert-text :completion-item/insert-text-format]))
83+
(s/def ::completion-item-or-error
84+
(s/and (s/or :error ::response-error
85+
:completion-item ::completion-item)
86+
(s/conformer second)))
8387

8488
(s/def ::completion-items (s/coll-of ::completion-item))
89+
(s/def ::completion-items-or-error
90+
(s/and (s/or :error ::response-error
91+
:completion-items ::completion-items)
92+
(s/conformer second)))
8593

8694
(s/def :input.completion-item/kind
8795
(s/and integer?
@@ -101,6 +109,11 @@
101109
(s/def ::uri string?)
102110

103111
(s/def ::edits (s/coll-of ::text-edit))
112+
(s/def ::edits-or-error
113+
(s/and (s/or :error ::response-error
114+
:edits ::edits)
115+
(s/conformer second)))
116+
104117
(s/def ::text-document (s/keys :req-un [::version ::uri]))
105118
(s/def ::text-document-edit (s/keys :req-un [::text-document ::edits]))
106119
(s/def ::changes (s/coll-of (s/tuple string? ::edits) :kind map?))
@@ -129,6 +142,9 @@
129142

130143
(s/def ::workspace-edit-or-error
131144
(s/and (s/or :error ::response-error
145+
;; Why do we have two names for the same right-hand side?
146+
;; Wouldn't `:changes` always match first, meaning we'd never see `:document-changes`?
147+
;; And isn't the left-hand side essentially unused?
132148
:changes ::workspace-edit
133149
:document-changes ::workspace-edit)
134150
(s/conformer second)))
@@ -139,7 +155,15 @@
139155
(s/keys :req-un [:workspace-edit-params/edit]))
140156

141157
(s/def ::location (s/keys :req-un [::uri ::range]))
158+
(s/def ::location-or-error
159+
(s/and (s/or :error ::response-error
160+
:location ::location)
161+
(s/conformer second)))
142162
(s/def ::locations (s/coll-of ::location))
163+
(s/def ::locations-or-error
164+
(s/and (s/or :error ::response-error
165+
:locations ::locations)
166+
(s/conformer second)))
143167

144168
(s/def :signature-help/documentation ::documentation)
145169

@@ -158,6 +182,10 @@
158182
(s/def ::signature-help (s/keys :req-un [:signature-help/signatures]
159183
:opt-un [:signature-help/active-signature
160184
:signature-help/active-parameter]))
185+
(s/def ::signature-help-or-error
186+
(s/and (s/or :error ::response-error
187+
:signature-help ::signature-help)
188+
(s/conformer second)))
161189

162190
(def symbol-kind-enum
163191
{:file 1 :module 2 :namespace 3 :package 4 :class 5 :method 6 :property 7 :field 8 :constructor 9
@@ -182,14 +210,30 @@
182210
(s/def :document-symbol/children (s/coll-of ::document-symbol))
183211

184212
(s/def ::document-symbols (s/coll-of ::document-symbol))
213+
(s/def ::document-symbols-or-error
214+
(s/and (s/or :error ::response-error
215+
:document-symbols ::document-symbols)
216+
(s/conformer second)))
185217

186218
(s/def ::document-highlight (s/keys :req-un [::range]))
187219

188220
(s/def ::document-highlights (s/coll-of ::document-highlight))
221+
(s/def ::document-highlights-or-error
222+
(s/and (s/or :error ::response-error
223+
:document-highlights ::document-highlights)
224+
(s/conformer second)))
189225

190-
(s/def ::symbol-information (s/keys :req-un [::name :symbol/kind ::location]))
226+
(s/def ::workspace-symbol (s/keys :req-un [::name :symbol/kind ::location]))
227+
(s/def ::workspace-symbol-or-error
228+
(s/and (s/or :error ::response-error
229+
:workspace-symbol ::workspace-symbol)
230+
(s/conformer second)))
191231

192-
(s/def ::workspace-symbols (s/coll-of ::symbol-information))
232+
(s/def ::workspace-symbols (s/coll-of ::workspace-symbol))
233+
(s/def ::workspace-symbols-or-error
234+
(s/and (s/or :error ::response-error
235+
:workspace-symbols ::workspace-symbols)
236+
(s/conformer second)))
193237

194238
(s/def ::severity integer?)
195239

@@ -214,6 +258,10 @@
214258

215259
(s/def ::hover (s/keys :req-un [::contents]
216260
:opt-un [::range]))
261+
(s/def ::hover-or-error
262+
(s/and (s/or :error ::response-error
263+
:hover ::hover)
264+
(s/conformer second)))
217265

218266
(s/def :command/title string?)
219267
(s/def :command/command string?)
@@ -286,16 +334,36 @@
286334
::command
287335
:code-action/preferred
288336
::data]))
337+
(s/def ::code-action-or-error
338+
(s/and (s/or :error ::response-error
339+
:code-action ::code-action)
340+
(s/conformer second)))
289341

290342
(s/def ::code-actions (s/coll-of ::code-action))
343+
(s/def ::code-actions-or-error
344+
(s/and (s/or :error ::response-error
345+
:code-actions ::code-actions)
346+
(s/conformer second)))
291347

292348
(s/def ::code-lens (s/keys :req-un [::range]
293349
:opt-un [::command ::data]))
350+
(s/def ::code-lens-or-error
351+
(s/and (s/or :error ::response-error
352+
:code-lens ::code-lens)
353+
(s/conformer second)))
294354

295355
(s/def ::code-lenses (s/coll-of ::code-lens))
356+
(s/def ::code-lenses-or-error
357+
(s/and (s/or :error ::response-error
358+
:code-lenses ::code-lenses)
359+
(s/conformer second)))
296360

297361
(s/def ::semantic-tokens (s/keys :req-un [::data]
298362
:opt-un [::result-id]))
363+
(s/def ::semantic-tokens-or-error
364+
(s/and (s/or :error ::response-error
365+
:semantic-tokens ::semantic-tokens)
366+
(s/conformer second)))
299367

300368
(s/def ::call-hierarchy-item (s/keys :req-un [::name
301369
:symbol/kind
@@ -305,6 +373,10 @@
305373
:opt-un [::tags ::detail ::data]))
306374

307375
(s/def ::call-hierarchy-items (s/coll-of ::call-hierarchy-item))
376+
(s/def ::call-hierarchy-items-or-error
377+
(s/and (s/or :error ::response-error
378+
:call-hierarchy-items ::call-hierarchy-items)
379+
(s/conformer second)))
308380

309381
(s/def :call-hierarchy/from-ranges (s/coll-of ::range))
310382
(s/def :call-hierarchy/from ::call-hierarchy-item)
@@ -315,7 +387,15 @@
315387
(s/def ::call-hierarchy-outgoing-call (s/keys :req-un [:call-hierarchy/to :call-hierarchy/from-ranges]))
316388

317389
(s/def ::call-hierarchy-incoming-calls (s/coll-of ::call-hierarchy-incoming-call))
390+
(s/def ::call-hierarchy-incoming-calls-or-error
391+
(s/and (s/or :error ::response-error
392+
:call-hierarchy-incoming-calls ::call-hierarchy-incoming-calls)
393+
(s/conformer second)))
318394
(s/def ::call-hierarchy-outgoing-calls (s/coll-of ::call-hierarchy-outgoing-call))
395+
(s/def ::call-hierarchy-outgoing-calls-or-error
396+
(s/and (s/or :error ::response-error
397+
:call-hierarchy-outgoing-calls ::call-hierarchy-outgoing-calls)
398+
(s/conformer second)))
319399

320400
(s/def :linked-editing-range/ranges (s/coll-of ::range))
321401

0 commit comments

Comments
 (0)