diff options
| author | theprimeagain <the.primeagen@gmail.com> | 2026-02-28 07:48:04 -0700 |
|---|---|---|
| committer | theprimeagain <the.primeagen@gmail.com> | 2026-02-28 07:48:04 -0700 |
| commit | 5c3f737082faccb3377bedadca5ebba8245a7ab1 (patch) | |
| tree | 62ceeda1362719dc4d708f52d73243eb0fed87ac /lua | |
| parent | ad07a4dd1f00b651874e9e6d3a249731d223134d (diff) | |
| download | a4-5c3f737082faccb3377bedadca5ebba8245a7ab1.tar.xz a4-5c3f737082faccb3377bedadca5ebba8245a7ab1.zip | |
i believe the state cleanup is almost complete!
Diffstat (limited to 'lua')
| -rw-r--r-- | lua/99/editor/init.lua | 1 | ||||
| -rw-r--r-- | lua/99/editor/treesitter.lua | 255 | ||||
| -rw-r--r-- | lua/99/init.lua | 4 | ||||
| -rw-r--r-- | lua/99/prompt.lua | 2 | ||||
| -rw-r--r-- | lua/99/state.lua | 2 | ||||
| -rw-r--r-- | lua/99/state/tracking.lua | 4 | ||||
| -rw-r--r-- | lua/99/window/status-window.lua | 4 |
7 files changed, 9 insertions, 263 deletions
diff --git a/lua/99/editor/init.lua b/lua/99/editor/init.lua index ff0e8ab..4102e00 100644 --- a/lua/99/editor/init.lua +++ b/lua/99/editor/init.lua @@ -1,4 +1,3 @@ return { - treesitter = require("99.editor.treesitter"), -- lsp = require("99.editor.lsp"), } diff --git a/lua/99/editor/treesitter.lua b/lua/99/editor/treesitter.lua deleted file mode 100644 index 5cb9b1c..0000000 --- a/lua/99/editor/treesitter.lua +++ /dev/null @@ -1,255 +0,0 @@ -local geo = require("99.geo") -local Logger = require("99.logger.logger") -local Range = geo.Range - ---- @class _99.treesitter.TSNode ---- @field start fun(): number ---- @field end_ fun(): number - ---- @class _99.treesitter.Node ---- @field start fun(self: _99.treesitter.Node): number, number, number ---- @field end_ fun(self: _99.treesitter.Node): number, number, number ---- @field named fun(self: _99.treesitter.Node): boolean ---- @field type fun(self: _99.treesitter.Node): string ---- @field range fun(self: _99.treesitter.Node): number, number, number, number - -local M = {} - -local function_query = "99-function" -local imports_query = "99-imports" -local fn_call_query = "99-fn-call" - ---- @param buffer number ----@param lang string -local function tree_root(buffer, lang) - local ok, parser = pcall(vim.treesitter.get_parser, buffer, lang) - if not ok then - return nil - end - - local tree = parser:parse()[1] - return tree:root() -end - ---- @param context _99.Prompt ---- @param cursor _99.Point ---- @return _99.treesitter.TSNode | nil -function M.fn_call(context, cursor) - local buffer = context.buffer - local lang = context.file_type - local logger = context.logger:set_area("treesitter") - local root = tree_root(buffer, lang) - if not root then - Logger:error( - "unable to find treeroot, this should never happen", - "buffer", - buffer, - "lang", - lang - ) - return nil - end - - local ok, query = pcall(vim.treesitter.query.get, lang, fn_call_query) - if not ok or query == nil then - logger:error( - "unable to get the fn_call_query", - "lang", - lang, - "buffer", - buffer, - "ok", - type(ok), - "query", - type(query) - ) - return nil - end - - --- likely something that needs to be done with treesitter#get_node - local found = nil - for _, match, _ in query:iter_matches(root, buffer, 0, -1, { all = true }) do - for _, nodes in pairs(match) do - for _, node in ipairs(nodes) do - local range = Range:from_ts_node(node, buffer) - if range:contains(cursor) then - found = node - goto end_of_loops - end - end - end - end - ::end_of_loops:: - - logger:debug("treesitter#fn_call", "found", found ~= nil) - - return found -end - ---- @class _99.treesitter.Function ---- @field function_range _99.Range ---- @field function_node _99.treesitter.TSNode ---- @field body_range _99.Range ---- @field body_node _99.treesitter.TSNode -local Function = {} -Function.__index = Function - ---- uses the function_node to replace the text within vim using nvim_buf_set_text ---- to replace at the exact function begin / end ---- @param replace_with string[] -function Function:replace_text(replace_with) - self.function_range:replace_text(replace_with) -end - ---- @param ts_node _99.treesitter.TSNode ----@param cursor _99.Point ----@param context _99.Prompt ----@return _99.treesitter.Function -function Function.from_ts_node(ts_node, cursor, context) - local ok, query = - pcall(vim.treesitter.query.get, context.file_type, function_query) - local logger = context.logger:set_area("Function") - if not ok or query == nil then - logger:fatal("not query or not ok") - error("failed") - end - - local func = {} - for id, node, _ in - query:iter_captures(ts_node, context.buffer, 0, -1, { all = true }) - do - local range = Range:from_ts_node(node, context.buffer) - local name = query.captures[id] - if range:contains(cursor) then - if name == "context.function" then - func.function_node = node - func.function_range = range - elseif name == "context.body" then - func.body_node = node - func.body_range = range - end - end - end - - --- NOTE: not all functions have bodies... (lua: local function foo() end) - logger:assert(func.function_node ~= nil, "function_node not found") - logger:assert(func.function_range ~= nil, "function_range not found") - - return setmetatable(func, Function) -end - ---- @param context _99.Prompt ---- @param cursor _99.Point ---- @return _99.treesitter.Function? -function M.containing_function(context, cursor) - local buffer = context.buffer - local lang = context.file_type - local logger = context and context.logger:set_area("treesitter") or Logger - - logger:debug("loading lang", "buffer", buffer, "lang", lang) - local root = tree_root(buffer, lang) - if not root then - logger:debug("could not find tree root") - return nil - end - - local ok, query = pcall(vim.treesitter.query.get, lang, function_query) - if not ok or query == nil then - logger:debug( - "LSP: not ok or query", - "query", - vim.inspect(query), - "lang", - lang, - "ok", - vim.inspect(ok) - ) - return nil - end - - --- @type _99.Range - local found_range = nil - --- @type _99.treesitter.TSNode - local found_node = nil - for id, node, _ in query:iter_captures(root, buffer, 0, -1, { all = true }) do - local range = Range:from_ts_node(node, buffer) - local name = query.captures[id] - if name == "context.function" and range:contains(cursor) then - if not found_range then - found_range = range - found_node = node - elseif found_range:area() > range:area() then - found_range = range - found_node = node - end - end - end - - logger:debug( - "treesitter#containing_function", - "found_range", - found_range and found_range:to_string() or "found_range is nil" - ) - - if not found_range then - return nil - end - logger:assert( - found_node, - "INVARIANT: found_range is not nil but found node is" - ) - - ok, query = pcall(vim.treesitter.query.get, lang, function_query) - if not ok or query == nil then - logger:fatal("INVARIANT: found_range ", "range", found_range:to_text()) - return - end - - --- TODO: we need some language specific things here. - --- that is because comments above the function needs to considered - return Function.from_ts_node(found_node, cursor, context) -end - ---- @param buffer number ---- @return _99.treesitter.Node[] -function M.imports(buffer) - local lang = vim.bo[buffer].ft - local root = tree_root(buffer, lang) - if not root then - Logger:debug("imports: could not find tree root") - return {} - end - - local ok, query = pcall(vim.treesitter.query.get, lang, imports_query) - - if not ok or query == nil then - Logger:debug( - "imports: not ok or query", - "query", - vim.inspect(query), - "lang", - lang, - "ok", - vim.inspect(ok), - "id", - "global" - ) - return {} - end - - local imports = {} - for _, match, _ in query:iter_matches(root, buffer, 0, -1, { all = true }) do - for id, nodes in pairs(match) do - local name = query.captures[id] - if name == "import.name" then - for _, node in ipairs(nodes) do - table.insert(imports, node) - end - end - end - end - - return imports -end - -return M diff --git a/lua/99/init.lua b/lua/99/init.lua index 895b369..797c5a5 100644 --- a/lua/99/init.lua +++ b/lua/99/init.lua @@ -258,7 +258,7 @@ function _99.info() _99_state:refresh_rules() table.insert( info, - string.format("Previous Requests: %d", _99_state:completed_prompts()) + string.format("Previous Requests: %d", _99_state.tracking:completed()) ) table.insert( info, @@ -424,7 +424,7 @@ function _99.open_qfix_for_request(request) end function _99.stop_all_requests() - for _, c in pairs(_99_state.__request_by_id) do + for _, c in ipairs(_99_state.tracking.history) do if c.state == "requesting" then c:stop() end diff --git a/lua/99/prompt.lua b/lua/99/prompt.lua index 4f9fe38..326039b 100644 --- a/lua/99/prompt.lua +++ b/lua/99/prompt.lua @@ -234,7 +234,7 @@ function Prompt:_observer(obs) return { on_start = function() self.state = "requesting" - self._99:track_prompt_request(self) + self._99.tracking:track(self) if obs then obs.on_start() diff --git a/lua/99/state.lua b/lua/99/state.lua index b3ff5fe..3a262b1 100644 --- a/lua/99/state.lua +++ b/lua/99/state.lua @@ -79,6 +79,8 @@ function State.new(opts) --- TODO: Prompt overrides would be a great thing, we just have to get there --- for now, i am going to have this as just a hardcoded ... thing _99_state.prompts = require("99.prompt-settings") + + local previous = read_state_from_tmp(opts) _99_state.tracking = Tracking.new(_99_state) return _99_state diff --git a/lua/99/state/tracking.lua b/lua/99/state/tracking.lua index a0420e8..0e3da08 100644 --- a/lua/99/state/tracking.lua +++ b/lua/99/state/tracking.lua @@ -31,14 +31,14 @@ function Tracking.new(_99, previous_state) end --- @param context _99.Prompt -function Tracking:track_prompt_request(context) +function Tracking:track(context) assert(context:valid(), "context is not valid") table.insert(self.history, context) self.id_to_request[context.xid] = context end --- @return number -function Tracking:completed_requests() +function Tracking:completed() local count = 0 for _, entry in ipairs(self.history) do if entry.state ~= "requesting" then diff --git a/lua/99/window/status-window.lua b/lua/99/window/status-window.lua index 676042b..d1cc58e 100644 --- a/lua/99/window/status-window.lua +++ b/lua/99/window/status-window.lua @@ -80,7 +80,7 @@ function StatusWindow:_run_loop() local active_window = Window.has_active_status_window() local active_other_window = Window.has_active_windows() - local active_requests = self._99:active_request_count() + local active_requests = self._99.tracking:active_request_count() if active_window == false and active_other_window or active_window and active_requests > 0 @@ -110,7 +110,7 @@ function StatusWindow:_run_loop() throb .. " requests(" .. tostring(count) .. ") " .. throb, } - for _, c in pairs(self._99.__request_by_id) do + for _, c in ipairs(self._99.tracking.history) do if c.state == "requesting" then table.insert(lines, c.operation) end |
