Skip to content

Commit 82cdd72

Browse files
committed
Even more generic tree walking looking for the root symbol
1 parent 508fc7b commit 82cdd72

File tree

3 files changed

+30
-27
lines changed

3 files changed

+30
-27
lines changed

fnl/conjure/tree-sitter.fnl

+8-5
Original file line numberDiff line numberDiff line change
@@ -89,19 +89,22 @@
8989
(when node
9090
(= 0 (node:child_count))))
9191

92-
(defn multi-symbol? [node]
92+
;; Some node types I've seen: sym_lit, symbol, multi_symbol...
93+
;; So I'm not sure if each language just picks a flavour, but this should cover all of our bases.
94+
(defn sym? [node]
9395
(when node
94-
(= :multi_symbol (node:type))))
96+
(string.find (node:type) :sym)))
9597

9698
(defn get-leaf [node]
9799
"Return the leaf node under the cursor or nothing at all."
98100
(parse!)
99101

100102
(let [node (or node (ts.get_node_at_cursor))]
101103
(when (leaf? node)
102-
(if (multi-symbol? (parent node))
103-
(parent node)
104-
node))))
104+
(var node node)
105+
(while (sym? (parent node))
106+
(set node (parent node)))
107+
node)))
105108

106109
(defn node-surrounded-by-form-pair-chars? [node extra-pairs]
107110
(let [node-str (node->str node)

lua/conjure/config.lua

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,5 +68,5 @@ local function merge(tbl, opts, ks)
6868
return nil
6969
end
7070
_2amodule_2a["merge"] = merge
71-
merge({relative_file_root = nil, path_subs = nil, client_on_load = true, filetypes = {"clojure", "fennel", "janet", "hy", "julia", "racket", "scheme", "lua", "lisp", "python", "rust"}, filetype = {clojure = "conjure.client.clojure.nrepl", fennel = "conjure.client.fennel.aniseed", janet = "conjure.client.janet.netrepl", hy = "conjure.client.hy.stdio", julia = "conjure.client.julia.stdio", racket = "conjure.client.racket.stdio", scheme = "conjure.client.scheme.stdio", lua = "conjure.client.lua.neovim", lisp = "conjure.client.common-lisp.swank", python = "conjure.client.python.stdio", rust = "conjure.client.rust.evcxr"}, filetype_suffixes = {racket = {"rkt"}, scheme = {"scm"}}, eval = {result_register = "c", inline_results = true, inline = {highlight = "comment", prefix = "=> "}, comment_prefix = nil, gsubs = {}}, mapping = {prefix = "<localleader>", log_split = "ls", log_vsplit = "lv", log_tab = "lt", log_buf = "le", log_toggle = "lg", log_close_visible = "lq", log_reset_soft = "lr", log_reset_hard = "lR", log_jump_to_latest = "ll", eval_current_form = "ee", eval_comment_current_form = "ece", eval_root_form = "er", eval_comment_root_form = "ecr", eval_word = "ew", eval_comment_word = "ecw", eval_replace_form = "e!", eval_marked_form = "em", eval_file = "ef", eval_buf = "eb", eval_visual = "E", eval_motion = "E", def_word = "gd", doc_word = {"K"}}, completion = {omnifunc = "ConjureOmnifunc", fallback = "syntaxcomplete#Complete"}, highlight = {group = "IncSearch", timeout = 500, enabled = false}, log = {hud = {width = 0.42, height = 0.3, enabled = true, passive_close_delay = 0, minimum_lifetime_ms = 20, overlap_padding = 0.1, border = "single", anchor = "NE", ignore_low_priority = false}, jump_to_latest = {cursor_scroll_position = "top", enabled = false}, break_length = 80, trim = {at = 10000, to = 6000}, strip_ansi_escape_sequences_line_limit = 1000, fold = {lines = 10, marker = {start = "~~~%{", ["end"] = "}%~~~"}, enabled = false}, botright = false, wrap = false}, extract = {context_header_lines = 24, form_pairs = {{"(", ")"}, {"{", "}"}, {"[", "]", true}}, tree_sitter = {enabled = true}}, preview = {sample_limit = 0.3}, debug = false})
71+
merge({relative_file_root = nil, path_subs = nil, client_on_load = true, filetypes = {"clojure", "fennel", "janet", "hy", "julia", "racket", "scheme", "lua", "lisp", "python", "rust"}, filetype = {clojure = "conjure.client.clojure.nrepl", fennel = "conjure.client.fennel.aniseed", janet = "conjure.client.janet.netrepl", hy = "conjure.client.hy.stdio", julia = "conjure.client.julia.stdio", racket = "conjure.client.racket.stdio", scheme = "conjure.client.scheme.stdio", lua = "conjure.client.lua.neovim", lisp = "conjure.client.common-lisp.swank", python = "conjure.client.python.stdio", rust = "conjure.client.rust.evcxr"}, filetype_suffixes = {racket = {"rkt"}, scheme = {"scm"}}, eval = {result_register = "c", inline_results = true, inline = {highlight = "comment", prefix = "=> "}, comment_prefix = nil, gsubs = {}}, mapping = {prefix = "<localleader>", log_split = "ls", log_vsplit = "lv", log_tab = "lt", log_buf = "le", log_toggle = "lg", log_close_visible = "lq", log_reset_soft = "lr", log_reset_hard = "lR", log_jump_to_latest = "ll", eval_current_form = "ee", eval_comment_current_form = "ece", eval_root_form = "er", eval_comment_root_form = "ecr", eval_word = "ew", eval_comment_word = "ecw", eval_replace_form = "e!", eval_marked_form = "em", eval_file = "ef", eval_buf = "eb", eval_visual = "E", eval_motion = "E", def_word = "gd", doc_word = {"K"}}, completion = {omnifunc = "ConjureOmnifunc", fallback = "syntaxcomplete#Complete"}, highlight = {group = "IncSearch", timeout = 500, enabled = false}, log = {hud = {width = 0.42, height = 0.3, enabled = true, passive_close_delay = 0, minimum_lifetime_ms = 20, overlap_padding = 0.1, border = "single", anchor = "NE", ignore_low_priority = false}, jump_to_latest = {cursor_scroll_position = "top", enabled = false}, break_length = 80, trim = {at = 10000, to = 6000}, strip_ansi_escape_sequences_line_limit = 1000, fold = {lines = 10, marker = {start = "~~~%{", ["end"] = "}%~~~"}, enabled = false}, wrap = false, botright = false}, extract = {context_header_lines = 24, form_pairs = {{"(", ")"}, {"{", "}"}, {"[", "]", true}}, tree_sitter = {enabled = true}}, preview = {sample_limit = 0.3}, debug = false})
7272
return _2amodule_2a

lua/conjure/tree-sitter.lua

+21-21
Original file line numberDiff line numberDiff line change
@@ -119,23 +119,23 @@ local function leaf_3f(node)
119119
end
120120
end
121121
_2amodule_2a["leaf?"] = leaf_3f
122-
local function multi_symbol_3f(node)
122+
local function sym_3f(node)
123123
if node then
124-
return ("multi_symbol" == node:type())
124+
return string.find(node:type(), "sym")
125125
else
126126
return nil
127127
end
128128
end
129-
_2amodule_2a["multi-symbol?"] = multi_symbol_3f
129+
_2amodule_2a["sym?"] = sym_3f
130130
local function get_leaf(node)
131131
parse_21()
132132
local node0 = (node or ts.get_node_at_cursor())
133133
if leaf_3f(node0) then
134-
if multi_symbol_3f(parent(node0)) then
135-
return parent(node0)
136-
else
137-
return node0
134+
local node1 = node0
135+
while sym_3f(parent(node1)) do
136+
node1 = parent(node1)
138137
end
138+
return node1
139139
else
140140
return nil
141141
end
@@ -144,27 +144,27 @@ _2amodule_2a["get-leaf"] = get_leaf
144144
local function node_surrounded_by_form_pair_chars_3f(node, extra_pairs)
145145
local node_str = node__3estr(node)
146146
local first_and_last_chars = text["first-and-last-chars"](node_str)
147-
local function _17_(_15_)
148-
local _arg_16_ = _15_
149-
local start = _arg_16_[1]
150-
local _end = _arg_16_[2]
147+
local function _16_(_14_)
148+
local _arg_15_ = _14_
149+
local start = _arg_15_[1]
150+
local _end = _arg_15_[2]
151151
return (first_and_last_chars == (start .. _end))
152152
end
153-
local function _20_(_18_)
154-
local _arg_19_ = _18_
155-
local start = _arg_19_[1]
156-
local _end = _arg_19_[2]
153+
local function _19_(_17_)
154+
local _arg_18_ = _17_
155+
local start = _arg_18_[1]
156+
local _end = _arg_18_[2]
157157
return (text["starts-with"](node_str, start) and text["ends-with"](node_str, _end))
158158
end
159-
return (a.some(_17_, config["get-in"]({"extract", "form_pairs"})) or a.some(_20_, extra_pairs) or false)
159+
return (a.some(_16_, config["get-in"]({"extract", "form_pairs"})) or a.some(_19_, extra_pairs) or false)
160160
end
161161
_2amodule_2a["node-surrounded-by-form-pair-chars?"] = node_surrounded_by_form_pair_chars_3f
162162
local function node_prefixed_by_chars_3f(node, prefixes)
163163
local node_str = node__3estr(node)
164-
local function _21_(prefix)
164+
local function _20_(prefix)
165165
return text["starts-with"](node_str, prefix)
166166
end
167-
return (a.some(_21_, prefixes) or false)
167+
return (a.some(_20_, prefixes) or false)
168168
end
169169
_2amodule_2a["node-prefixed-by-chars?"] = node_prefixed_by_chars_3f
170170
local function get_form(node)
@@ -178,9 +178,9 @@ local function get_form(node)
178178
elseif (leaf_3f(node0) or (false == client["optional-call"]("form-node?", node0))) then
179179
return get_form(parent(node0))
180180
else
181-
local _let_23_ = (client["optional-call"]("get-form-modifier", node0) or {})
182-
local modifier = _let_23_["modifier"]
183-
local res = _let_23_
181+
local _let_22_ = (client["optional-call"]("get-form-modifier", node0) or {})
182+
local modifier = _let_22_["modifier"]
183+
local res = _let_22_
184184
if (not modifier or ("none" == modifier)) then
185185
return node0
186186
elseif ("parent" == modifier) then

0 commit comments

Comments
 (0)