Code Monkey home page Code Monkey logo

cljfmt's Introduction

cljfmt Test Status Release Status

cljfmt is a tool for detecting and fixing formatting errors in Clojure code.

Its defaults are based on the Clojure Style Guide, but it also has many customization options to suit a particular project or team.

It is not the goal of the project to provide a one-to-one mapping between a Clojure syntax tree and formatted text; rather the intent is to correct formatting errors with minimal changes to the existing structure of the text.

If you want format completely unstructured Clojure code, the zprint project may be more suitable.

Breaking Changes in 0.11.x

The --indents and --alias-map keys have been removed from the CLI, in favor of using a configuration file instead.

The :indents key has been split into :indents and :extra-indents. The :indents key replaces all default indents, while the :extra-indents key will append to the default indents.

If you need to retain backward compatibility with an older version of cljfmt, then you can add the :legacy/merge-indents? key to your configuration:

{:legacy/merge-indents? true
 :indents {example.core/foo [[:inner 0]]}}

This will treat :indents as if it were :extra-indents. i.e. it is equivalent to:

{:extra-indents {example.core/foo [[:inner 0]]}}

Usage

cljfmt integrates with many existing build tools, or can be used as a library. As an end user, you have the choice of:

Standalone

The fastest way to run cljfmt is via a precompiled binary. If you're using Linux or MacOS, you can run the following command to install the binary into /usr/local/bin:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/weavejester/cljfmt/HEAD/install.sh)"

You can also run this command to update cljfmt to the latest version.

If you're using Windows, there's a zipped up binary you can download and extract manually.

To use cljfmt to check for formatting errors in your project, run:

cljfmt check

And to fix those errors:

cljfmt fix

Use --help for a list of all the command-line options.

For persistent configuration, you can use a configuration file.

Clojure Tools

The official Clojure CLI supports installation of thirdparty tools. To install cljfmt as a tool, run:

clj -Ttools install io.github.weavejester/cljfmt '{:git/tag "0.12.0"}' :as cljfmt

To use the tool to check for formatting errors in your project, run:

clj -Tcljfmt check

And to fix those errors:

clj -Tcljfmt fix

Leiningen

Leiningen is a popular Clojure build tool. To use cljfmt with Leiningen, add the following plugin to your project.clj file:

:plugins [[dev.weavejester/lein-cljfmt "0.12.0"]]

To use the plugin to check code for formatting errors, run:

lein cljfmt check

And to fix those errors:

lein cljfmt fix

To configure it, put a :cljfmt key and a map of options in your project file. See the configuration section for more details.

Library

cljfmt can be run as a library that formats a string of Clojure code or recursively checks / fixes paths like the CLI tool. First, add the dependency:

{:deps {dev.weavejester/cljfmt {:mvn/version "0.12.0"}}}

Then use the library:

Checking strings of code:

