Skip to content

Commit abfdc5b

Browse files
author
Sainadh Devireddy
committed
shadow-cljs Support
1 parent 8db8d18 commit abfdc5b

File tree

1 file changed

+52
-7
lines changed

1 file changed

+52
-7
lines changed

package.py

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ def format_time_taken(time_taken):
2222
else:
2323
return f"({'{:.2f}'.format(elapsed * 1000)} ms)"
2424

25+
class Profile:
26+
CLOJURE = 'clojure'
27+
SHADOW_CLJS = 'shadow-cljs'
28+
2529
class Eval:
2630
# class
2731
next_id: int = 10
@@ -170,6 +174,8 @@ class Connection:
170174
last_view: sublime.View
171175
session: str
172176
eval_in_session: bool
177+
profile: Profile
178+
cljs_build: str
173179

174180
def __init__(self):
175181
self.host = 'localhost'
@@ -180,6 +186,8 @@ def __init__(self):
180186
self.last_view = window.active_view() if (window := sublime.active_window()) else None
181187
self.session = None
182188
self.eval_in_session = None
189+
self.profile = None
190+
self.cljs_build = None
183191

184192
def set_status(self, status):
185193
self.status = status
@@ -365,15 +373,15 @@ def eval_msg(view, region, msg):
365373
eval.msg["id"] = eval.id
366374
eval.msg["nrepl.middleware.caught/caught"] = f"{ns}.middleware/print-root-trace"
367375
eval.msg["nrepl.middleware.print/print"] = f"{ns}.middleware/pprint"
368-
eval.msg["nrepl.middleware.print/quota"] = 1024
376+
eval.msg["nrepl.middleware.print/quota"] = 4096
369377
eval.msg["session"] = conn.session
370378
conn.add_eval(eval)
371379
conn.send(eval.msg)
372380
eval.update("pending", progress_thread.phase())
373381

374382
def eval(view, region, code=None):
375383
(line, column) = view.rowcol_utf16(region.begin())
376-
msg = {"op": "eval" if conn.eval_in_session else "clone-eval-close",
384+
msg = {"op": "eval" if (conn.profile == Profile.SHADOW_CLJS or conn.eval_in_session) else "clone-eval-close",
377385
"code": view.substr(region) if code is None else code,
378386
"ns": namespace(view, region.begin()) or 'user',
379387
"line": line,
@@ -649,6 +657,23 @@ def read(self, n):
649657

650658
def handle_connect(msg):
651659

660+
if conn.profile == Profile.SHADOW_CLJS:
661+
shadow_cljs_init = {
662+
":app": "(shadow.cljs.devtools.api/repl :app)",
663+
"node-repl": "(shadow.cljs.devtools.api/browser-repl)",
664+
"browser-repl": "(shadow.cljs.devtools.api/node-repl)"
665+
}
666+
if 1 == msg.get("id") and "new-session" in msg:
667+
conn.session = msg["new-session"]
668+
conn.send({"op": "eval",
669+
"session": conn.session,
670+
"code": shadow_cljs_init[conn.cljs_build],
671+
"id": 2})
672+
return True
673+
elif 2 == msg.get("id") and msg.get("status") == ["done"]:
674+
conn.set_status(f"🌕 {conn.host}:{conn.port}")
675+
return True
676+
652677
if 1 == msg.get("id") and "new-session" in msg:
653678
conn.session = msg["new-session"]
654679
conn.send({"op": "load-file",
@@ -705,9 +730,11 @@ def read_loop():
705730
pass
706731
conn.disconnect()
707732

708-
def connect(host, port):
733+
def connect(host, port, profile, cljs_build):
709734
conn.host = host
710735
conn.port = port
736+
conn.profile = profile
737+
conn.cljs_build = cljs_build
711738
try:
712739
conn.socket = socket.create_connection((host, port))
713740
conn.reader = threading.Thread(daemon=True, target=read_loop)
@@ -750,14 +777,32 @@ def validate(self, text):
750777
port = int(port)
751778
return 0 <= port and port <= 65536
752779

780+
class ClojureSublimedCljsBuildInputHandler(sublime_plugin.ListInputHandler):
781+
def list_items(self):
782+
return [':app', 'node-repl', 'browser-repl']
783+
784+
def next_input(self, args):
785+
return ClojureSublimedHostPortInputHandler()
786+
787+
class ClojureSublimedProfileInputHandler(sublime_plugin.ListInputHandler):
788+
def list_items(self):
789+
return [Profile.CLOJURE, Profile.SHADOW_CLJS]
790+
791+
def next_input(self, args):
792+
if args.get('clojure_sublimed_profile') == Profile.SHADOW_CLJS:
793+
return ClojureSublimedCljsBuildInputHandler()
794+
return ClojureSublimedHostPortInputHandler()
795+
753796
class ClojureSublimedConnectCommand(sublime_plugin.ApplicationCommand):
754-
def run(self, clojure_sublimed_host_port):
797+
798+
def run(self, clojure_sublimed_profile, clojure_sublimed_cljs_build=None, clojure_sublimed_host_port=''):
755799
host, port = clojure_sublimed_host_port.strip().split(':')
756800
port = int(port)
757-
connect(host, port)
801+
connect(host, port, clojure_sublimed_profile, clojure_sublimed_cljs_build)
758802

759803
def input(self, args):
760-
return ClojureSublimedHostPortInputHandler()
804+
if 'clojure_sublimed_profile' not in args:
805+
return ClojureSublimedProfileInputHandler()
761806

762807
def is_enabled(self):
763808
return conn.socket == None
@@ -772,7 +817,7 @@ def is_enabled(self):
772817
class ClojureSublimedReconnectCommand(sublime_plugin.ApplicationCommand):
773818
def run(self):
774819
conn.disconnect()
775-
connect(conn.host, conn.port)
820+
connect(conn.host, conn.port, conn.profile, conn.cljs_build)
776821

777822
def is_enabled(self):
778823
return conn.socket != None

0 commit comments

Comments
 (0)