Skip to content

Commit

Permalink
Even more generic tree walking looking for the root symbol
Browse files Browse the repository at this point in the history
  • Loading branch information
Olical committed Feb 19, 2023
1 parent 508fc7b commit 82cdd72
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 27 deletions.
13 changes: 8 additions & 5 deletions fnl/conjure/tree-sitter.fnl
Original file line number Diff line number Diff line change
Expand Up @@ -89,19 +89,22 @@
(when node
(= 0 (node:child_count))))

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

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

(let [node (or node (ts.get_node_at_cursor))]
(when (leaf? node)
(if (multi-symbol? (parent node))
(parent node)
node))))
(var node node)
(while (sym? (parent node))
(set node (parent node)))
node)))

(defn node-surrounded-by-form-pair-chars? [node extra-pairs]
(let [node-str (node->str node)
Expand Down
2 changes: 1 addition & 1 deletion lua/conjure/config.lua
Original file line number Diff line number Diff line change
Expand Up @@ -68,5 +68,5 @@ local function merge(tbl, opts, ks)
return nil
end
_2amodule_2a["merge"] = merge
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})
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})
return _2amodule_2a
42 changes: 21 additions & 21 deletions lua/conjure/tree-sitter.lua
Original file line number Diff line number Diff line change
Expand Up @@ -119,23 +119,23 @@ local function leaf_3f(node)
end
end
_2amodule_2a["leaf?"] = leaf_3f
local function multi_symbol_3f(node)
local function sym_3f(node)
if node then
return ("multi_symbol" == node:type())
return string.find(node:type(), "sym")
else
return nil
end
end
_2amodule_2a["multi-symbol?"] = multi_symbol_3f
_2amodule_2a["sym?"] = sym_3f
local function get_leaf(node)
parse_21()
local node0 = (node or ts.get_node_at_cursor())
if leaf_3f(node0) then
if multi_symbol_3f(parent(node0)) then
return parent(node0)
else
return node0
local node1 = node0
while sym_3f(parent(node1)) do
node1 = parent(node1)
end
return node1
else
return nil
end
Expand All @@ -144,27 +144,27 @@ _2amodule_2a["get-leaf"] = get_leaf
local function node_surrounded_by_form_pair_chars_3f(node, extra_pairs)
local node_str = node__3estr(node)
local first_and_last_chars = text["first-and-last-chars"](node_str)
local function _17_(_15_)
local _arg_16_ = _15_
local start = _arg_16_[1]
local _end = _arg_16_[2]
local function _16_(_14_)
local _arg_15_ = _14_
local start = _arg_15_[1]
local _end = _arg_15_[2]
return (first_and_last_chars == (start .. _end))
end
local function _20_(_18_)
local _arg_19_ = _18_
local start = _arg_19_[1]
local _end = _arg_19_[2]
local function _19_(_17_)
local _arg_18_ = _17_
local start = _arg_18_[1]
local _end = _arg_18_[2]
return (text["starts-with"](node_str, start) and text["ends-with"](node_str, _end))
end
return (a.some(_17_, config["get-in"]({"extract", "form_pairs"})) or a.some(_20_, extra_pairs) or false)
return (a.some(_16_, config["get-in"]({"extract", "form_pairs"})) or a.some(_19_, extra_pairs) or false)
end
_2amodule_2a["node-surrounded-by-form-pair-chars?"] = node_surrounded_by_form_pair_chars_3f
local function node_prefixed_by_chars_3f(node, prefixes)
local node_str = node__3estr(node)
local function _21_(prefix)
local function _20_(prefix)
return text["starts-with"](node_str, prefix)
end
return (a.some(_21_, prefixes) or false)
return (a.some(_20_, prefixes) or false)
end
_2amodule_2a["node-prefixed-by-chars?"] = node_prefixed_by_chars_3f
local function get_form(node)
Expand All @@ -178,9 +178,9 @@ local function get_form(node)
elseif (leaf_3f(node0) or (false == client["optional-call"]("form-node?", node0))) then
return get_form(parent(node0))
else
local _let_23_ = (client["optional-call"]("get-form-modifier", node0) or {})
local modifier = _let_23_["modifier"]
local res = _let_23_
local _let_22_ = (client["optional-call"]("get-form-modifier", node0) or {})
local modifier = _let_22_["modifier"]
local res = _let_22_
if (not modifier or ("none" == modifier)) then
return node0
elseif ("parent" == modifier) then
Expand Down

0 comments on commit 82cdd72

Please sign in to comment.