(require '[cljfmt.core :as fmt])

(fmt/reformat-string "(defn sum [x y]\n(+ x y))")
;; => "(defn sum [x y]\n  (+ x y))"

To load the configuration for the current directory:

(require '[cljfmt.config :as cfg])

(fmt/reformat-string "(+ x\ny)" (cfg/load-config))
;; => "(+ x\n   y)"

Checking / fixing paths recursively

Be sure to set the report fn to the clojure one as shown below. Otherwise the check and fix fns will assume they're running in console mode and will call System/exit, print to stdout, etc.

(require '[cljfmt.tool :as fmt]
         '[cljfmt.report :as report])

(fmt/check {:paths ["/path/to/check"], :report report/clojure})

Or to recursively fix paths:

(require '[cljfmt.tool :as fmt]
         '[cljfmt.report :as report])

(fmt/fix {:paths ["/path/to/fix"], :report report/clojure})

Editor Integration

You can also use cljfmt via your editor. Several Clojure editing environments have support for cljfmt baked in:

Configuration

In most environments, cljfmt will look for the following configuration files in the current and parent directories:

  • .cljfmt.edn
  • .cljfmt.clj
  • cljfmt.edn
  • cljfmt.clj

The configuration file should contain a map of options.

Leiningen

In Leiningen, the configuration is found in on the :cljfmt key in the project map:

:cljfmt {}

In order to load the standard configuration file from Leiningen, add the :load-config-file? key to the :cljfmt map:

:cljfmt {:load-config-file? true}

Formatting Options

  • :indentation? - true if cljfmt should correct the indentation of your code. Defaults to true.

  • :indents - a map of var symbols to indentation rules, i.e. {symbol [& rules]}. See INDENTS.md for a complete explanation. This will replace the default indents.

  • :extra-indents - the same as :indents, except that this will append to the default indents.

  • :alias-map - a map of namespace alias strings to fully qualified namespace names. This option is unnecessary in most cases, because cljfmt will parse the ns declaration in each file. See INDENTS.md.

  • :remove-surrounding-whitespace? - true if cljfmt should remove whitespace surrounding inner forms. This will convert (  foo  ) to (foo). Defaults to true.

  • :remove-trailing-whitespace? - true if cljfmt should remove trailing whitespace in lines. This will convert (foo)   \n to (foo)\n. Defaults to true.

  • :insert-missing-whitespace? - true if cljfmt should insert whitespace missing from between elements. This will convert (foo(bar)) to (foo (bar)). Defaults to true.

  • :remove-consecutive-blank-lines? - true if cljfmt should collapse consecutive blank lines. This will convert (foo)\n\n\n(bar) to (foo)\n\n(bar). Defaults to true.

  • :remove-multiple-non-indenting-spaces? - true if cljfmt should remove multiple non indenting spaces. For example, this will convert {:a 1     :b 2} to {:a 1 :b 2}. Defaults to false.

  • :split-keypairs-over-multiple-lines? - true if cljfmt should break hashmaps onto multiple lines. This will convert {:a 1 :b 2} to {:a 1\n:b 2}. Defaults to false.

  • :sort-ns-references? - true if cljfmt should alphanumerically sort the requires, imports and other references in the ns forms at the top of your namespaces. Defaults to false.

  • :function-arguments-indentation -

    • :community if cljfmt should follow the community style recommendation to indent function/macro arguments by a single space when there are no arguments on the same line as the function name.
    • :cursive if two spaces should be used instead, unless the first thing in the list (not counting metadata) is a data structure literal. This should replicate Cursive's default behaviour.
    • :zprint if two spaces should be used instead if the first thing in the list is a symbol or keyword. This should replicate zprint's default behaviour.

    Defaults to :community

Runtime Options

  • :file-pattern - a regular expression to decide which files to scan. Defaults to #”\.clj[csx]?$”.

  • :parallel? - true if cljfmt should process files in parallel. Defaults to false.

  • :paths - determines which files and directories to recursively search for Clojure files. Defaults to checking src and test, except in Leiningen where the :source-paths and :test-paths keys are used instead.

    Paths can also be passed as command line arguments. If the path is -, then the input is STDIN, and the output STDOUT.

License

Copyright © 2023 James Reeves

Distributed under the Eclipse Public License either version 1.0 or (at your option) any later version.

cljfmt's People

Contributors

arrdem avatar bbatsov avatar borkdude avatar bsless avatar cap10morgan avatar grzm avatar j-cr avatar jetmind avatar lread avatar luisthiamnye avatar mainej avatar matthewdarling avatar mwfogleman avatar noisesmith avatar or avatar pcarlisle avatar pedrorgirardi avatar pez avatar pfeodrippe avatar r6eve avatar rbxbx avatar replomancer avatar rgm avatar sg-qwt avatar sloxy avatar tomjkidd avatar ul avatar vemv avatar venantius avatar weavejester avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

cljfmt's Issues

java.lang.Exception: expects 1 value. [at line 43, column 42]

➜  server git:(master) ✗ lein cljfmt check                                                      
java.lang.Exception: expects 1 value. [at line 43, column 42]
 at rewrite_clj.reader$throw_reader.doInvoke (reader.clj:18)
    clojure.lang.RestFn.invoke (RestFn.java:464)
    rewrite_clj.reader$read_n.invoke (reader.clj:146)
    rewrite_clj.parser.core$parse_printables.doInvoke (core.clj:52)
    clojure.lang.RestFn.invoke (RestFn.java:442)
    rewrite_clj.parser.core$eval7113$fn__7114.invoke (core.clj:131)
    clojure.lang.MultiFn.invoke (MultiFn.java:227)
    rewrite_clj.reader$read_with_meta.invoke (reader.clj:117)
    rewrite_clj.parser.core$parse_next.invoke (core.clj:34)
    rewrite_clj.parser.core$parse_delim$fn__7062.invoke (core.clj:42)
    rewrite_clj.reader$read_repeatedly$fn__6968.invoke (reader.clj:126)
    clojure.core$repeatedly$fn__4750.invoke (core.clj:4716)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:484)
    clojure.core$seq.invoke (core.clj:133)
    clojure.core$take_while$fn__4274.invoke (core.clj:2636)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.Cons.next (Cons.java:39)
    clojure.lang.RT.next (RT.java:598)
    clojure.core$next.invoke (core.clj:64)
    clojure.core$dorun.invoke (core.clj:2856)
    clojure.core$doall.invoke (core.clj:2871)
    rewrite_clj.reader$read_repeatedly.invoke (reader.clj:126)
    rewrite_clj.parser.core$parse_delim.invoke (core.clj:43)
    rewrite_clj.parser.core$eval7125$fn__7126.invoke (core.clj:151)
    clojure.lang.MultiFn.invoke (MultiFn.java:227)
    rewrite_clj.reader$read_with_meta.invoke (reader.clj:117)
    rewrite_clj.parser.core$parse_next.invoke (core.clj:34)
    rewrite_clj.parser.core$parse_delim$fn__7062.invoke (core.clj:42)
    rewrite_clj.reader$read_repeatedly$fn__6968.invoke (reader.clj:126)
    clojure.core$repeatedly$fn__4750.invoke (core.clj:4716)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:484)
    clojure.core$seq.invoke (core.clj:133)
    clojure.core$take_while$fn__4274.invoke (core.clj:2636)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.Cons.next (Cons.java:39)
    clojure.lang.RT.next (RT.java:598)
    clojure.core$next.invoke (core.clj:64)
    clojure.core$dorun.invoke (core.clj:2856)
    clojure.core$doall.invoke (core.clj:2871)
    rewrite_clj.reader$read_repeatedly.invoke (reader.clj:126)
    rewrite_clj.parser.core$parse_delim.invoke (core.clj:43)
    rewrite_clj.parser.core$eval7125$fn__7126.invoke (core.clj:151)
    clojure.lang.MultiFn.invoke (MultiFn.java:227)
    rewrite_clj.reader$read_with_meta.invoke (reader.clj:117)
    rewrite_clj.parser.core$parse_next.invoke (core.clj:34)
    rewrite_clj.parser.core$parse_delim$fn__7062.invoke (core.clj:42)
    rewrite_clj.reader$read_repeatedly$fn__6968.invoke (reader.clj:126)
    clojure.core$repeatedly$fn__4750.invoke (core.clj:4716)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:484)
    clojure.core$seq.invoke (core.clj:133)
    clojure.core$take_while$fn__4274.invoke (core.clj:2636)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.Cons.next (Cons.java:39)
    clojure.lang.RT.next (RT.java:598)
    clojure.core$next.invoke (core.clj:64)
    clojure.core$dorun.invoke (core.clj:2856)
    clojure.core$doall.invoke (core.clj:2871)
    rewrite_clj.reader$read_repeatedly.invoke (reader.clj:126)
    rewrite_clj.parser.core$parse_delim.invoke (core.clj:43)
    rewrite_clj.parser.core$eval7125$fn__7126.invoke (core.clj:151)
    clojure.lang.MultiFn.invoke (MultiFn.java:227)
    rewrite_clj.reader$read_with_meta.invoke (reader.clj:117)
    rewrite_clj.parser.core$parse_next.invoke (core.clj:34)
    rewrite_clj.parser.core$parse_delim$fn__7062.invoke (core.clj:42)
    rewrite_clj.reader$read_repeatedly$fn__6968.invoke (reader.clj:126)
    clojure.core$repeatedly$fn__4750.invoke (core.clj:4716)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:484)
    clojure.core$seq.invoke (core.clj:133)
    clojure.core$take_while$fn__4274.invoke (core.clj:2636)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.Cons.next (Cons.java:39)
    clojure.lang.RT.next (RT.java:598)
    clojure.core$next.invoke (core.clj:64)
    clojure.core$dorun.invoke (core.clj:2856)
    clojure.core$doall.invoke (core.clj:2871)
    rewrite_clj.reader$read_repeatedly.invoke (reader.clj:126)
    rewrite_clj.parser.core$parse_delim.invoke (core.clj:43)
    rewrite_clj.parser.core$eval7125$fn__7126.invoke (core.clj:151)
    clojure.lang.MultiFn.invoke (MultiFn.java:227)
    rewrite_clj.reader$read_with_meta.invoke (reader.clj:117)
    rewrite_clj.parser.core$parse_next.invoke (core.clj:34)
    rewrite_clj.parser.core$parse_delim$fn__7062.invoke (core.clj:42)
    rewrite_clj.reader$read_repeatedly$fn__6968.invoke (reader.clj:126)
    clojure.core$repeatedly$fn__4750.invoke (core.clj:4716)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:484)
    clojure.core$seq.invoke (core.clj:133)
    clojure.core$take_while$fn__4274.invoke (core.clj:2636)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.Cons.next (Cons.java:39)
    clojure.lang.RT.next (RT.java:598)
    clojure.core$next.invoke (core.clj:64)
    clojure.core$dorun.invoke (core.clj:2856)
    clojure.core$doall.invoke (core.clj:2871)
    rewrite_clj.reader$read_repeatedly.invoke (reader.clj:126)
    rewrite_clj.parser.core$parse_delim.invoke (core.clj:43)
    rewrite_clj.parser.core$eval7125$fn__7126.invoke (core.clj:151)
    clojure.lang.MultiFn.invoke (MultiFn.java:227)
    rewrite_clj.reader$read_with_meta.invoke (reader.clj:117)
    rewrite_clj.parser.core$parse_next.invoke (core.clj:34)
    rewrite_clj.parser.core$parse_delim$fn__7062.invoke (core.clj:42)
    rewrite_clj.reader$read_repeatedly$fn__6968.invoke (reader.clj:126)
    clojure.core$repeatedly$fn__4750.invoke (core.clj:4716)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:484)
    clojure.core$seq.invoke (core.clj:133)
    clojure.core$take_while$fn__4274.invoke (core.clj:2636)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.Cons.next (Cons.java:39)
    clojure.lang.RT.next (RT.java:598)
    clojure.core$next.invoke (core.clj:64)
    clojure.core$dorun.invoke (core.clj:2856)
    clojure.core$doall.invoke (core.clj:2871)
    rewrite_clj.reader$read_repeatedly.invoke (reader.clj:126)
    rewrite_clj.parser.core$parse_delim.invoke (core.clj:43)
    rewrite_clj.parser.core$eval7125$fn__7126.invoke (core.clj:151)
    clojure.lang.MultiFn.invoke (MultiFn.java:227)
    rewrite_clj.reader$read_with_meta.invoke (reader.clj:117)
    rewrite_clj.parser.core$parse_next.invoke (core.clj:34)
    rewrite_clj.parser.core$parse_delim$fn__7062.invoke (core.clj:42)
    rewrite_clj.reader$read_repeatedly$fn__6968.invoke (reader.clj:126)
    clojure.core$repeatedly$fn__4750.invoke (core.clj:4716)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:484)
    clojure.core$seq.invoke (core.clj:133)
    clojure.core$take_while$fn__4274.invoke (core.clj:2636)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.Cons.next (Cons.java:39)
    clojure.lang.RT.next (RT.java:598)
    clojure.core$next.invoke (core.clj:64)
    clojure.core$dorun.invoke (core.clj:2856)
    clojure.core$doall.invoke (core.clj:2871)
    rewrite_clj.reader$read_repeatedly.invoke (reader.clj:126)
    rewrite_clj.parser.core$parse_delim.invoke (core.clj:43)
    rewrite_clj.parser.core$eval7125$fn__7126.invoke (core.clj:151)
    clojure.lang.MultiFn.invoke (MultiFn.java:227)
    rewrite_clj.reader$read_with_meta.invoke (reader.clj:117)
    rewrite_clj.parser.core$parse_next.invoke (core.clj:34)
    rewrite_clj.parser.core$parse_delim$fn__7062.invoke (core.clj:42)
    rewrite_clj.reader$read_repeatedly$fn__6968.invoke (reader.clj:126)
    clojure.core$repeatedly$fn__4750.invoke (core.clj:4716)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:484)
    clojure.core$seq.invoke (core.clj:133)
    clojure.core$take_while$fn__4274.invoke (core.clj:2636)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.Cons.next (Cons.java:39)
    clojure.lang.RT.next (RT.java:598)
    clojure.core$next.invoke (core.clj:64)
    clojure.core$dorun.invoke (core.clj:2856)
    clojure.core$doall.invoke (core.clj:2871)
    rewrite_clj.reader$read_repeatedly.invoke (reader.clj:126)
    rewrite_clj.parser.core$parse_delim.invoke (core.clj:43)
    rewrite_clj.parser.core$eval7125$fn__7126.invoke (core.clj:151)
    clojure.lang.MultiFn.invoke (MultiFn.java:227)
    rewrite_clj.reader$read_with_meta.invoke (reader.clj:117)
    rewrite_clj.parser.core$parse_next.invoke (core.clj:34)
    rewrite_clj.parser$parse.invoke (parser.clj:13)
    rewrite_clj.parser$parse_all$fn__7142.invoke (parser.clj:18)
    clojure.core$repeatedly$fn__4750.invoke (core.clj:4716)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:484)
    clojure.core$seq.invoke (core.clj:133)
    clojure.core$take_while$fn__4274.invoke (core.clj:2636)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.Cons.next (Cons.java:39)
    clojure.lang.RT.next (RT.java:598)
    clojure.core$next.invoke (core.clj:64)
    clojure.core$dorun.invoke (core.clj:2856)
    clojure.core$doall.invoke (core.clj:2871)
    rewrite_clj.parser$parse_all.invoke (parser.clj:18)
    rewrite_clj.parser$parse_string_all.invoke (parser.clj:35)
    cljfmt.core$reformat_string.doInvoke (core.clj:192)
    clojure.lang.RestFn.invoke (RestFn.java:423)
    leiningen.cljfmt$reformat_string.invoke (cljfmt.clj:23)
    leiningen.cljfmt$valid_format_QMARK_.invoke (cljfmt.clj:27)
    clojure.lang.AFn.applyToHelper (AFn.java:156)
    clojure.lang.AFn.applyTo (AFn.java:144)
    clojure.core$apply.invoke (core.clj:626)
    clojure.core$partial$fn__4228.doInvoke (core.clj:2468)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$complement$fn__4082.invoke (core.clj:1370)
    clojure.core$filter$fn__4264.invoke (core.clj:2605)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:56)
    clojure.lang.RT.seq (RT.java:484)
    clojure.core$seq.invoke (core.clj:133)
    clojure.core$empty_QMARK_.invoke (core.clj:5706)
    leiningen.cljfmt$check.doInvoke (cljfmt.clj:58)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.cljfmt$check.invoke (cljfmt.clj:54)
    clojure.lang.AFn.applyToHelper (AFn.java:154)
    clojure.lang.RestFn.applyTo (RestFn.java:132)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.cljfmt$cljfmt.doInvoke (cljfmt.clj:79)
    clojure.lang.RestFn.invoke (RestFn.java:425)
    clojure.lang.Var.invoke (Var.java:383)
    clojure.lang.AFn.applyToHelper (AFn.java:156)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.core.main$partial_task$fn__6071.doInvoke (main.clj:253)
    clojure.lang.RestFn.applyTo (RestFn.java:139)
    clojure.lang.AFunction$1.doInvoke (AFunction.java:29)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.core.main$apply_task.invoke (main.clj:303)
    leiningen.core.main$resolve_and_apply.invoke (main.clj:309)
    leiningen.core.main$_main$fn__6136.invoke (main.clj:377)
    leiningen.core.main$_main.doInvoke (main.clj:366)
    clojure.lang.RestFn.invoke (RestFn.java:421)
    clojure.lang.Var.invoke (Var.java:383)
    clojure.lang.AFn.applyToHelper (AFn.java:156)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invoke (core.clj:624)
    clojure.main$main_opt.invoke (main.clj:315)
    clojure.main$main.doInvoke (main.clj:420)
    clojure.lang.RestFn.invoke (RestFn.java:457)
    clojure.lang.Var.invoke (Var.java:394)
    clojure.lang.AFn.applyToHelper (AFn.java:165)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.main.main (main.java:37)

