-
-
Notifications
You must be signed in to change notification settings - Fork 645
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add ClojureScript support to the debugger #1416
Comments
Hey, @Malabarba ! Thanks for the list of things to start off from. I'm new to Emacs and CIDER, but would like to give this a shot. |
Any thoughts on a setting for simply ignoring the fact you're in a CLJS file and just interpreting the forms as plain Clojure? I guess it'll work fine in a lot of cases and if it's documented + opt-in, shouldn't be too problematic? |
I think |
So it does! Thanks 👍 |
made the finance.clj a cljc because cljs files can't be debugged with cider's debugger. clojure-emacs/cider#1416 it will probably be used exclusively on the cljs side as we have no clj backend or anything now.
2nd time this week Cider has prompted me to visit this page. |
How does Cursive manage this? |
No idea. It's not open-source so we can't easily check. |
@NightMachinary @bbatsov Very simple - it doesn't :-). Cursive can only debug JVM clojure right now. |
So, the biggest problem with having a debugger based on instrumented code in JavaScript, is, that unlike the JVM, you can't block your thread to wait for input from the debugging frontend. This leaves two likely approaches: Debugging via the runtime's debugger interface (e.g. via debugger.html) and relying on source maps to recover the cider experience, or, doing a CPS transformation on the source. I honestly can't decide, what feels to be more work, but ultimately, CPS feels more in-line with the spirit in the existing debugger, of instrumenting the source. A remote-control debugger would totally be worth doing, though, and I'm sure that an RDP-based debugger, targetting Clojure and ClojureScript could be a great success as well. That said, let me try to sell you on an even crazier idea, than doing CPS on ClojureScript code: Doing CPS on JavaScript code. That would (theoretically) enable debugging callbacks coming from javascript frameworks. I decided to explore existing CPS solutions for JavaScript, and there are some, most of them seem to focus on providing some syntax for explicit passing, but jwacs stood out, not just because it takes its job of doing the heavy lifting for providing true continuations, seriously, but also because it's written in CommonLisp, so working with it reminded me of how Clojure with Emacs should feel ;-) Initial results on some snippets and even a 2.4M advanced minified JS seemed promising, after fixing some minor issues I so far found three features missing:
After implementing labelled statement blocks to get acquainted with the code base, I'm pretty confident, that I (and you too) can make it work for everything we need, including the above issues. If you're interested in helping with this, I'm currently in the process of getting acquainted with cider-debug-middleware's internals. In particular, I'd like to figure out, how to run some hand-crafted code in a clojurescript runtime, to contact cider-debug-middleware with a break-point. TLDR; |
@bendlas It's nice to see someone interested in fixing this! Let me know if you need any assistance from me! I don't know almost anything about ClojureScript, but I know a thing or two about CIDER. :-) |
@bbatsov theat's great, thanks for offering! |
This could be helpful in some way: https://github.com/philoskim/debux |
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contribution and understanding! |
These are my 2¢ from a recent Slack chat, @bbatsov suggested to post these for posteriors' sake.
|
I found a solution for this by way of wanting to repl into a sandboxed JS RT: No network connectivity means having to tunnel through CDP for resource loading, and that means implementing blocking calls back through CDP. https://github.com/webnf/cdp-repl is a repl-env with some structured support for getting a debugger connection from an extension + blueprint of how to do blocking calls with that. I believe it should be possible to port the cider debugger to this. |
Specifically, the next step on this would be to get cljs versions of the |
Any updates on this issue? |
https://github.com/jpmonettas/cider-storm probably is a nice tool you can use today! I'm going to close this issue because the chances someone will spontaneously pick it up and implement something seem very low. Obviously, the doors are always open to someone who brought in a specific design and plan. Else better not to promise anything by keeping the issue open. |
If cider-storm was made the default debugger for CIDER, then we'd have a working CLJ(S) debugger in CIDER by default. Would it make sense to delegate all of CIDER's debugging functionality to cider-storm? |
I'm quite attached to our debugger, so I don't plan to replace it any time soon. |
I'll try to mention Cider Storm in our docs. Will also be interesting to see how that project evolves. At 14 commits it probably has some rough edges, but FlowStorm's underlying work is very solid. |
Yeah, it's a good idea to mention it in the docs. I had never heard of it until yesterday. |
I believe I have found a solution!
Compiling debug builds with Stopify will give us all the debugging abstractions we need! They have even tested it successfully with ClojureScript! I'm going to try it out and post my results. EDIT:
|
The debugger simply fails if used in ClojureScript code, it would be nice for it to work.
Here's a list of things to achieve that. If anyone can help with any of these items, it will likely save me a lot of researching down the road. So please don't be shy.
cljs/expects-piggieback
tocljs/requires-piggieback
.#dbg
and#break
reader tags are active when the cljs code is read. This is done in Clojure via ourdata_readers.clj
file at the classpath root, is there a similar file for ClojureScript?tools.nrepl
uses ourinstrument-and-eval
function instead of the plaineval
(seedebug.clj
). I'm not sure how to do this in piggieback.instrument.clj
should work as is. It parses the code (which is still Clojure data even with cljs code), and it wraps parts of it in some code of our own.The last item is hardest. The code in question is just one macro and a few functions in
debug.clj
. These needs to be defined in the cljs environment, which probably means they'll have to be moved to acljc
file (or duplicated in acljs
file).The problem is that this code interacts with tools.nrepl, which (IIUC) is impossible to do from the cljs environment. So it'll likely involved a deep rethinking of how the debugger works.
Reimplementing the first version of the debugger in cljs might be the solution (it prompted the user directly instead of using the nrepl).
The text was updated successfully, but these errors were encountered: