0.1.1 • Published 9 years ago

clolint-js v0.1.1

Weekly downloads
3
License
MIT
Repository
github
Last release
9 years ago

clolint-js

Quick start

$ git clone git@github.com:mattfenwick/clolint-js
$ cd clolint-js
$ cat clj/examples.clj | node index.js > output.json

Overview

A tool for sanity checking Clojure code, by parsing it and performing various static analyses. I wrote it to help me learn Clojure -- it finds my stupid mistakes!

Examples

Parse errors such as mismatched or unmatched braces generate traces of line/column information, indicating what the parser was working on when it failed:

$ echo '(a b c' | node index.js

    {
      "status": "error",
      "value": {
        "phase": "parsing",
        "error information": [
          ["clojure", [1, 1]],
          ["list", [1, 1]],
          ["close", [2, 1]]
        ]
      }
    }

Domain checks of forms -- i.e. do the values satisfy Clojure constraints:

$ echo '{:a} \newlin ^ 3 []' | node index.js

    {
      "status": "success",
      "value": [
        {
          "number": 1,
          "severity": "error",
          "message": "uneven number of elements in table",
          "position": [1, 1]
        },
        {
          "value": "newlin",
          "severity": "error",
          "message": "invalid long char",
          "position": [1, 6]
        },
        {
          "type": "integer",
          "severity": "error",
          "message": "invalid metadata type",
          "position": [1, 16]
        }
      ]
    }

Special form syntax:

$ echo '(def x :docs 4)' | node index.js

    {
      "status": "success",
      "value": [
        {
          "severity": "error",
          "name": "def",
          "message": "in 4-arg version, doc-string must be a string",
          "position": [1, 8]
        }
      ]
    }

Anonymous functions and arguments:

$ echo '%x #(%a)' | node index.js

    {
      "status": "success",
      "value": [
        {
          "symbol": "%x",
          "severity": "warning",
          "message": "%-args should not be used outside of #-shorthand functions",
          "position": [1, 1]
        },
        {
          "error": [["token", [1, 7]]],
          "text": "%a",
          "severity": "error",
          "message": "invalid %-arg",
          "position": [1, 6]
        }
      ]
    }


$ echo '#(a #(b %1) %)' | node index.js

    {
      "status": "success",
      "value": [
        {
          "positions": [[1, 1]],
          "severity": "error",
          "message": "nested shorthand function",
          "position": [1, 5]
        }
      ]
    }

(TODO) Macro and function syntax

$ echo '(fn)' | node index.js

... TODO ...

(TODO) Indentation

(TODO) Symbol definitions: unused, undefined, redefined, shadowed

Other resources

License

MIT. Please don't use it for evil.

Contributing

Features, patches, ideas, corrections are all welcome!

0.1.1

9 years ago

0.1.0

10 years ago

0.0.3

10 years ago

0.0.2

10 years ago

0.0.1

10 years ago