Error w/ Installation

When I run lein to see all commands I get:

leiningen.cljfmt  Problem loading: java.io.FileNotFoundException: Could not locate rewrite_clj/node__init.class or rewrite_clj/node.clj on classpath: , compiling:(cljfmt/core.clj:1:1)

I'm sure I'm doing something wrong.

Lein 2.5
[lein-cljfmt "0.1.10"]

"Invalid token :mm/dd/yyyy"

This might be a clojure.tools bug, however:

lein cljfmt fails on keyword ":mm/dd/yyyy", which parses in clojure.

Example:

 #\ cat cljfmt-invalid-token.clj
(def token :mm/dd/yyyy)
 #\ lein cljfmt check cljfmt-invalid-token.clj
clojure.lang.ExceptionInfo: Invalid token: :mm/dd/yyyy
 at clojure.core$ex_info.invoke (core.clj:4403)
    clojure.tools.reader.reader_types$reader_error.doInvoke (reader_types.clj:337)
    clojure.lang.RestFn.invoke (RestFn.java:439)
    clojure.tools.reader.edn$read_keyword.invoke (edn.clj:268)
    clojure.tools.reader.edn$read.invoke (edn.clj:369)
    clojure.tools.reader.edn$read.invoke (edn.clj:357)
    clojure.tools.reader.edn$read.invoke (edn.clj:354)
    rewrite_clj.parser.keyword$parse_keyword.invoke (keyword.clj:18)
    rewrite_clj.parser.core$eval3255$fn__3256.invoke (core.clj:95)
    clojure.lang.MultiFn.invoke (MultiFn.java:227)
    rewrite_clj.reader$read_with_meta.invoke (reader.clj:117)
    rewrite_clj.parser.core$parse_next.invoke (core.clj:34)
    rewrite_clj.parser.core$parse_delim$fn__3225.invoke (core.clj:42)
    rewrite_clj.reader$read_repeatedly$fn__3124.invoke (reader.clj:126)

Support for cond

It's my personal style to format cond forms as such:

(cond
  (test-one)
  ,,(expr-one)

  (test-two)
  ,,(expr-two)

  ...)

Even if it isn't on by default, it'd be awesome if cljfmt had support for this convention.

Regular expression reformatting mistakes

