From: Philip Kaludercic <philipk@posteo.net>
To: Augusto Stoffel <arstoffel@gmail.com>
Cc: Eli Zaretskii <eliz@gnu.org>,
57884@debbugs.gnu.org, Stefan Kangas <stefankangas@gmail.com>
Subject: bug#57884: [PATCH] Flymake backend using the shellcheck program
Date: Sun, 18 Sep 2022 21:18:36 +0000 [thread overview]
Message-ID: <87sfko755f.fsf@posteo.net> (raw)
In-Reply-To: <87h7148mba.fsf@posteo.net> (Philip Kaludercic's message of "Sun, 18 Sep 2022 22:22:33 +0200")
[-- Attachment #1: Type: text/plain, Size: 535 bytes --]
Philip Kaludercic <philipk@posteo.net> writes:
>> Anyway, I rewrote the backend to use the JSON output of shellcheck,
>> which has the advantage that it provides the end position of each
>> diagnostic, so Flymake doesn't have to guess it (which is by nature
>> sometimes inaccurate). Let me know what you think.
>
> LGTM, but I haven't tested it yet.
I just tried it out and it behaves the way you advertised it.
BTW, this diff describes the changes required if you were to pull out
the sentinel definition into a named function:
[-- Attachment #2: Type: text/plain, Size: 4469 bytes --]
diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el
index 558b62b20a..d52e385b36 100644
--- a/lisp/progmodes/sh-script.el
+++ b/lisp/progmodes/sh-script.el
@@ -3129,50 +3129,49 @@ 'sh--json-read
(require 'json)
'json-read))
+(defun sh-shellcheck-sentinel (proc _event)
+ (when (memq (process-status proc) '(exit signal))
+ (unwind-protect
+ (if (with-current-buffer (process-get proc 'source)
+ (not (eq proc sh--shellcheck-process)))
+ (flymake-log :warning "Canceling obsolete check %s" proc)
+ (with-current-buffer (process-buffer proc)
+ (goto-char (point-min))
+ (thread-last
+ (sh--json-read)
+ (alist-get 'comments)
+ (seq-filter
+ (lambda (item)
+ (let-alist item (string= .file "-"))))
+ (mapcar
+ (lambda (item)
+ (let-alist item
+ (flymake-make-diagnostic
+ (process-get proc 'source)
+ (cons .line .column)
+ (unless (and (eq .line .endLine)
+ (eq .column .endColumn))
+ (cons .endLine .endColumn))
+ (pcase .level
+ ("error" :error)
+ ("warning" :warning)
+ (_ :note))
+ (format "SC%s: %s" .code .message)))))
+ (funcall (process-get proc 'report-fn)))))
+ (kill-buffer (process-buffer proc)))))
+
(defun sh-shellcheck-flymake (report-fn &rest _args)
"Flymake backend using the shellcheck program.
Takes a Flymake callback REPORT-FN as argument, as expected of a
member of `flymake-diagnostic-functions'."
(when (process-live-p sh--shellcheck-process)
(kill-process sh--shellcheck-process))
- (let* ((source (current-buffer))
- (dialect (named-let recur ((s sh-shell))
+ (let* ((dialect (named-let recur ((s sh-shell))
(pcase s
((or 'bash 'dash 'sh) (symbol-name s))
('ksh88 "ksh")
((guard s)
- (recur (alist-get s sh-ancestor-alist))))))
- (sentinel
- (lambda (proc _event)
- (when (memq (process-status proc) '(exit signal))
- (unwind-protect
- (if (with-current-buffer source
- (not (eq proc sh--shellcheck-process)))
- (flymake-log :warning "Canceling obsolete check %s" proc)
- (with-current-buffer (process-buffer proc)
- (goto-char (point-min))
- (thread-last
- (sh--json-read)
- (alist-get 'comments)
- (seq-filter
- (lambda (item)
- (let-alist item (string= .file "-"))))
- (mapcar
- (lambda (item)
- (let-alist item
- (flymake-make-diagnostic
- source
- (cons .line .column)
- (unless (and (eq .line .endLine)
- (eq .column .endColumn))
- (cons .endLine .endColumn))
- (pcase .level
- ("error" :error)
- ("warning" :warning)
- (_ :note))
- (format "SC%s: %s" .code .message)))))
- (funcall report-fn))))
- (kill-buffer (process-buffer proc)))))))
+ (recur (alist-get s sh-ancestor-alist)))))))
(unless dialect
(error "`sh-shellcheck-flymake' is not suitable for shell type `%s'"
sh-shell))
@@ -3185,7 +3184,9 @@ sh-shellcheck-flymake
"-s" ,dialect
,@sh-shellcheck-arguments
"-")
- :sentinel sentinel))
+ :sentinel #'sh-shellcheck-sentinel))
+ (process-put sh--shellcheck-process 'source (current-buffer))
+ (process-put sh--shellcheck-process 'report-fn report-fn)
(save-restriction
(widen)
(process-send-region sh--shellcheck-process (point-min) (point-max))
[-- Attachment #3: Type: text/plain, Size: 66 bytes --]
I still don't think it looks that bad, but I don't insist on it.
next prev parent reply other threads:[~2022-09-18 21:18 UTC|newest]
Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-17 16:48 bug#57884: [PATCH] Flymake backend using the shellcheck program Augusto Stoffel
2022-09-17 17:05 ` Eli Zaretskii
2022-09-17 17:32 ` Augusto Stoffel
2022-09-17 17:52 ` Eli Zaretskii
2022-09-17 18:17 ` Stefan Kangas
2022-09-17 17:55 ` Eli Zaretskii
2022-09-17 18:04 ` Stefan Kangas
2022-09-18 7:52 ` Augusto Stoffel
2022-09-18 11:55 ` Philip Kaludercic
2022-09-18 12:38 ` Augusto Stoffel
2022-09-18 12:50 ` Philip Kaludercic
2022-09-18 13:30 ` Augusto Stoffel
2022-09-18 13:46 ` Philip Kaludercic
2022-09-18 19:38 ` Augusto Stoffel
2022-09-18 20:22 ` Philip Kaludercic
2022-09-18 21:18 ` Philip Kaludercic [this message]
2022-09-19 7:33 ` Augusto Stoffel
2022-09-19 8:03 ` Philip Kaludercic
2022-09-24 7:05 ` Augusto Stoffel
2022-09-24 8:01 ` Philip Kaludercic
2022-11-04 22:56 ` Philip Kaludercic
2022-09-18 11:58 ` Philip Kaludercic
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87sfko755f.fsf@posteo.net \
--to=philipk@posteo.net \
--cc=57884@debbugs.gnu.org \
--cc=arstoffel@gmail.com \
--cc=eliz@gnu.org \
--cc=stefankangas@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.