From fb9bffd9987fb6c5ce114afbf215746e99b17c3f Mon Sep 17 00:00:00 2001 From: Mario Rodas Date: Sat, 8 Dec 2018 19:47:17 -0500 Subject: [PATCH] Add nix-linter checker --- doc/languages.rst | 6 ++++ flycheck.el | 31 +++++++++++++++++++ test/flycheck-test.el | 9 +++++- .../{nix.nix => nix/syntax-error.nix} | 0 test/resources/language/nix/warnings.nix | 5 +++ 5 files changed, 50 insertions(+), 1 deletion(-) rename test/resources/language/{nix.nix => nix/syntax-error.nix} (100%) create mode 100644 test/resources/language/nix/warnings.nix diff --git a/doc/languages.rst b/doc/languages.rst index a484c2606..8acddb1c5 100644 --- a/doc/languages.rst +++ b/doc/languages.rst @@ -755,6 +755,12 @@ to view the docstring of the syntax checker. Likewise, you may use .. _nix-instantiate: https://nixos.org/nix/manual/#sec-nix-instantiate + .. syntax-checker:: nix-linter + + Check Nix with nix-linter_. + + .. _nix-linter: https://github.com/Synthetica9/nix-linter + .. supported-language:: Perl Flycheck checks Perl with `perl` and `perl-perlcritic`. diff --git a/flycheck.el b/flycheck.el index 6b1a3c386..61bd434c8 100644 --- a/flycheck.el +++ b/flycheck.el @@ -211,6 +211,7 @@ attention to case differences." markdown-markdownlint-cli markdown-mdl nix + nix-linter perl perl-perlcritic php @@ -9421,6 +9422,36 @@ See URL `https://nixos.org/nix/manual/#sec-nix-instantiate'." (lambda (errors) (flycheck-sanitize-errors (flycheck-remove-error-file-names "(string)" errors))) + :next-checkers ((warning . nix-linter)) + :modes nix-mode) + +(defun flycheck-parse-nix-linter (output checker buffer) + "Parse nix-linter warnings from JSON OUTPUT. + +CHECKER and BUFFER denote the CHECKER that returned OUTPUT and +the BUFFER that was checked respectively. + +See URL `https://github.com/Synthetica9/nix-linter' for more +information about nix-linter." + (mapcar (lambda (err) + (let-alist err + (flycheck-error-new-at + .pos.spanBegin.sourceLine + .pos.spanBegin.sourceColumn + 'warning + .description + :id .offense + :checker checker + :buffer buffer + :filename (buffer-file-name buffer)))) + (flycheck-parse-json output))) + +(flycheck-define-checker nix-linter + "Nix checker using nix-linter. + +See URL `https://github.com/Synthetica9/nix-linter'." + :command ("nix-linter" "--json-stream" source) + :error-parser flycheck-parse-nix-linter :modes nix-mode) (defun flycheck-locate-sphinx-source-directory () diff --git a/test/flycheck-test.el b/test/flycheck-test.el index 44bdddc9f..31f237d65 100644 --- a/test/flycheck-test.el +++ b/test/flycheck-test.el @@ -4062,9 +4062,16 @@ Why not: (flycheck-ert-def-checker-test nix nix nil (flycheck-ert-should-syntax-check - "language/nix.nix" 'nix-mode + "language/nix/syntax-error.nix" 'nix-mode '(3 1 error "syntax error, unexpected IN, expecting ';'," :checker nix))) +(flycheck-ert-def-checker-test nix-linter nix nil + (flycheck-ert-should-syntax-check + "language/nix/warnings.nix" 'nix-mode + '(1 1 warning "LetInInheritRecset" :id "LetInInheritRecset" :checker nix-linter) + '(2 3 warning "Unused `let` bind `x`" :id "UnusedLetBind" :checker nix-linter) + '(3 4 warning "Unneeded `rec` on set" :id "UnneededRec" :checker nix-linter))) + (ert-deftest flycheck-locate-sphinx-source-directory/not-in-a-sphinx-project () :tags '(language-rst) (flycheck-ert-with-resource-buffer "language/rst/errors.rst" diff --git a/test/resources/language/nix.nix b/test/resources/language/nix/syntax-error.nix similarity index 100% rename from test/resources/language/nix.nix rename to test/resources/language/nix/syntax-error.nix diff --git a/test/resources/language/nix/warnings.nix b/test/resources/language/nix/warnings.nix new file mode 100644 index 000000000..70170d8ba --- /dev/null +++ b/test/resources/language/nix/warnings.nix @@ -0,0 +1,5 @@ +let + x = 5; +in rec { + inherit x; +} \ No newline at end of file