Skip to content

Commit

Permalink
Start syntax checker chains
Browse files Browse the repository at this point in the history
  • Loading branch information
swsnr committed May 26, 2016
1 parent f08bb19 commit f042d5a
Showing 1 changed file with 40 additions and 32 deletions.
72 changes: 40 additions & 32 deletions flycheck.el
Expand Up @@ -2173,22 +2173,25 @@ Slots:
`buffer'
The buffer being checked

`checker'
`current-checker'
The syntax checker being used

`remaining-checkers'
Syntax checkers to run after the current one.

`context'
The context object."
buffer checker context)
buffer current-checker remaining-checkers context)

(defun flycheck-syntax-check-start (syntax-check callback)
"Start a SYNTAX-CHECK with CALLBACK."
(let ((checker (flycheck-syntax-check-checker syntax-check)))
(let ((checker (flycheck-syntax-check-current-checker syntax-check)))
(setf (flycheck-syntax-check-context syntax-check)
(funcall (flycheck-checker-get checker 'start) checker callback))))

(defun flycheck-syntax-check-interrupt (syntax-check)
"Interrupt a SYNTAX-CHECK."
(let* ((checker (flycheck-syntax-check-checker syntax-check))
(let* ((checker (flycheck-syntax-check-current-checker syntax-check))
(interrupt-fn (flycheck-checker-get checker 'interrupt))
(context (flycheck-syntax-check-context syntax-check)))
(when interrupt-fn
Expand Down Expand Up @@ -2434,15 +2437,19 @@ checker in order."
"The current syntax check in the this buffer.")
(put 'flycheck-current-syntax-check 'permanent-local t)

(defun flycheck-start-current-syntax-check (checker)
"Start a syntax check in the current buffer with CHECKER.
(defun flycheck-start-current-syntax-check (checkers)
"Start a syntax check in the current buffer with CHECKERS.

CHECKERS is a list of syntax checkers. Start the `car' of
CHECKERS and save the `cdr' of CHECKERS to run later.

Set `flycheck-current-syntax-check' accordingly."
;; Allocate the current syntax check *before* starting it. This allows for
;; synchronous checks, which call the status callback immediately in there
;; start function.
(let* ((check (flycheck-syntax-check-new :buffer (current-buffer)
:checker checker
:current-checker (car checkers)
:remaining-checkers (cdr checkers)
:context nil))
(callback (flycheck-buffer-status-callback check)))
(setq flycheck-current-syntax-check check)
Expand Down Expand Up @@ -2486,9 +2493,9 @@ Get a syntax checker for the current buffer with
(flycheck-clear-errors)
(flycheck-mark-all-overlays-for-deletion)
(condition-case err
(let* ((checker (flycheck-get-checker-for-buffer)))
(if checker
(flycheck-start-current-syntax-check checker)
(let ((checkers (flycheck-get-syntax-checker-chain-for-buffer)))
(if checkers
(flycheck-start-current-syntax-check checkers)
(flycheck-clear)
(flycheck-report-status 'no-checker)))
(error
Expand Down Expand Up @@ -2545,7 +2552,7 @@ discarded."
(eq syntax-check
(buffer-local-value 'flycheck-current-syntax-check buffer)))
(with-current-buffer buffer
(let ((checker (flycheck-syntax-check-checker syntax-check)))
(let ((checker (flycheck-syntax-check-current-checker syntax-check)))
(pcase status
((or `errored `interrupted)
(flycheck-report-failed-syntax-check status)
Expand Down Expand Up @@ -2573,35 +2580,36 @@ discarded."
ERRORS is a list of `flycheck-error' objects reported by the
current syntax check in `flycheck-current-syntax-check'.

Report all ERRORS and potentially start any next syntax checkers.
Report all ERRORS and potentially start any remaining syntax
checkers.

If the current syntax checker reported excessive errors, it is disabled
via `flycheck-disable-excessive-checker' for subsequent syntax
checks."
If the current syntax checker reported excessive errors, it is
disabled via `flycheck-disable-excessive-checker' for subsequent
syntax checks."
(let* ((syntax-check flycheck-current-syntax-check)
(checker (flycheck-syntax-check-checker syntax-check))
(checker (flycheck-syntax-check-current-checker syntax-check))
(next-checkers (flycheck-syntax-check-remaining-checkers syntax-check))
(errors (flycheck-relevant-errors
(flycheck-fill-and-expand-error-file-names
(flycheck-filter-errors
(flycheck-assert-error-list-p errors) checker)))))
(unless (flycheck-disable-excessive-checker checker errors)
(flycheck-report-current-errors errors))
(let ((next-checker (flycheck-get-next-checker-for-buffer checker)))
(if next-checker
(flycheck-start-current-syntax-check next-checker)
(setq flycheck-current-syntax-check nil)
(flycheck-report-status 'finished)
;; Delete overlays only after the very last checker has run, to avoid
;; flickering on intermediate re-displays
(flycheck-delete-marked-overlays)
(flycheck-error-list-refresh)
(run-hooks 'flycheck-after-syntax-check-hook)
(when (eq (current-buffer) (window-buffer))
(flycheck-display-error-at-point))
;; Immediately try to run any pending deferred syntax check, which
;; were triggered by intermediate automatic check event, to make sure
;; that we quickly refine outdated error information
(flycheck-perform-deferred-syntax-check)))))
(if next-checkers
(flycheck-start-current-syntax-check next-checkers)
(setq flycheck-current-syntax-check nil)
(flycheck-report-status 'finished)
;; Delete overlays only after the very last checker has run, to avoid
;; flickering on intermediate re-displays
(flycheck-delete-marked-overlays)
(flycheck-error-list-refresh)
(run-hooks 'flycheck-after-syntax-check-hook)
(when (eq (current-buffer) (window-buffer))
(flycheck-display-error-at-point))
;; Immediately try to run any pending deferred syntax check, which
;; were triggered by intermediate automatic check event, to make sure
;; that we quickly refine outdated error information
(flycheck-perform-deferred-syntax-check))))

(defun flycheck-disable-excessive-checker (checker errors)
"Disable CHECKER if it reported excessive ERRORS.
Expand Down

0 comments on commit f042d5a

Please sign in to comment.