greglook / cljstyle

A tool for formatting Clojure code
Eclipse Public License 1.0
293 stars 39 forks source link

NPE thrown when styling a nested namespaced map #34

Closed brendonjwong closed 4 years ago

brendonjwong commented 4 years ago

If you have a namespaced map using keyword aliasing inside of a namespaced map that also uses keyword aliasing, cljstyle will throw a NullPointerException.

As a minimal example, this will throw a NullPointerException when you try to run cljstyle fix on the file:

(ns test
  (:require
    [foo :as foo]))

(def problem
   #::foo{:config
          #::foo{:id 1}})

Stack trace:

java.lang.NullPointerException: null
 at java.util.concurrent.ConcurrentHashMap.get (ConcurrentHashMap.java:936)
    clojure.lang.Namespace.find (Namespace.java:188)
    clojure.core$find_ns.invokeStatic (core.clj:4096)
    clojure.core$the_ns.invokeStatic (core.clj:4126)
    clojure.core$ns_name.invokeStatic (core.clj:4130)
    clojure.core$ns_name.invoke (core.clj:4130)
    rewrite_clj.node.seq.NamespacedMapNode.sexpr (seq.clj:57)
    rewrite_clj.node.protocols$fn__271$fn__315$G__277__317.invoke (protocols.clj:9)
    rewrite_clj.node.protocols$fn__271$fn__315$G__276__320.invoke (protocols.clj:9)
    clojure.core$map$fn__5587.invoke (core.clj:2747)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.Cons.next (Cons.java:39)
    clojure.lang.RT.boundedLength (RT.java:1785)
    clojure.lang.RestFn.applyTo (RestFn.java:130)
    clojure.core$apply.invokeStatic (core.clj:657)
    clojure.core$apply.invoke (core.clj:652)
    rewrite_clj.node.seq$map_node$fn__1794.invoke (seq.clj:110)
    rewrite_clj.node.seq.SeqNode.sexpr (seq.clj:16)
    rewrite_clj.node.protocols$fn__271$fn__315$G__277__317.invoke (protocols.clj:9)
    rewrite_clj.node.protocols$fn__271$fn__315$G__276__320.invoke (protocols.clj:9)
    clojure.core$map$fn__5587.invoke (core.clj:2745)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:528)
    clojure.lang.RT.countFrom (RT.java:643)
    clojure.lang.RT.count (RT.java:636)
    rewrite_clj.node.seq$assert_namespaced_map_children.invokeStatic (seq.clj:40)
    rewrite_clj.node.seq$assert_namespaced_map_children.invoke (seq.clj:37)
    rewrite_clj.node.seq$namespaced_map_node.invokeStatic (seq.clj:115)
    rewrite_clj.node.seq$namespaced_map_node.invoke (seq.clj:112)
    rewrite_clj.parser.core$fn__2076.invokeStatic (core.clj:123)
    rewrite_clj.parser.core/fn (core.clj:111)
    clojure.lang.MultiFn.invoke (MultiFn.java:229)
    rewrite_clj.reader$read_with_meta.invokeStatic (reader.clj:132)
    rewrite_clj.reader$read_with_meta.invoke (reader.clj:128)
    rewrite_clj.parser.core$parse_next.invokeStatic (core.clj:35)
    rewrite_clj.parser.core$parse_next.invoke (core.clj:33)
    rewrite_clj.parser.core$parse_delim$fn__2050.invoke (core.clj:43)
    rewrite_clj.reader$read_repeatedly$fn__1454.invoke (reader.clj:141)
    clojure.core$repeatedly$fn__6176.invoke (core.clj:5089)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:528)
    clojure.core$seq__5124.invokeStatic (core.clj:137)
    clojure.core$take_while$fn__5638.invoke (core.clj:2896)
    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:706)
    clojure.core$next__5108.invokeStatic (core.clj:64)
    clojure.core$dorun.invokeStatic (core.clj:3134)
    clojure.core$doall.invokeStatic (core.clj:3140)
    clojure.core$doall.invoke (core.clj:3140)
    rewrite_clj.reader$read_repeatedly.invokeStatic (reader.clj:143)
    rewrite_clj.reader$read_repeatedly.invoke (reader.clj:137)
    rewrite_clj.parser.core$parse_delim.invokeStatic (core.clj:44)
    rewrite_clj.parser.core$parse_delim.invoke (core.clj:39)
    rewrite_clj.parser.core$fn__2090.invokeStatic (core.clj:172)
    rewrite_clj.parser.core/fn (core.clj:170)
    clojure.lang.MultiFn.invoke (MultiFn.java:229)
    rewrite_clj.reader$read_with_meta.invokeStatic (reader.clj:132)
    rewrite_clj.reader$read_with_meta.invoke (reader.clj:128)
    rewrite_clj.parser.core$parse_next.invokeStatic (core.clj:35)
    rewrite_clj.parser.core$parse_next.invoke (core.clj:33)
    rewrite_clj.parser$parse.invokeStatic (parser.clj:13)
    rewrite_clj.parser$parse.invoke (parser.clj:10)
    rewrite_clj.parser$parse_all$fn__2099.invoke (parser.clj:18)
    clojure.core$repeatedly$fn__6176.invoke (core.clj:5089)
    clojure.lang.LazySeq.sval (LazySeq.java:40)
    clojure.lang.LazySeq.seq (LazySeq.java:49)
    clojure.lang.RT.seq (RT.java:528)
    clojure.core$seq__5124.invokeStatic (core.clj:137)
    clojure.core$take_while$fn__5638.invoke (core.clj:2896)
    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:706)
    clojure.core$next__5108.invokeStatic (core.clj:64)
    clojure.core$dorun.invokeStatic (core.clj:3134)
    clojure.core$doall.invokeStatic (core.clj:3140)
    clojure.core$doall.invoke (core.clj:3140)
    rewrite_clj.parser$parse_all.invokeStatic (parser.clj:20)
    rewrite_clj.parser$parse_all.invoke (parser.clj:15)
    rewrite_clj.parser$parse_string_all.invokeStatic (parser.clj:35)
    rewrite_clj.parser$parse_string_all.invoke (parser.clj:32)
    cljstyle.format.core$reformat_string.invokeStatic (core.clj:57)
    cljstyle.format.core$reformat_string.invoke (core.clj:51)
    cljstyle.format.core$reformat_file.invokeStatic (core.clj:68)
    cljstyle.format.core$reformat_file.invoke (core.clj:62)
    cljstyle.task.core$pipe.invokeStatic (core.clj:324)
    cljstyle.task.core$pipe.invoke (core.clj:319)
    cljstyle.tool.main$_main$fn__3428.invoke (main.clj:72)
    cljstyle.tool.main$_main.invokeStatic (main.clj:66)
    cljstyle.tool.main$_main.doInvoke (main.clj:37)
    clojure.lang.RestFn.applyTo (RestFn.java:137)
    cljstyle.tool.main.main (:-1)

Using version 0.12.0.

greglook commented 4 years ago

Duplicate of #13