@@ -107,20 +107,40 @@ endfunction
107
107
" @function(#SetWhetherToPerformIsAvailableChecksForTesting), skips the
108
108
" IsAvailable check and always returns true.
109
109
function ! s: IsAvailable (formatter) abort
110
- if codefmt#ShouldPerformIsAvailableChecks ()
111
- return a: formatter . IsAvailable ()
110
+ if ! codefmt#ShouldPerformIsAvailableChecks ()
111
+ return 1
112
112
endif
113
- return 1
113
+ return a: formatter .IsAvailable ()
114
+ endfunction
115
+
116
+
117
+ " Checks whether {formatter} is available, safely handling errors by logging
118
+ " an error and returning 0.
119
+ function ! s: IsAvailableSafe (formatter) abort
120
+ try
121
+ return s: IsAvailable (a: formatter )
122
+ catch /.*/
123
+ call maktaba#error#Shout (
124
+ \ ' Failed to evaluate whether formatter %s is available: %s' ,
125
+ \ a: formatter .name,
126
+ \ v: exception )
127
+ return 0
128
+ endtry
114
129
endfunction
115
130
116
131
117
132
" "
118
133
" Detects whether a formatter has been defined for the current buffer/filetype.
119
134
function ! codefmt#IsFormatterAvailable () abort
120
- let l: formatters = copy (s: registry .GetExtensions ())
121
- let l: is_available = ' v:val.AppliesToBuffer() && s:IsAvailable(v:val)'
122
- return ! empty (filter (l: formatters , l: is_available )) ||
123
- \ ! empty (get (b: , ' codefmt_formatter' ))
135
+ if ! empty (get (b: , ' codefmt_formatter' ))
136
+ return 1
137
+ endfor
138
+ for l: formatter in s: registry .GetExtensions ()
139
+ if l: formatter .AppliesToBuffer () && s: IsAvailableSafe (l: formatter )
140
+ return 1
141
+ endif
142
+ endfor
143
+ return 0
124
144
endfunction
125
145
126
146
@@ -153,23 +173,32 @@ function! s:GetFormatter(...) abort
153
173
return
154
174
endif
155
175
let l: formatter = l: selected_formatters [0 ]
156
- if ! s: IsAvailable (l: formatter )
176
+ try
177
+ let l: formatter_is_available = s: IsAvailable (l: formatter )
178
+ catch /.*/
179
+ call maktaba#error#Shout (
180
+ \ ' Error checking if formatter %s is available: %s' ,
181
+ \ l: formatter .name,
182
+ \ v: exception )
183
+ return
184
+ endtry
185
+ if ! l: formatter_is_available
157
186
call maktaba#error#Shout (s: GetSetupInstructions (l: formatter ))
158
187
return
159
188
endif
160
189
else
161
190
" No explicit name, use default.
191
+ let l: applicable_formatters = filter (
192
+ \ copy (l: formatters ), ' v:val.AppliesToBuffer()' )
162
193
let l: default_formatters = filter (
163
- \ copy (l: formatters ), ' v:val.AppliesToBuffer() && s:IsAvailable (v:val)' )
194
+ \ copy (l: applicable_formatters ), ' s:IsAvailableSafe (v:val)' )
164
195
if ! empty (l: default_formatters )
165
196
let l: formatter = l: default_formatters [0 ]
166
197
else
167
198
" Check if we have formatters that are not available for some reason.
168
199
" Report a better error message in that case.
169
- let l: unavailable_formatters = filter (
170
- \ copy (l: formatters ), ' v:val.AppliesToBuffer()' )
171
- if ! empty (l: unavailable_formatters )
172
- let l: error = join (map (copy (l: unavailable_formatters ),
200
+ if ! empty (l: applicable_formatters )
201
+ let l: error = join (map (copy (l: applicable_formatters ),
173
202
\ ' s:GetSetupInstructions(v:val)' ), " \n " )
174
203
else
175
204
let l: error = ' Not available. codefmt doesn'' t have a default ' .
@@ -248,7 +277,7 @@ function! codefmt#GetSupportedFormatters(ArgLead, CmdLine, CursorPos) abort
248
277
let l: groups = [[], [], []]
249
278
for l: formatter in s: registry .GetExtensions ()
250
279
let l: key = l: formatter .AppliesToBuffer () ? (
251
- \ l: formatter . IsAvailable () ? 0 : 1 ) : 2
280
+ \ s: IsAvailable (l: formatter ) ? 0 : 1 ) : 2
252
281
call add (l: groups [l: key ], l: formatter .name)
253
282
endfor
254
283
return join (l: groups [0 ] + l: groups [1 ] + l: groups [2 ], " \n " )
0 commit comments