• João Távora's avatar
    New Flymake API variable flymake-diagnostic-functions · 94a88c1a
    João Távora authored
    Lay groundwork for multiple active backends in the same buffer.
    
    Backends are lisp functions called when flymake-mode sees fit.  They
    are responsible for examining the current buffer and telling
    flymake.el, via return value, if they can syntax check it.
    Backends should return quickly and inexpensively, but they are also
    passed a REPORT-FN argument which they may or may not call
    asynchronously after performing more expensive work.
    
    REPORT-FN's calling convention stipulates that a backend calls it with
    a list of diagnostics as argument, or, alternatively, with a symbol
    denoting an exceptional situation, usually some panic resulting from a
    misconfigured backend.  In keeping with legacy behaviour,
    flymake.el's response to a panic is to disable the issuing backend.
    
    The flymake--diag object representing a diagnostic now also keeps
    information about its source backend.  Among other uses, this allows
    flymake to selectively cleanup overlays based on which backend is
    updating its diagnostics.
    
    * lisp/progmodes/flymake-proc.el (flymake-proc--report-fn):
    New dynamic variable.
    (flymake-proc--process): New variable.
    (flymake-can-syntax-check-buffer): Remove.
    (flymake-proc--process-sentinel): Simplify.  Use
    unwind-protect.  Affect flymake-proc--processes here.
    Bind flymake-proc--report-fn.
    (flymake-proc--process-filter): Bind flymake-proc--report-fn.
    (flymake-proc--post-syntax-check): Delete
    (flymake-proc-start-syntax-check): Take mandatory
    report-fn.  Rewrite.  Bind flymake-proc--report-fn.
    (flymake-proc--process-sentinel): Rewrite and simplify.
    (flymake-proc--panic): New helper.
    (flymake-proc--start-syntax-check-process): Record report-fn
    in process.  Use flymake-proc--panic.
    (flymake-proc-stop-all-syntax-checks): Use mapc.  Don't affect
    flymake-proc--processes here.  Record interruption reason.
    (flymake-proc--init-find-buildfile-dir)
    (flymake-proc--init-create-temp-source-and-master-buffer-copy):
    Use flymake-proc--panic.
    (flymake-diagnostic-functions): Add
    flymake-proc-start-syntax-check.
    (flymake-proc-compile): Call
    flymake-proc-stop-all-syntax-checks with a reason.
    
    * lisp/progmodes/flymake.el (flymake-backends): Delete.
    (flymake-check-was-interrupted): Delete.
    (flymake--diag): Add backend slot.
    (flymake-delete-own-overlays): Take optional filter arg.
    (flymake-diagnostic-functions): New user-visible variable.
    (flymake--running-backends, flymake--disabled-backends): New
    buffer-local variables.
    (flymake-is-running): Now a function, not a variable.
    (flymake-mode-line, flymake-mode-line-e-w)
    (flymake-mode-line-status): Delete.
    (flymake-lighter):  flymake's minor-mode "lighter".
    (flymake-report): Delete.
    (flymake--backend): Delete.
    (flymake--can-syntax-check-buffer): Delete.
    (flymake--handle-report, flymake--disable-backend)
    (flymake--run-backend, flymake--run-backend):  New helpers.
    (flymake-make-report-fn): Make a lambda.
    (flymake--start-syntax-check): Iterate
    flymake-diagnostic-functions.
    (flymake-mode): Use flymake-lighter.  Simplify.  Initialize
    flymake--running-backends and flymake--disabled-backends.
    (flymake-find-file-hook): Simplify.
    
    * test/lisp/progmodes/flymake-tests.el
    (flymake-tests--call-with-fixture): Use flymake-is-running the
    function.  Check if flymake-mode already active before activating it.
    Add a thorough test for flymake multiple backends
    
    * lisp/progmodes/flymake.el (flymake--start-syntax-check):
    Don't use condition-case-unless-debug, use condition-case
    
    * test/lisp/progmodes/flymake-tests.el
    (flymake-tests--assert-set): New helper macro.
    (dummy-backends): New test.
    94a88c1a
flymake.el 26.7 KB