summaryrefslogtreecommitdiff
path: root/lua
diff options
context:
space:
mode:
authortheprimeagain <the.primeagen@gmail.com>2026-02-28 07:48:04 -0700
committertheprimeagain <the.primeagen@gmail.com>2026-02-28 07:48:04 -0700
commit5c3f737082faccb3377bedadca5ebba8245a7ab1 (patch)
tree62ceeda1362719dc4d708f52d73243eb0fed87ac /lua
parentad07a4dd1f00b651874e9e6d3a249731d223134d (diff)
downloada4-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.lua1
-rw-r--r--lua/99/editor/treesitter.lua255
-rw-r--r--lua/99/init.lua4
-rw-r--r--lua/99/prompt.lua2
-rw-r--r--lua/99/state.lua2
-rw-r--r--lua/99/state/tracking.lua4
-rw-r--r--lua/99/window/status-window.lua4
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