tpope / vim-fireplace

fireplace.vim: Clojure REPL support
https://www.vim.org/scripts/script.php?script_id=4978
1.75k stars 139 forks source link

Evaluating an expression that throws an error in Clojure throws E730: using List as a String in Vim #291

Closed glittershark closed 7 years ago

glittershark commented 7 years ago

This is only happening in one project on this machine - all my other projects use a regular old lein repl and let fireplace connect to the nrepl, but the project in question is launching an nrepl server as part of its startup process, and installing the cider and piggieback middleware manually.

Not really sure how to dig deeper as the above error is literally all I'm getting

tpope commented 7 years ago

No stacktrace?

glittershark commented 7 years ago

None, unfortunately

glittershark commented 7 years ago

stepped through it with a debugger, error gets thrown on this line

glittershark commented 7 years ago
>echo stacktrace
[{'file': 'Class.java', 'method': 'cast', 'name': 'java.lang.Class/cast', 'flags': ['java'], 'line': 3369, 'type': 'java', 'class': 'java.lang.Class'},
 {'file': 'core.clj', 'method': 'invokeStatic', 'name': 'clojure.core$cast/invokeStatic', 'flags': ['clj'], 'line': 351, 'ns': 'clojure.core', 'type': 'clj', 'class': 'clojure.core$cast', 'fn': 'cast', 'var': 'clojure.core/cast'},
 {'file': 'core.clj', 'method': 'invokeStatic', 'name': 'clojure.core$_PLUS_/invokeStatic', 'flags': ['clj'], 'line': 976, 'ns': 'clojure.core', 'type': 'clj', 'class': 'clojure.core$_PLUS_', 'fn': '+', 'var': 'clojure.core/+'},
 {'file': 'core.clj', 'method': 'invoke', 'name': 'clojure.core$_PLUS_/invoke', 'flags': ['dup', 'clj'], 'line': 976, 'ns': 'clojure.core', 'type': 'clj', 'class': 'clojure.core$_PLUS_', 'fn': '+', 'var': 'clojure.core/+'},
 {'file': [], 'method': 'invokeStatic', 'name': 'user$eval59954/invokeStatic', 'flags': ['unknown'], 'line': 1, 'type': 'unknown', 'class': 'user$eval59954'},
 {'file': [], 'method': 'invoke', 'name': 'user$eval59954/invoke', 'flags': ['dup', 'unknown'], 'line': 1, 'type': 'unknown', 'class': 'user$eval59954'},
 {'file': 'Compiler.java', 'method': 'eval', 'name': 'clojure.lang.Compiler/eval', 'flags': ['tooling', 'java'], 'line': 6978, 'type': 'java', 'class': 'clojure.lang.Compiler'},
 {'file': 'Compiler.java', 'method': 'eval', 'name': 'clojure.lang.Compiler/eval', 'flags': ['dup', 'tooling', 'java'], 'line': 6941, 'type': 'java', 'class': 'clojure.lang.Compiler'},
 {'file': 'core.clj', 'method': 'invokeStatic', 'name': 'clojure.core$eval/invokeStatic', 'flags': ['clj'], 'line': 3187, 'ns': 'clojure.core', 'type': 'clj', 'class': 'clojure.core$eval', 'fn': 'eval', 'var': 'clojure.core/eval'},
 {'file': 'core.clj', 'method': 'invoke', 'name': 'clojure.core$eval/invoke', 'flags': ['clj'], 'line': 3183, 'ns': 'clojure.core', 'type': 'clj', 'class': 'clojure.core$eval', 'fn': 'eval', 'var': 'clojure.core/eval'},
 {'file': 'main.clj', 'method': 'invoke', 'name': 'clojure.main$repl$read_eval_print__9983$fn__9986/invoke', 'flags': ['clj'], 'line': 242, 'ns': 'clojure.main', 'type': 'clj', 'class': 'clojure.main$repl$read_eval_print__9983$fn__9986', 'fn': 'repl/read-eval-print/fn', 'var': 'clojure.main/repl'},
 {'file': 'main.clj', 'method': 'invoke', 'name': 'clojure.main$repl$read_eval_print__9983/invoke', 'flags': ['dup', 'clj'], 'line': 242, 'ns': 'clojure.main', 'type': 'clj', 'class': 'clojure.main$repl$read_eval_print__9983', 'fn': 'repl/read-eval-print', 'var': 'clojure.main/repl'},
 {'file': 'main.clj', 'method': 'invoke', 'name': 'clojure.main$repl$fn__9992/invoke', 'flags': ['clj'], 'line': 260, 'ns': 'clojure.main', 'type': 'clj', 'class': 'clojure.main$repl$fn__9992', 'fn': 'repl/fn', 'var': 'clojure.main/repl'},
 {'file': 'main.clj', 'method': 'invokeStatic', 'name': 'clojure.main$repl/invokeStatic', 'flags': ['dup', 'clj'], 'line': 260, 'ns': 'clojure.main', 'type': 'clj', 'class': 'clojure.main$repl', 'fn': 'repl', 'var': 'clojure.main/repl'},
 {'file': 'main.clj', 'method': 'doInvoke', 'name': 'clojure.main$repl/doInvoke', 'flags': ['clj'], 'line': 176, 'ns': 'clojure.main', 'type': 'clj', 'class': 'clojure.main$repl', 'fn': 'repl', 'var': 'clojure.main/repl'},
 {'file': 'RestFn.java', 'method': 'invoke', 'name': 'clojure.lang.RestFn/invoke', 'flags': ['java'], 'line': 1523, 'type': 'java', 'class': 'clojure.lang.RestFn'},
 {'file': 'interruptible_eval.clj', 'method': 'invoke', 'name': 'clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__8816/invoke', 'flags': ['tooling', 'clj'], 'line': 87, 'ns': 'clojure.tools.nrepl.middleware.interruptible-eval', 'type': 'clj', 'class': 'clojure.tools.nrepl.middleware.interruptible_eval$evaluate$fn__8816', 'fn': 'evaluate/fn', 'var': 'clojure.tools.nrepl.middleware.interruptible-eval/evaluate'},
 {'file': 'AFn.java', 'method': 'applyToHelper', 'name': 'clojure.lang.AFn/applyToHelper', 'flags': ['java'], 'line': 152, 'type': 'java', 'class': 'clojure.lang.AFn'},
 {'file': 'AFn.java', 'method': 'applyTo', 'name': 'clojure.lang.AFn/applyTo', 'flags': ['java'], 'line': 144, 'type': 'java', 'class': 'clojure.lang.AFn'},
 {'file': 'core.clj', 'method': 'invokeStatic', 'name': 'clojure.core$apply/invokeStatic', 'flags': ['clj'], 'line': 657, 'ns': 'clojure.core', 'type': 'clj', 'class': 'clojure.core$apply', 'fn': 'apply', 'var': 'clojure.core/apply'},
 {'file': 'core.clj', 'method': 'invokeStatic', 'name': 'clojure.core$with_bindings_STAR_/invokeStatic', 'flags': ['clj'], 'line': 1963, 'ns': 'clojure.core', 'type': 'clj', 'class': 'clojure.core$with_bindings_STAR_', 'fn': 'with-bindings*', 'var': 'clojure.core/with-bindings*'},
 {'file': 'core.clj', 'method': 'doInvoke', 'name': 'clojure.core$with_bindings_STAR_/doInvoke', 'flags': ['dup', 'clj'], 'line': 1963, 'ns': 'clojure.core', 'type': 'clj', 'class': 'clojure.core$with_bindings_STAR_', 'fn': 'with-bindings*', 'var': 'clojure.core/with-bindings*'},
 {'file': 'RestFn.java', 'method': 'invoke', 'name': 'clojure.lang.RestFn/invoke', 'flags': ['java'], 'line': 425, 'type': 'java', 'class': 'clojure.lang.RestFn'},
 {'file': 'interruptible_eval.clj', 'method': 'invokeStatic', 'name': 'clojure.tools.nrepl.middleware.interruptible_eval$evaluate/invokeStatic', 'flags': ['tooling', 'clj'], 'line': 85, 'ns': 'clojure.tools.nrepl.middleware.interruptible-eval', 'type': 'clj', 'class': 'clojure.tools.nrepl.middleware.interruptible_eval$evaluate', 'fn': 'evaluate', 'var': 'clojure.tools.nrepl.middleware.interruptible-eval/evaluate'},
 {'file': 'interruptible_eval.clj', 'method': 'invoke', 'name': 'clojure.tools.nrepl.middleware.interruptible_eval$evaluate/invoke', 'flags': ['tooling', 'clj'], 'line': 55, 'ns': 'clojure.tools.nrepl.middleware.interruptible-eval', 'type': 'clj', 'class': 'clojure.tools.nrepl.middleware.interruptible_eval$evaluate', 'fn': 'evaluate', 'var': 'clojure.tools.nrepl.middleware.interruptible-eval/evaluate'},
 {'file': 'interruptible_eval.clj', 'method': 'invoke', 'name': 'clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__8861$fn__8864/invoke', 'flags': ['tooling', 'clj'], 'line': 222, 'ns': 'clojure.tools.nrepl.middleware.interruptible-eval', 'type': 'clj', 'class': 'clojure.tools.nrepl.middleware.interruptible_eval$interruptible_eval$fn__8861$fn__8864', 'fn': 'interruptible-eval/fn/fn', 'var': 'clojure.tools.nrepl.middleware.interruptible-eval/interruptible-eval'},
 {'file': 'interruptible_eval.clj', 'method': 'invoke', 'name': 'clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__8856/invoke', 'flags': ['tooling', 'clj'], 'line': 190, 'ns': 'clojure.tools.nrepl.middleware.interruptible-eval', 'type': 'clj', 'class': 'clojure.tools.nrepl.middleware.interruptible_eval$run_next$fn__8856', 'fn': 'run-next/fn', 'var': 'clojure.tools.nrepl.middleware.interruptible-eval/run-next'},
 {'file': 'AFn.java', 'method': 'run', 'name': 'clojure.lang.AFn/run', 'flags': ['java'], 'line': 22, 'type': 'java', 'class': 'clojure.lang.AFn'},
 {'file': 'ThreadPoolExecutor.java', 'method': 'runWorker', 'name': 'java.util.concurrent.ThreadPoolExecutor/runWorker', 'flags': ['java'], 'line': 1142, 'type': 'java', 'class': 'java.util.concurrent.ThreadPoolExecutor'},
 {'file': 'ThreadPoolExecutor.java', 'method': 'run', 'name': 'java.util.concurrent.ThreadPoolExecutor$Worker/run', 'flags': ['java'], 'line': 617, 'type': 'java', 'class': 'java.util.concurrent.ThreadPoolExecutor$Worker'},
 {'file': 'Thread.java', 'method': 'run', 'name': 'java.lang.Thread/run', 'flags': ['java'], 'line': 745, 'type': 'java', 'class': 'java.lang.Thread'}]
glittershark commented 7 years ago

292 fixes the symptoms for me. No clue how those empty lists got in there, though...

as a side note, figuring out that bug has brought me to an entirely new level of respect for you and how much vimscript you maintain. I don't understand how you stay sane.

tpope commented 7 years ago

We probably should be doing something with those empty files rather than just dropping them, because the resulting stack trace is incomplete without them. First step would be checking how they're displayed in the REPL.

tpope commented 7 years ago

New commit will show them as class.method without the parenthetical.

glittershark commented 7 years ago

nice! that's even better