cljfmt (actually node-cljfmt, if that's important) made this change:

-         (re-find #"(?i)RUNNING"))
+         (re-find #"RUNNING"))

which is not equivalent. Similarly this:

-            (re-find #"(?m)^rss\s+(\d+)$")
+            (re-find #"^rss\s+(\d+)$")

is likely a breaking change. Is this expected?

It also made this change:

-  (->> (str/split container-name #"/")
+  (->> (str/split container-name #"\/")

which at least seems less destructive.

Indentation of proxy

The indentation of proxy as part of a let-binding, by clojure-mode:

(proxy [SimpleJavaFileObject]
    [(URI. path) JavaFileObject$Kind/SOURCE]
  (getCharContent [_] (slurp res)))

cljfmt changes it to:

(proxy [SimpleJavaFileObject]
       [(URI. path) JavaFileObject$Kind/SOURCE]
  (getCharContent [_] (slurp res)))

I prefer the indentation by clojure-mode because the first and second arg have different semantics, but I care more about both tools producing the same output.

//cc @bbatsov

Support for defn

By convention, defns with a single arity are indented approximately as such:

(defn foo
  docstring?
  attr-map?
  [args]
  forms)
  • If there is no docstring or meta and the args vector is "short" then the name and the args should be on the same line as the defn.
  • If there is only one body form and it is "short", then it should be on the same line as the args vector.
  • If there is only one arity, then (defn foo ([args] & forms)) should be rewritten as above.

Trailing comment at EOF causes a java.lang.Exception: Unexpected EOF

When running lein cljfmt check src/posthere/pretty_print.clj, I get an error.

The file that causes the issue is here: https://github.com/path/posthere.io/blob/master/src/posthere/pretty_print.clj

The last line of the file ends in a comment:

     (mark-url-encoded-invalid request)))) ; potentially mark it as invalid URL encoded

Here is the error:

java.lang.Exception: Unexpected EOF. [at line 145, column 89]
 at rewrite_clj.reader$throw_reader.doInvoke (reader.clj:18)
    clojure.lang.RestFn.invoke (RestFn.java:425)
    rewrite_clj.reader$read_while.doInvoke (reader.clj:71)
    clojure.lang.RestFn.invoke (RestFn.java:442)
    rewrite_clj.reader$read_until.invoke (reader.clj:80)
    rewrite_clj.reader$read_include_linebreak.invoke (reader.clj:85)
    rewrite_clj.parser.core$eval2038$fn__2039.invoke (core.clj:88)
    clojure.lang.MultiFn.invoke (MultiFn.java:227)
    rewrite_clj.reader$read_with_meta.invoke (reader.clj:115)
    rewrite_clj.parser.core$parse_next.invoke (core.clj:34)
    rewrite_clj.parser$parse.invoke (parser.clj:13)
    rewrite_clj.parser$parse_all$fn__2092.invoke (parser.clj:18)
    clojure.core$repeatedly$fn__4750.invoke (core.clj:4716)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:484)
    clojure.core$seq.invoke (core.clj:133)
    clojure.core$take_while$fn__4274.invoke (core.clj:2636)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.Cons.next (Cons.java:39)
    clojure.lang.RT.next (RT.java:598)
    clojure.core$next.invoke (core.clj:64)
    clojure.core$dorun.invoke (core.clj:2856)
    clojure.core$doall.invoke (core.clj:2871)
    rewrite_clj.parser$parse_all.invoke (parser.clj:18)
    rewrite_clj.parser$parse_string_all.invoke (parser.clj:35)
    cljfmt.core$reformat_string.doInvoke (core.clj:211)
    clojure.lang.RestFn.invoke (RestFn.java:423)
    leiningen.cljfmt$reformat_string.invoke (cljfmt.clj:23)
    leiningen.cljfmt$valid_format_QMARK_.invoke (cljfmt.clj:27)
    clojure.lang.AFn.applyToHelper (AFn.java:156)
    clojure.lang.AFn.applyTo (AFn.java:144)
    clojure.core$apply.invoke (core.clj:626)
    clojure.core$partial$fn__4228.doInvoke (core.clj:2468)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$complement$fn__4082.invoke (core.clj:1370)
    clojure.core$filter$fn__4264.invoke (core.clj:2605)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:56)
    clojure.lang.Cons.next (Cons.java:39)
    clojure.lang.RT.next (RT.java:598)
    clojure.core$next.invoke (core.clj:64)
    leiningen.cljfmt$check.doInvoke (cljfmt.clj:60)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.cljfmt$check.invoke (cljfmt.clj:54)
    clojure.lang.AFn.applyToHelper (AFn.java:154)
    clojure.lang.RestFn.applyTo (RestFn.java:132)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.cljfmt$cljfmt.doInvoke (cljfmt.clj:79)
    clojure.lang.RestFn.invoke (RestFn.java:425)
    clojure.lang.Var.invoke (Var.java:383)
    clojure.lang.AFn.applyToHelper (AFn.java:156)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.core.main$partial_task$fn__6094.doInvoke (main.clj:263)
    clojure.lang.RestFn.applyTo (RestFn.java:139)
    clojure.lang.AFunction$1.doInvoke (AFunction.java:29)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.core.main$apply_task.invoke (main.clj:313)
    lein_environ.plugin$write_env_to_file.invoke (plugin.clj:11)
    clojure.lang.Var.invoke (Var.java:394)
    clojure.lang.AFn.applyToHelper (AFn.java:165)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invoke (core.clj:626)
    robert.hooke$compose_hooks$fn__11735.doInvoke (hooke.clj:40)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invoke (core.clj:624)
    robert.hooke$run_hooks.invoke (hooke.clj:46)
    robert.hooke$prepare_for_hooks$fn__11740$fn__11741.doInvoke (hooke.clj:54)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.lang.AFunction$1.doInvoke (AFunction.java:29)
    clojure.lang.RestFn.invoke (RestFn.java:436)
    leiningen.core.main$resolve_and_apply.invoke (main.clj:319)
    leiningen.core.main$_main$fn__6160.invoke (main.clj:392)
    leiningen.core.main$_main.doInvoke (main.clj:385)
    clojure.lang.RestFn.invoke (RestFn.java:421)
    clojure.lang.Var.invoke (Var.java:383)
    clojure.lang.AFn.applyToHelper (AFn.java:156)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invoke (core.clj:624)
    clojure.main$main_opt.invoke (main.clj:315)
    clojure.main$main.doInvoke (main.clj:420)
    clojure.lang.RestFn.invoke (RestFn.java:457)
    clojure.lang.Var.invoke (Var.java:394)
    clojure.lang.AFn.applyToHelper (AFn.java:165)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.main.main (main.java:37)

Strange exception

I get this trying to run lein cljfmt check over my source tree:

ul@cybercraft ~/V/vion> lein cljfmt check
java.lang.UnsupportedOperationException: null
 at rewrite_clj.node.comment.CommentNode.sexpr (comment.clj:6)
    rewrite_clj.node$value.invoke (node.clj:116)
    rewrite_clj.zip.base$value.invoke (base.clj:56)
    cljfmt.core$inner_indent.invoke (core.clj:100)
    cljfmt.core$eval2847$fn__2849$fn__2851.invoke (core.clj:132)
    clojure.core$some_fn$sp2__6490.invoke (core.clj:6800)
    clojure.core$some_fn$spn__6527$fn__6528.invoke (core.clj:6817)
    clojure.core$some.invoke (core.clj:2515)
    clojure.core$some_fn$spn__6527.invoke (core.clj:6817)
    cljfmt.core$indent_amount.invoke (core.clj:143)
    cljfmt.core$indent_line.invoke (core.clj:147)
    cljfmt.core$indent$fn__2870.invoke (core.clj:154)
    cljfmt.core$edit_all.invoke (core.clj:12)
    clojure.lang.AFn.applyToHelper (AFn.java:160)
    clojure.lang.AFn.applyTo (AFn.java:144)
    clojure.core$apply.invoke (core.clj:626)
    cljfmt.core$transform.doInvoke (core.clj:16)
    clojure.lang.RestFn.invoke (RestFn.java:464)
    cljfmt.core$indent.invoke (core.clj:154)
    cljfmt.core$reindent.invoke (core.clj:157)
    cljfmt.core$reformat_form.doInvoke (core.clj:167)
    clojure.lang.RestFn.invoke (RestFn.java:423)
    cljfmt.core$reformat_string.doInvoke (core.clj:170)
    clojure.lang.RestFn.invoke (RestFn.java:423)
    leiningen.cljfmt$reformat_string.invoke (cljfmt.clj:23)
    leiningen.cljfmt$valid_format_QMARK_.invoke (cljfmt.clj:27)
    clojure.lang.AFn.applyToHelper (AFn.java:156)
    clojure.lang.AFn.applyTo (AFn.java:144)
    clojure.core$apply.invoke (core.clj:626)
    clojure.core$partial$fn__4228.doInvoke (core.clj:2468)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$complement$fn__4082.invoke (core.clj:1370)
    clojure.core$filter$fn__4264.invoke (core.clj:2605)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:56)
    clojure.lang.RT.seq (RT.java:484)
    clojure.core$seq.invoke (core.clj:133)
    clojure.core$empty_QMARK_.invoke (core.clj:5706)
    leiningen.cljfmt$check.doInvoke (cljfmt.clj:58)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.cljfmt$check.invoke (cljfmt.clj:54)
    clojure.lang.AFn.applyToHelper (AFn.java:154)
    clojure.lang.RestFn.applyTo (RestFn.java:132)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.cljfmt$cljfmt.doInvoke (cljfmt.clj:79)
    clojure.lang.RestFn.invoke (RestFn.java:425)
    clojure.lang.Var.invoke (Var.java:383)
    clojure.lang.AFn.applyToHelper (AFn.java:156)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.core.main$partial_task$fn__6094.doInvoke (main.clj:263)
    clojure.lang.RestFn.applyTo (RestFn.java:139)
    clojure.lang.AFunction$1.doInvoke (AFunction.java:29)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.core.main$apply_task.invoke (main.clj:313)
    leiningen.core.main$resolve_and_apply.invoke (main.clj:319)
    leiningen.core.main$_main$fn__6160.invoke (main.clj:392)
    leiningen.core.main$_main.doInvoke (main.clj:385)
    clojure.lang.RestFn.invoke (RestFn.java:421)
    clojure.lang.Var.invoke (Var.java:383)
    clojure.lang.AFn.applyToHelper (AFn.java:156)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invoke (core.clj:624)
    clojure.main$main_opt.invoke (main.clj:315)
    clojure.main$main.doInvoke (main.clj:420)
    clojure.lang.RestFn.invoke (RestFn.java:457)
    clojure.lang.Var.invoke (Var.java:394)
    clojure.lang.AFn.applyToHelper (AFn.java:165)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.main.main (main.java:37)

Some individual files are checked successfully, thus generally plugin is working. How do I determine problematic files if not trying to run check on every file individually?

cljfmt has some aggressive ideas about comments

Running lein cljfmt check on Ultra, I hit this pleasant little critter:

-  #_(if (not (false? tests))
-    (test/activate!))
+  #_[:tag :list][:format-string "(%s)"][:wrap-length 2][:seq-fn #<seq$list_node$fn__6552 rewrite_clj.node.seq$list_node$fn__6552@ab4d2ba>][:children (<token: if> <whitespace: " "> <list: (not (false? tests))> <newline: "\n"> <list: (test/activate!)>)]

Suffice it to say that this seems...probably unintended. Thoughts?

cond-> should be indented like cond

I believe cond-> and cond->> should be indented like the following,

(cond->> [:a :b :c]
  (pred?) (remove #{:a})
  true    (vec))

but cljfmt indents them like this:

(cond->> [:a :b :c]
         (pred?) (remove #{:a})
         true    (vec))

For instance, see here.

Exception running cljfmt on a largish project

I'm seeing the following exception when I run cljfmt:

java.lang.ClassCastException: fast_zip.core.ZipperLocation cannot be cast to clojure.lang.IFn
 at clojure.zip$next.invokeStatic (zip.clj:236)
    clojure.zip$next.invoke (zip.clj:230)
    rewrite_clj.zip.find$find_next.invokeStatic (find.clj:48)
    rewrite_clj.zip.find$find_next.invoke (find.clj:41)
    cljfmt.core$edit_all.invokeStatic (core.cljc:39)
    cljfmt.core$edit_all.invoke (core.cljc:37)
    clojure.lang.AFn.applyToHelper (AFn.java:160)
    clojure.lang.AFn.applyTo (AFn.java:144)
    clojure.core$apply.invokeStatic (core.clj:648)
    clojure.core$apply.invoke (core.clj:641)
    cljfmt.core$transform.invokeStatic (core.cljc:44)
    cljfmt.core$transform.doInvoke (core.cljc:43)
    clojure.lang.RestFn.invoke (RestFn.java:464)
    cljfmt.core$remove_consecutive_blank_lines.invokeStatic (core.cljc:100)
    cljfmt.core$remove_consecutive_blank_lines.invoke (core.cljc:99)
    cljfmt.core$reformat_form.invokeStatic (core.cljc:279)
    cljfmt.core$reformat_form.doInvoke (core.cljc:276)
    clojure.lang.RestFn.invoke (RestFn.java:423)
    cljfmt.core$reformat_string.invokeStatic (core.cljc:290)
    cljfmt.core$reformat_string.doInvoke (core.cljc:288)
    clojure.lang.RestFn.invoke (RestFn.java:423)
    leiningen.cljfmt$reformat_string.invokeStatic (cljfmt.clj:27)
    leiningen.cljfmt$reformat_string.invoke (cljfmt.clj:26)
    leiningen.cljfmt$fix.invokeStatic (cljfmt.clj:86)
    leiningen.cljfmt$fix.doInvoke (cljfmt.clj:77)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invokeStatic (core.clj:648)
    clojure.core$apply.invoke (core.clj:641)
    leiningen.cljfmt$cljfmt.invokeStatic (cljfmt.clj:96)
    leiningen.cljfmt$cljfmt.doInvoke (cljfmt.clj:91)
    clojure.lang.RestFn.invoke (RestFn.java:3913)
    clojure.lang.Var.invoke (Var.java:676)
    clojure.lang.AFn.applyToHelper (AFn.java:403)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invokeStatic (core.clj:648)
    clojure.core$apply.invoke (core.clj:641)
    leiningen.core.main$partial_task$fn__5829.doInvoke (main.clj:272)
    clojure.lang.RestFn.applyTo (RestFn.java:139)
    clojure.lang.AFunction$1.doInvoke (AFunction.java:29)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invokeStatic (core.clj:648)
    clojure.core$apply.invoke (core.clj:641)
    leiningen.core.main$apply_task.invokeStatic (main.clj:322)
    leiningen.core.main$apply_task.invoke (main.clj:308)
    leiningen.core.main$resolve_and_apply.invokeStatic (main.clj:328)
    leiningen.core.main$resolve_and_apply.invoke (main.clj:324)
    leiningen.core.main$_main$fn__5895.invoke (main.clj:401)
    leiningen.core.main$_main.invokeStatic (main.clj:394)
    leiningen.core.main$_main.doInvoke (main.clj:391)
    clojure.lang.RestFn.invoke (RestFn.java:3894)
    clojure.lang.Var.invoke (Var.java:676)
    clojure.lang.AFn.applyToHelper (AFn.java:403)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invokeStatic (core.clj:646)
    clojure.main$main_opt.invokeStatic (main.clj:314)
    clojure.main$main_opt.invoke (main.clj:310)
    clojure.main$main.invokeStatic (main.clj:421)
    clojure.main$main.doInvoke (main.clj:384)
    clojure.lang.RestFn.invoke (RestFn.java:3894)
    clojure.lang.Var.invoke (Var.java:676)
    clojure.lang.AFn.applyToHelper (AFn.java:403)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.main.main (main.java:37)
    sun.reflect.NativeMethodAccessorImpl.invoke0 (NativeMethodAccessorImpl.java:-2)
    sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62)
    sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43)
    java.lang.reflect.Method.invoke (Method.java:498)
    org.flatland.drip.Main.invoke (Main.java:117)
    org.flatland.drip.Main.start (Main.java:88)
    org.flatland.drip.Main.main (Main.java:64)

This also happens when I don't use drip btw - I was looking for a way to more quickly run cljfmt one file at a time, hence drip.

Support var indentation metadata

We've come up with some indentation spec for CIDER's dynamic indentation functionality, we consider fairly flexible and not CIDER-specific at all. The details are here.

It'd be nice if cljfmt (and other tools in general) respected indentation settings provided via such metadata. //cc @Malabarba

EDN file for project-wide configuration?

I'd love to be able to add a .cljfmt.edn file to my projects, specifying various forms of let alignment (e.g. #36 ) or strict whitespace removal (e.g. #39), and have all of the contributors format their PR's automatically so everything lines up nicely with the project's style guidelines (also, upon style changes, there's a single place to update and the entire codebase can be reformatted).

Actually, I'd enjoy this even more when contributing to other projects, as right now I have tons of issues with aggressive-indent-mode and whitespace problems, and end up having to link to the whitespace-disabled comparison view for PR's.

I'd like to be very aggressive about it (for my own personal/work projects), such that every character is placed according to format rules. Happy to write the rules once and then never deal with whitespace merges again.

Comment immediately before a method causes indent

Running cljfmt against the following suggests that the method should be indented 1 space:

(ns foo.core)

;; Just a comment...
(defn foo
  "I don't do a whole lot."
  [x]
  (println x "Hello, World!"))

I'm fairly certain that top-level methods shouldn't be indented, even if following a comment. If anything, maybe the correct suggestion would be to introduce a blank-line (but even that I'm not so sure about).

Could not find project.clj

I'm trying to format a single file by running lein cljfmt check <filename> but it keeps telling me that it Couldn't find project.clj, which is needed for cljfmt. Why does it need a project.clj even for a single file?

java.lang.StackOverflowError when running "lein cljfmt check"

I ran a lein cljfmt check on one of my projects and encountered as stack overflow error.

I'm using v0.1.10 of cljfmt with v2.5.1 of leiningen. Here's the stack trace:

Exception in thread "main" java.lang.StackOverflowError
    at java.lang.ThreadLocal.get(ThreadLocal.java:144)
    at java.lang.StringCoding.deref(StringCoding.java:63)
    at java.lang.StringCoding.encode(StringCoding.java:330)
    at java.lang.String.getBytes(String.java:916)
    at java.io.UnixFileSystem.getBooleanAttributes0(Native Method)
    at java.io.UnixFileSystem.getBooleanAttributes(UnixFileSystem.java:242)
    at java.io.File.exists(File.java:813)
    at sun.reflect.GeneratedMethodAccessor68.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at clojure.lang.Reflector.invokeMatchingMethod(Reflector.java:93)
    at clojure.lang.Reflector.invokeNoArgInstanceMember(Reflector.java:313)
    at leiningen.cljfmt$format_paths$fn__5098.invoke(cljfmt.clj:50)
    at clojure.core$filter$fn__4264.invoke(core.clj:2601)
    at clojure.lang.LazySeq.sval(LazySeq.java:40)
    at clojure.lang.LazySeq.seq(LazySeq.java:49)
    at clojure.lang.Cons.next(Cons.java:39)
    at clojure.lang.RT.boundedLength(RT.java:1654)
    at clojure.lang.RestFn.applyTo(RestFn.java:130)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$check.invoke(cljfmt.clj:54)
    at clojure.lang.AFn.applyToHelper(AFn.java:154)
    at clojure.lang.RestFn.applyTo(RestFn.java:132)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.cljfmt$cljfmt.doInvoke(cljfmt.clj:79)
    at clojure.lang.RestFn.invoke(RestFn.java:425)
    at clojure.lang.Var.invoke(Var.java:383)
    at clojure.lang.AFn.applyToHelper(AFn.java:156)
    at clojure.lang.Var.applyTo(Var.java:700)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.core.main$partial_task$fn__6094.doInvoke(main.clj:263)
    at clojure.lang.RestFn.applyTo(RestFn.java:139)
    at clojure.lang.AFunction$1.doInvoke(AFunction.java:29)
    at clojure.lang.RestFn.applyTo(RestFn.java:137)
    at clojure.core$apply.invoke(core.clj:626)
    at leiningen.core.main$apply_task.invoke(main.clj:313)
    at leiningen.core.main$resolve_and_apply.invoke(main.clj:319)
    at leiningen.core.main$_main$fn__6160.invoke(main.clj:392)
    at leiningen.core.main$_main.doInvoke(main.clj:385)
    at clojure.lang.RestFn.invoke(RestFn.java:421)
    at clojure.lang.Var.invoke(Var.java:383)
    at clojure.lang.AFn.applyToHelper(AFn.java:156)
    at clojure.lang.Var.applyTo(Var.java:700)
    at clojure.core$apply.invoke(core.clj:624)
    at clojure.main$main_opt.invoke(main.clj:315)
    at clojure.main$main.doInvoke(main.clj:420)
    at clojure.lang.RestFn.invoke(RestFn.java:457)
    at clojure.lang.Var.invoke(Var.java:394)
    at clojure.lang.AFn.applyToHelper(AFn.java:165)
    at clojure.lang.Var.applyTo(Var.java:700)
    at clojure.main.main(main.java:37)

From what I see, it's recursively trying to call this line: https://github.com/weavejester/cljfmt/blob/master/lein-cljfmt/src/leiningen/cljfmt.clj#L54 and for some reason it's just getting too deep and erroring out.

Note: I tried running lein cljfmt check "." on the project and this works fine. i.e. specifying a directory/file seems to not cause the issue.

Let me know if you need more information.

Indentation of midje forms?

I think it's accepted to format midje forms like so:

(facts "about indenting midje facts"
  (fact "see how i'm indented like a let?"))

cljfmt seems to want to indent it like this

(facts "this is how cljfmt does it"
       (fact "see how i'm indented like a function?"))

Where's the discrepancy lie here?

formatting custom macro uses is off

Thanks for cljfmt - coming from other languages with such tools, this feels essential

When I define a new macro:

(defmacro when-valid
  ...)

And then use it, it makes sense for me to keep some of the arguments on the same line with the macro invocation:

(when-valid var set-of-rules
  (do 1...)
  (do 2...))

However, cljfmt will reformat this as follows:

(when-valid var set-of-rules
            (do 1...)
            (do 2...))

Because it wants to line up all the "call" arguments together, similarly to what's done for function calls. But for many macros it's inappropriate, since they have two logically separate sets of arguments

cljfmt support lein version?

my lein version is 2.2.0.

so next exception occured.

java.lang.RuntimeException: No such var: main/warn, compiling:(leiningen/cljfmt.clj:61:14)

I has resolved by version 2.5.0.

thank you.

Clojurescript support

Hi great tool.

With the very fast startup time of node, a clojurescript (i.e. cljc/reader conditional) port would allow some interesting scripting possibilities with cljfmt. Personally, I'd love to use cljfmt for my neovim plugin.

I wouldn't mind working on a PR to attempt to add cljs support if you're interested in supporting it.

Cheers.

<U+2028> causes exception

Somehow <U+2028> had got into my code (using mac notes I think) this caused cljfmt to throw
Exception in thread "main" java.lang.AssertionError: Assert failed: (re-matches #"(\s|,)+" s) and it took me ages to work out why. I don't think it should fail like this. Plus it would be nice if it told you which file failed.

does not work from ~/.lein/profiles.clj

when using ~/.lein/profiles.clj:

$ lein cljfmt fix foo.edn

clojure.lang.Compiler$CompilerException: java.io.FileNotFoundException: Could not locate rewrite_clj/node__init.class or rewrite_clj/node.clj on classpath: , compiling:(cljfmt/core.clj:1:1)

workaround:
add to {:user {:plugins
[rewrite-clj "0.4.12"]

formatting ns forms

For refactor-nrepl I made the terrible mistake of trying to write my own pretty-printing code to output the newly-cleaned ns form. This started out as just a few lines of code which worked in 95% of cases, but has now grown to a a huge mess which badly needs to be rewritten, or preferably thrown out altogether.

Will it ever be in the scope of cljfmt to format an ns form nicely?

Update rewrite-clj dep

The latest version drops two problematic deps (fast-zip and potemkin) which makes it easier to embed rewrite-clj and cljfmt into dev tools (like CIDER), without introducing dep conflicts. See clj-commons/rewrite-clj#26 for details.

Threaded cond-> indents strangely

cond-> and cond->> fit neatly into bigger -> forms, but the default indenting rules don't seem to work for that usage when conditions and threaded forms are each on their own line.

So cljfmt likes this:

(-> v
    (cond->
     a b
     c d))

But wants to change this:

(-> v
    (cond->
      a
      b
      c
      d))

like so:

 (-> v
     (cond->
-      a
+     a
       b
       c
       d))

It wants the first arg indented 1 space, the rest indented 2.

(Incidentally my out of date version of cider doesn't like either of those indentations and has its own bad ideas about always treating the first arg specially.)

Regression in 0.1.8

The following code:

( let [x 3
    y 4]
  (+ (* x x
  )(* y y)
  ))

is now indented as:

(let [x 3
      y 4]
  (+ (* x x
        )(* y y)
     ))

I'm using reformat-string without custom config.

Used to indented properly in 0.1.7.

java.io.FileNotFoundException: Could not locate rewrite_clj/node__init.class or rewrite_clj/node.clj on classpath

I never managed to run cljfmt :(

Every time I run it I get the following exception (since 0.1.0):

✓ ~ ➤ lein help cljfmt
Retrieving rewrite-clj/rewrite-clj/0.3.8/rewrite-clj-0.3.8.pom from clojars
Retrieving rewrite-clj/rewrite-clj/0.4.8/rewrite-clj-0.4.8.pom from clojars
Retrieving rewrite-clj/rewrite-clj/0.3.8/rewrite-clj-0.3.8.jar from clojars
clojure.lang.Compiler$CompilerException: java.io.FileNotFoundException: Could not locate rewrite_clj/node__init.class or rewrite_clj/node.clj on classpath: , compiling:(cljfmt/core.clj:1:1)
 at clojure.lang.Compiler.load (Compiler.java:7142)
    clojure.lang.RT.loadResourceScript (RT.java:370)
    clojure.lang.RT.loadResourceScript (RT.java:361)
    clojure.lang.RT.load (RT.java:440)
    clojure.lang.RT.load (RT.java:411)
    clojure.core$load$fn__5066.invoke (core.clj:5641)
    clojure.core$load.doInvoke (core.clj:5640)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invoke (core.clj:5446)
    clojure.core$load_lib$fn__5015.invoke (core.clj:5486)
    clojure.core$load_lib.doInvoke (core.clj:5485)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invoke (core.clj:626)
    clojure.core$load_libs.doInvoke (core.clj:5524)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invoke (core.clj:626)
    clojure.core$require.doInvoke (core.clj:5607)
    clojure.lang.RestFn.invoke (RestFn.java:482)
    leiningen.cljfmt$eval2784$loading__4958__auto____2785.invoke (cljfmt.clj:1)
    leiningen.cljfmt$eval2784.invoke (cljfmt.clj:1)
    clojure.lang.Compiler.eval (Compiler.java:6703)
    clojure.lang.Compiler.eval (Compiler.java:6692)
    clojure.lang.Compiler.load (Compiler.java:7130)
    clojure.lang.RT.loadResourceScript (RT.java:370)
    clojure.lang.RT.loadResourceScript (RT.java:361)
    clojure.lang.RT.load (RT.java:440)
    clojure.lang.RT.load (RT.java:411)
    clojure.core$load$fn__5066.invoke (core.clj:5641)
    clojure.core$load.doInvoke (core.clj:5640)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invoke (core.clj:5446)
    clojure.core$load_lib$fn__5015.invoke (core.clj:5486)
    clojure.core$load_lib.doInvoke (core.clj:5485)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invoke (core.clj:626)
    clojure.core$load_libs.doInvoke (core.clj:5524)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invoke (core.clj:626)
    clojure.core$require.doInvoke (core.clj:5607)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    leiningen.help$resolve_task.invoke (help.clj:58)
    leiningen.help$help_for.invoke (help.clj:97)
    leiningen.help$help_for.invoke (help.clj:110)
    leiningen.help$help.invoke (help.clj:148)
    clojure.lang.Var.invoke (Var.java:383)
    clojure.lang.AFn.applyToHelper (AFn.java:156)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.core.main$partial_task$fn__6094.doInvoke (main.clj:263)
    clojure.lang.RestFn.applyTo (RestFn.java:139)
    clojure.lang.AFunction$1.doInvoke (AFunction.java:29)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.core.main$apply_task.invoke (main.clj:313)
    leiningen.core.main$resolve_and_apply.invoke (main.clj:319)
    leiningen.core.main$_main$fn__6160.invoke (main.clj:392)
    leiningen.core.main$_main.doInvoke (main.clj:385)
    clojure.lang.RestFn.invoke (RestFn.java:421)
    clojure.lang.Var.invoke (Var.java:383)
    clojure.lang.AFn.applyToHelper (AFn.java:156)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invoke (core.clj:624)
    clojure.main$main_opt.invoke (main.clj:315)
    clojure.main$main.doInvoke (main.clj:420)
    clojure.lang.RestFn.invoke (RestFn.java:457)
    clojure.lang.Var.invoke (Var.java:394)
    clojure.lang.AFn.applyToHelper (AFn.java:165)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.main.main (main.java:37)
Caused by: java.io.FileNotFoundException: Could not locate rewrite_clj/node__init.class or rewrite_clj/node.clj on classpath:
 at clojure.lang.RT.load (RT.java:443)
    clojure.lang.RT.load (RT.java:411)
    clojure.core$load$fn__5066.invoke (core.clj:5641)
    clojure.core$load.doInvoke (core.clj:5640)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invoke (core.clj:5446)
    clojure.core$load_lib$fn__5015.invoke (core.clj:5486)
    clojure.core$load_lib.doInvoke (core.clj:5485)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invoke (core.clj:626)
    clojure.core$load_libs.doInvoke (core.clj:5524)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invoke (core.clj:626)
    clojure.core$require.doInvoke (core.clj:5607)
    clojure.lang.RestFn.invoke (RestFn.java:512)
    cljfmt.core$eval2790$loading__4958__auto____2791.invoke (core.clj:1)
    cljfmt.core$eval2790.invoke (core.clj:1)
    clojure.lang.Compiler.eval (Compiler.java:6703)
    clojure.lang.Compiler.eval (Compiler.java:6692)
    clojure.lang.Compiler.load (Compiler.java:7130)
    clojure.lang.RT.loadResourceScript (RT.java:370)
    clojure.lang.RT.loadResourceScript (RT.java:361)
    clojure.lang.RT.load (RT.java:440)
    clojure.lang.RT.load (RT.java:411)
    clojure.core$load$fn__5066.invoke (core.clj:5641)
    clojure.core$load.doInvoke (core.clj:5640)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invoke (core.clj:5446)
    clojure.core$load_lib$fn__5015.invoke (core.clj:5486)
    clojure.core$load_lib.doInvoke (core.clj:5485)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invoke (core.clj:626)
    clojure.core$load_libs.doInvoke (core.clj:5524)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invoke (core.clj:626)
    clojure.core$require.doInvoke (core.clj:5607)
    clojure.lang.RestFn.invoke (RestFn.java:482)
    leiningen.cljfmt$eval2784$loading__4958__auto____2785.invoke (cljfmt.clj:1)
    leiningen.cljfmt$eval2784.invoke (cljfmt.clj:1)
    clojure.lang.Compiler.eval (Compiler.java:6703)
    clojure.lang.Compiler.eval (Compiler.java:6692)
    clojure.lang.Compiler.load (Compiler.java:7130)
    clojure.lang.RT.loadResourceScript (RT.java:370)
    clojure.lang.RT.loadResourceScript (RT.java:361)
    clojure.lang.RT.load (RT.java:440)
    clojure.lang.RT.load (RT.java:411)
    clojure.core$load$fn__5066.invoke (core.clj:5641)
    clojure.core$load.doInvoke (core.clj:5640)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$load_one.invoke (core.clj:5446)
    clojure.core$load_lib$fn__5015.invoke (core.clj:5486)
    clojure.core$load_lib.doInvoke (core.clj:5485)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invoke (core.clj:626)
    clojure.core$load_libs.doInvoke (core.clj:5524)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invoke (core.clj:626)
    clojure.core$require.doInvoke (core.clj:5607)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    leiningen.help$resolve_task.invoke (help.clj:58)
    leiningen.help$help_for.invoke (help.clj:97)
    leiningen.help$help_for.invoke (help.clj:110)
    leiningen.help$help.invoke (help.clj:148)
    clojure.lang.Var.invoke (Var.java:383)
    clojure.lang.AFn.applyToHelper (AFn.java:156)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.core.main$partial_task$fn__6094.doInvoke (main.clj:263)
    clojure.lang.RestFn.applyTo (RestFn.java:139)
    clojure.lang.AFunction$1.doInvoke (AFunction.java:29)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.core.main$apply_task.invoke (main.clj:313)
    leiningen.core.main$resolve_and_apply.invoke (main.clj:319)
    leiningen.core.main$_main$fn__6160.invoke (main.clj:392)
    leiningen.core.main$_main.doInvoke (main.clj:385)
    clojure.lang.RestFn.invoke (RestFn.java:421)
    clojure.lang.Var.invoke (Var.java:383)
    clojure.lang.AFn.applyToHelper (AFn.java:156)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invoke (core.clj:624)
    clojure.main$main_opt.invoke (main.clj:315)
    clojure.main$main.doInvoke (main.clj:420)
    clojure.lang.RestFn.invoke (RestFn.java:457)
    clojure.lang.Var.invoke (Var.java:394)
    clojure.lang.AFn.applyToHelper (AFn.java:165)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.main.main (main.java:37)

I use leiningen 2.5.1 (it happened with 2.5.0 as well). My profiles.clj is as follows:

{:user {:plugins [#_[lein-vanity "0.2.0"]
                  [cider/cider-nrepl "0.9.0-SNAPSHOT"]
                  [lein-ancient "0.5.5"]
                  #_[lein-marginalia "0.7.1"]
                  #_[lein-simpleton "1.3.0"]
                  [lein-try "0.4.3"]
                  #_[lein-exec "0.3.4"]
                  #_[lein-ring "0.8.11"]
                  #_[lein-script "0.0.4"]
                  [lein-cljfmt "0.1.3"]]

        :dependencies [[slamhound "1.5.5"]]}}

Deleting the rewrite-clj directory from .m2/repository didn't help.

Performance concerns

The clojure core project has 33k LoC in Clojure, of which 25k occurs outside of clojure/core.clj. As hinted in #56, formatting all this takes maybe 6 minutes on my fairly beefy machine, a disproportionate amount of which is spent on clojure/core.clj.

In my testing, running everything but clojure/core.clj (25k lines total) took a mere 1:05s.
Running clojure/core.clj (7.5k lines) alone took 5:51s.

Looking at some yourkit output, it seems like cljfmt is accidentally quadratic on prior-string which alone seems to account for a whole lot of wall time. Attached find a plaintext hotspots list and a plaintext list of methods by CPU time. I don't quite understand cljfmt yet, but it seems like prior-string is being repeatedly re-evaluated on forms which have already been fully reindented.

Method-list-by-own-CPU-time.txt
CPU-hot-spots.txt

Exception in thread "main" java.lang.StackOverflowError

I'm new to Clojure. As far as I can tell this is the minimum project.clj:

(defproject euler "0.2.0")

When I run lein cljfmt fix I get a StackOverflowError. If I specify the files to fix it works.

I installed cljfmt by adding it to my ~/.lein/profiles.clj

{:user {:plugins [[lein-exec "0.3.5"] [lein-cljfmt "0.1.10"]]}}

Exception with comment at the top of ns

Here is the file I launch cljfmt on:

;; Break cljfmt 0.1.6
(ns break.cljfmt
  (:require [clojure.tools.logging :as log]))

And what I get:

java.lang.UnsupportedOperationException: null
 at rewrite_clj.node.comment.CommentNode.sexpr (comment.clj:6)
    rewrite_clj.node.protocols$eval5940$fn__5984$G__5946__5986.invoke (protocols.clj:9)
    rewrite_clj.node.protocols$eval5940$fn__5984$G__5945__5989.invoke (protocols.clj:9)
    clojure.core$juxt$fn__4211.invoke (core.clj:2440)
    rewrite_clj.node$value.invoke (node.clj:114)
    rewrite_clj.zip.base$value.invoke (base.clj:56)
    cljfmt.core$form_symbol.invoke (core.clj:121)
    cljfmt.core$inner_indent.invoke (core.clj:125)
    cljfmt.core$eval7950$fn__7952$fn__7954.invoke (core.clj:160)
    clojure.core$some_fn$sp2__6490.invoke (core.clj:6800)
    clojure.core$some_fn$spn__6527$fn__6528.invoke (core.clj:6817)
    clojure.core$some.invoke (core.clj:2515)
    clojure.core$some_fn$spn__6527.invoke (core.clj:6817)
    cljfmt.core$custom_indent.invoke (core.clj:177)
    cljfmt.core$indent_amount.invoke (core.clj:182)
    cljfmt.core$indent_line.invoke (core.clj:188)
    cljfmt.core$indent$fn__7981.invoke (core.clj:195)
    cljfmt.core$edit_all.invoke (core.clj:13)
    clojure.lang.AFn.applyToHelper (AFn.java:160)
    clojure.lang.AFn.applyTo (AFn.java:144)
    clojure.core$apply.invoke (core.clj:626)
    cljfmt.core$transform.doInvoke (core.clj:17)
    clojure.lang.RestFn.invoke (RestFn.java:464)
    cljfmt.core$indent.invoke (core.clj:195)
    cljfmt.core$reindent.invoke (core.clj:198)
    cljfmt.core$reformat_form.doInvoke (core.clj:208)
    clojure.lang.RestFn.invoke (RestFn.java:423)
    cljfmt.core$reformat_string.doInvoke (core.clj:211)
    clojure.lang.RestFn.invoke (RestFn.java:423)
    leiningen.cljfmt$reformat_string.invoke (cljfmt.clj:23)
    leiningen.cljfmt$valid_format_QMARK_.invoke (cljfmt.clj:27)
    clojure.lang.AFn.applyToHelper (AFn.java:156)
    clojure.lang.AFn.applyTo (AFn.java:144)
    clojure.core$apply.invoke (core.clj:626)
    clojure.core$partial$fn__4228.doInvoke (core.clj:2468)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$complement$fn__4082.invoke (core.clj:1370)
    clojure.core$filter$fn__4264.invoke (core.clj:2601)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:484)
    clojure.core$seq.invoke (core.clj:133)
    clojure.core$empty_QMARK_.invoke (core.clj:5706)
    leiningen.cljfmt$check.doInvoke (cljfmt.clj:58)
    clojure.lang.RestFn.invoke (RestFn.java:425)
    clojure.lang.AFn.applyToHelper (AFn.java:156)
    clojure.lang.RestFn.applyTo (RestFn.java:132)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.cljfmt$cljfmt.doInvoke (cljfmt.clj:79)
    clojure.lang.RestFn.invoke (RestFn.java:442)
    clojure.lang.Var.invoke (Var.java:388)
    clojure.lang.AFn.applyToHelper (AFn.java:160)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.core.main$partial_task$fn__6094.doInvoke (main.clj:263)
    clojure.lang.RestFn.applyTo (RestFn.java:139)
    clojure.lang.AFunction$1.doInvoke (AFunction.java:29)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.core.main$apply_task.invoke (main.clj:313)
    leiningen.core.main$resolve_and_apply.invoke (main.clj:319)
    leiningen.core.main$_main$fn__6160.invoke (main.clj:392)
    leiningen.core.main$_main.doInvoke (main.clj:385)
    clojure.lang.RestFn.invoke (RestFn.java:436)
    clojure.lang.Var.invoke (Var.java:388)
    clojure.lang.AFn.applyToHelper (AFn.java:160)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invoke (core.clj:624)
    clojure.main$main_opt.invoke (main.clj:315)
    clojure.main$main.doInvoke (main.clj:420)
    clojure.lang.RestFn.invoke (RestFn.java:482)
    clojure.lang.Var.invoke (Var.java:401)
    clojure.lang.AFn.applyToHelper (AFn.java:171)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.main.main (main.java:37)

Problems with apostrophe at end of symbols

Greetings & thanks for the library. I've encountered 2 problems with handling of symbols ending with apostrophes. The first is that lein cljfmt check <file> fails with the exception java.lang.Exception: expects 1 value. when run on a file containing a let with a bound symbol ending with an apostrophe.

If I put the following in a file & run lein cljfmt check on it, I receive the stack trace mentioned above:

(ns apostrophe.test1)

(defn t2 []
  (let [a 1
        a' (+ a 2)]
    (prn a')))

The second problem is that if the apostrophe doesn't cause an error, cljfmt suggests an incorrect rewrite, as with the following example with clojure.core/+':

(ns apostrophe.test2)

(defn t [x] (+' x x))

The rewrite suggested is from (+' x x) to (+ 'x x).

fast_zip.core.ZipperLocation cannot be cast to clojure.lang.IFn

Just tried to install cljfmt, couldn't get it to work. No clue what's going on here, so all I have is the traceback:

~/P/icecap: lein cljfmt check                                                                                                                                                                       23:20:13

java.lang.ClassCastException: fast_zip.core.ZipperLocation cannot be cast to clojure.lang.IFn
 at clojure.zip$next.invoke (zip.clj:236)
    rewrite_clj.zip.find$find_next.invoke (find.clj:48)
    cljfmt.core$edit_all.invoke (core.clj:12)
    clojure.lang.AFn.applyToHelper (AFn.java:160)
    clojure.lang.AFn.applyTo (AFn.java:144)
    clojure.core$apply.invoke (core.clj:626)
    cljfmt.core$transform.doInvoke (core.clj:17)
    clojure.lang.RestFn.invoke (RestFn.java:464)
    cljfmt.core$remove_surrounding_whitespace.invoke (core.clj:31)
    cljfmt.core$reformat_form.doInvoke (core.clj:208)
    clojure.lang.RestFn.invoke (RestFn.java:423)
    cljfmt.core$reformat_string.doInvoke (core.clj:216)
    clojure.lang.RestFn.invoke (RestFn.java:423)
    leiningen.cljfmt$reformat_string.invoke (cljfmt.clj:23)
    leiningen.cljfmt$valid_format_QMARK_.invoke (cljfmt.clj:27)
    clojure.lang.AFn.applyToHelper (AFn.java:156)
    clojure.lang.AFn.applyTo (AFn.java:144)
    clojure.core$apply.invoke (core.clj:626)
    clojure.core$partial$fn__4228.doInvoke (core.clj:2468)
    clojure.lang.RestFn.invoke (RestFn.java:408)
    clojure.core$complement$fn__4082.invoke (core.clj:1370)
    clojure.core$filter$fn__4264.invoke (core.clj:2605)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:484)
    clojure.core$seq.invoke (core.clj:133)
    clojure.core$empty_QMARK_.invoke (core.clj:5706)
    leiningen.cljfmt$check.doInvoke (cljfmt.clj:58)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.cljfmt$check.invoke (cljfmt.clj:54)
    clojure.lang.AFn.applyToHelper (AFn.java:154)
    clojure.lang.RestFn.applyTo (RestFn.java:132)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.cljfmt$cljfmt.doInvoke (cljfmt.clj:79)
    clojure.lang.RestFn.invoke (RestFn.java:425)
    clojure.lang.Var.invoke (Var.java:383)
    clojure.lang.AFn.applyToHelper (AFn.java:156)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.core.main$partial_task$fn__6094.doInvoke (main.clj:263)
    clojure.lang.RestFn.applyTo (RestFn.java:139)
    clojure.lang.AFunction$1.doInvoke (AFunction.java:29)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.core.main$apply_task.invoke (main.clj:313)
    leiningen.core.main$resolve_and_apply.invoke (main.clj:319)
    leiningen.core.main$_main$fn__6160.invoke (main.clj:392)
    leiningen.core.main$_main.doInvoke (main.clj:385)
    clojure.lang.RestFn.invoke (RestFn.java:421)
    clojure.lang.Var.invoke (Var.java:383)
    clojure.lang.AFn.applyToHelper (AFn.java:156)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invoke (core.clj:624)
    clojure.main$main_opt.invoke (main.clj:315)
    clojure.main$main.doInvoke (main.clj:420)
    clojure.lang.RestFn.invoke (RestFn.java:457)
    clojure.lang.Var.invoke (Var.java:394)
    clojure.lang.AFn.applyToHelper (AFn.java:165)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.main.main (main.java:37)

fix doesn't work either:

~/P/icecap: lein cljfmt fix                                                                                                                                                                         23:21:08
java.lang.ClassCastException: fast_zip.core.ZipperLocation cannot be cast to clojure.lang.IFn
 at clojure.zip$next.invoke (zip.clj:236)
    rewrite_clj.zip.find$find_next.invoke (find.clj:48)
    cljfmt.core$edit_all.invoke (core.clj:12)
    clojure.lang.AFn.applyToHelper (AFn.java:160)
    clojure.lang.AFn.applyTo (AFn.java:144)
    clojure.core$apply.invoke (core.clj:626)
    cljfmt.core$transform.doInvoke (core.clj:17)
    clojure.lang.RestFn.invoke (RestFn.java:464)
    cljfmt.core$remove_surrounding_whitespace.invoke (core.clj:31)
    cljfmt.core$reformat_form.doInvoke (core.clj:208)
    clojure.lang.RestFn.invoke (RestFn.java:423)
    cljfmt.core$reformat_string.doInvoke (core.clj:216)
    clojure.lang.RestFn.invoke (RestFn.java:423)
    leiningen.cljfmt$reformat_string.invoke (cljfmt.clj:23)
    leiningen.cljfmt$valid_format_QMARK_.invoke (cljfmt.clj:27)
    leiningen.cljfmt$fix.doInvoke (cljfmt.clj:71)
    clojure.lang.RestFn.applyTo (RestFn.java:142)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.cljfmt$fix.invoke (cljfmt.clj:68)
    clojure.lang.AFn.applyToHelper (AFn.java:154)
    clojure.lang.RestFn.applyTo (RestFn.java:132)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.cljfmt$cljfmt.doInvoke (cljfmt.clj:80)
    clojure.lang.RestFn.invoke (RestFn.java:425)
    clojure.lang.Var.invoke (Var.java:383)
    clojure.lang.AFn.applyToHelper (AFn.java:156)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.core.main$partial_task$fn__6094.doInvoke (main.clj:263)
    clojure.lang.RestFn.applyTo (RestFn.java:139)
    clojure.lang.AFunction$1.doInvoke (AFunction.java:29)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    clojure.core$apply.invoke (core.clj:626)
    leiningen.core.main$apply_task.invoke (main.clj:313)
    leiningen.core.main$resolve_and_apply.invoke (main.clj:319)
    leiningen.core.main$_main$fn__6160.invoke (main.clj:392)
    leiningen.core.main$_main.doInvoke (main.clj:385)
    clojure.lang.RestFn.invoke (RestFn.java:421)
    clojure.lang.Var.invoke (Var.java:383)
    clojure.lang.AFn.applyToHelper (AFn.java:156)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.core$apply.invoke (core.clj:624)
    clojure.main$main_opt.invoke (main.clj:315)
    clojure.main$main.doInvoke (main.clj:420)
    clojure.lang.RestFn.invoke (RestFn.java:457)
    clojure.lang.Var.invoke (Var.java:394)
    clojure.lang.AFn.applyToHelper (AFn.java:165)
    clojure.lang.Var.applyTo (Var.java:700)
    clojure.main.main (main.java:37)

this is with a current lein:

~/P/icecap: lein version                                                                                                                                                                            23:22:40
Leiningen 2.5.1 on Java 1.8.0_25 Java HotSpot(TM) 64-Bit Server VM

Tries to delete space before ;; before lines preceding closing braces

Cljfmt tries to delete the space before a ;; on the line before a closing bracket, e.g.:

[gregor@dev-1386282934] /mnt/gregor/code/cljfmt-badness {master}% lein cljfmt check
src/cljfmt_badness/core.clj has incorrect formatting:
--- a/src/cljfmt_badness/core.clj
+++ b/src/cljfmt_badness/core.clj
@@ -4,6 +4,6 @@
   "I don't do a whole lot."
   [x]
   (let [x [1 2 ;; test1
-           2 3 ;; test2
-           ]])
+           2 3;; test2
+]])
   (println x "Hello, World!"))

1 file(s) formatted incorrectly

I'm not sure what the best way to indent the ]]) line is, but I don't think there's any reason to delete the space.

Repro: git clone https://github.com/GregorStocks/cljfmt-badness and run lein cljfmt check

Fails to compile on leiningen 2.3.4

It looks like the warn function used at

(main/warn (project-path project f) "has incorrect formatting:")
wasn't introduced until recently - leiningen 2.3.4, which was the most recent version under a year ago, doesn't have it, which makes the instructions in the README fail with a pretty opaque error message. I think switching to "info" would be good enough, that function seems to be much older.

Support for associative syntax allignment

Are there plans to support associative syntax alignment?

(let [n    :charnock
      name :ohai]
  …)

{:n    :charnock
 :name :ohai}

(defproject example
  :n    :charnock
  :name :ohai)

(ns example
  (:require [[req         "1000.0.1" :exclusions [blah]]
             [another-req "0.0.1"]]))

ignoring defaults

Hey, this is a really great tool. I use a somewhat non-standard indentation scheme which is basically

:cljfmt {:indents {#".*" [[:inner 0]]}}

But unfortunately, in order to override the defaults I need to explicitly specify symbols for everything. If there were some way to disable the defaults, that would be very helpful.

Support for reader conditionals

Currently, cljfmt formats reader conditionals in the same way code is otherwise formatted. Unfortunately, this leads to code that looks like the following:

#? (:clj (throw (IllegalArgumentException.
                  "reason"))
          :cljs (throw "reason")))

This is in contrast to what we would expect, based on the examples for good code given in http://clojure.org/guides/reader_conditionals, which would suggest code formatting like the following:

#?(:clj (throw (IllegalArgumentException.
                  "reason"))
   :cljs (throw "reason")))

Note the two issues here:

  • a space after the reader conditional macro #? that shouldn't be there, and
  • incorrect indentation of keywords within the macro

Reformats files twice

valid-format? calls reformat-string and checks = to see if anything changed, but when computing patches or reformatting files reformat-string is called again either to generate a diff or just for output. This means that large files get slurped and reformatted not once but twice for no particular reason.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.