diff options
| author | Ariel D'Alessandro <ariel.dalessandro@auto1.com> | 2022-09-26 09:17:39 +0200 |
|---|---|---|
| committer | Ariel D'Alessandro <ariel.dalessandro@auto1.com> | 2022-09-26 09:18:14 +0200 |
| commit | b2ea5bb4976ad786a104d5539d47645ddef237a9 (patch) | |
| tree | 63ced30c20f1ca65c23a009d316e5d5cbfdef3c4 /lua | |
| parent | 4457e657255ba071497b30356676a42f6f184cdf (diff) | |
| download | nvim-conf-b2ea5bb4976ad786a104d5539d47645ddef237a9.tar.gz nvim-conf-b2ea5bb4976ad786a104d5539d47645ddef237a9.zip | |
Add gateway graphql queries search
Diffstat (limited to 'lua')
| -rw-r--r-- | lua/alpha/dap.lua | 6 | ||||
| -rw-r--r-- | lua/alpha/php/gateway.lua | 137 | ||||
| -rw-r--r-- | lua/alpha/php/lsp.lua | 113 | ||||
| -rw-r--r-- | lua/alpha/scratchs/graphql_queries.lua | 75 | ||||
| -rw-r--r-- | lua/alpha/scratchs/intelephense_symbol.lua | 28 | ||||
| -rw-r--r-- | lua/alpha/snips/ft/yaml.lua | 26 | ||||
| -rw-r--r-- | lua/alpha/telescope/init.lua | 178 | ||||
| -rw-r--r-- | lua/alpha/telescope/mappings.lua | 1 | ||||
| -rw-r--r-- | lua/alpha/telescope/setup.lua | 2 |
9 files changed, 376 insertions, 190 deletions
diff --git a/lua/alpha/dap.lua b/lua/alpha/dap.lua index 5d6e403..5511066 100644 --- a/lua/alpha/dap.lua +++ b/lua/alpha/dap.lua @@ -54,10 +54,10 @@ dap.configurations.php = { name = "Listen for Xdebug", port = 9003, pathMappings = function() - if composer.query({"require-dev", "laravel/sali"}) ~= nil then - return { ["/app"] = vim.fn.getcwd() } + if composer.query({"require-dev", "laravel/sali"}) == nil then + return { ["/app"] = "${workspaceFolder}" } end - return { ["/var/www/html"] = vim.fn.getcwd() } + return { ["/var/www/html"] = "${workspaceFolder}" } end, }, } diff --git a/lua/alpha/php/gateway.lua b/lua/alpha/php/gateway.lua new file mode 100644 index 0000000..d196a85 --- /dev/null +++ b/lua/alpha/php/gateway.lua @@ -0,0 +1,137 @@ +local pickers = require("telescope.pickers") +local finders = require("telescope.finders") +local conf = require("telescope.config").values +local action_state = require("telescope.actions.state") +local action_set = require("telescope.actions.set") +local actions = require("telescope.actions") +local get_node_text = vim.treesitter.get_node_text + +local gateway = {} + +local get_definition_buffer = function (type) + local uri = vim.uri_from_fname(vim.fn.getcwd() .. "/config/graphql/_".. type ..".yaml") + local buff = vim.uri_to_bufnr(uri) + vim.fn.bufload(buff) + + return buff +end + +local get_all_definitions = function () + local mutations_definitions = gateway.get_graphql_definitions(get_definition_buffer("mutation")) + local queries_definitions = gateway.get_graphql_definitions(get_definition_buffer("query")) + for _, definition in ipairs(queries_definitions) do + table.insert(mutations_definitions, definition) + end + + return mutations_definitions +end + +-- "'@=mutation(\"App\\\\GraphQL\\\\Mutation\\\\ImageMutation::deleteVehicleImage\", args[\"inspectionId\"], args[\"url\"], info)'", +local open_resolver = function (resolver) + -- need to parse to get this values + local args = string.match(resolver,"'@=mutation%((.+)%)'") + if args == nil then + args = string.match(resolver,"'@=query%((.+)%)'") + end + if args == nil then + P("error resolver") + P(resolver) + return + end + + local args_tbl = vim.split(args, ', ') + local fqn = string.match(args_tbl[1], "\"(.+)\"") + fqn = string.gsub(fqn, "\\\\", "\\") + -- P(fqn) + + R("alpha.php.lsp").find(fqn) +end + +--- @param bufnr integer Buff id +gateway.get_graphql_definitions = function (bufnr) + vim.treesitter.set_query( + "yaml", + "GraphQL_endpoints", + [[ + (document (block_node (block_mapping (block_mapping_pair + value: (block_node (block_mapping (block_mapping_pair + value: (block_node (block_mapping (block_mapping_pair + value: (block_node (block_mapping (block_mapping_pair + key: (flow_node) @mutation + value: (block_node (block_mapping (block_mapping_pair + key: (flow_node) @resolve (#eq? @resolve "resolve") + value: (flow_node) @resolver + ))) + ))) + ))) + ))) + )))) + ]] + ) + + local query = vim.treesitter.get_query("yaml", "GraphQL_endpoints") + + local elements = {} + + local parsers = require("nvim-treesitter.parsers") + local parser = parsers.get_parser(bufnr) + local tree = unpack(parser:parse()) + + for id, node in query:iter_captures(tree:root(), bufnr) do + if query.captures[id] == "mutation" then + table.insert(elements, { + value = get_node_text(node, bufnr), + lnum = node:start() + 1, + buffer = bufnr, + }) + elseif query.captures[id] == "resolver" then + elements[#elements].resolver = get_node_text(node, bufnr) + end + end + + return elements +end + +--- gets the graphql function defined on a given buffer +--- @param opts table: options to pass to the picker +gateway.graphql_definitions = function (opts) + opts = opts or {} + pickers.new(opts, { + promt_title = "Queries", + finder = finders.new_table({ + results = get_all_definitions(), + entry_maker = function(entry) + -- buffer = 43, + -- lnum = 82, + -- resolver = "'@=mutation(\"App\\\\GraphQL\\\\Mutation\\\\ImageMutation::deleteVehicleImage\", args[\"inspectionId\"], args[\"url\"], info)'", + -- value = "deleteVehicleImage" + return { + value = entry, + display = entry.value, + ordinal = entry.value, + path = vim.api.nvim_buf_get_name(entry.buffer), + lnum = entry.lnum, + resolver = entry.resolver, + } + end, + }), + sorter = conf.generic_sorter(opts), + previewer = conf.grep_previewer(opts), + attach_mappings = function(prompt_bufnr, map) + action_set.select:enhance({ + post = function() + local selection = action_state.get_selected_entry() + vim.api.nvim_win_set_cursor(0, { selection.lnum, 0 }) + end, + }) + map("i", "<c-o>", function () + actions.close(prompt_bufnr) + local selection = action_state.get_selected_entry() + open_resolver(selection.resolver) + end) + return true + end, + }):find() +end + +return gateway diff --git a/lua/alpha/php/lsp.lua b/lua/alpha/php/lsp.lua new file mode 100644 index 0000000..dc6fa1c --- /dev/null +++ b/lua/alpha/php/lsp.lua @@ -0,0 +1,113 @@ +local Path = require("plenary.path") + +local lsp = {} + +lsp.get_intelephense_buffer = function () + local clients = vim.lsp.get_active_clients({ name = "intelephense" }) + if #clients == 0 then + return + end + + local intelephense = clients[1] + + local attached_buffers = intelephense.attached_buffers + + for key, val in pairs(attached_buffers) do + if val then + return key + end + end + + return nil +end + + +local get_index_buffer = function () + local uri = vim.uri_from_fname(vim.fn.getcwd() .. "/public/index.php") + local buff = vim.uri_to_bufnr(uri) + vim.fn.bufload(buff) + + return buff +end + + +--- @param search string: fully name to search Class::method +lsp.find = function (search) + search = vim.split(search, "::") + local class = search[1] + local method = search[2] + + local buffer = lsp.get_intelephense_buffer() + + if buffer == nil then + -- TODO I want to not require this. + -- I can load a buffer but does not start the lsp + P("load a php buffer to load the lsp server") + return + end + + vim.lsp.buf_request(buffer, "workspace/symbol", { query = class }, function(err, server_result, _, _) + if err then + vim.api.nvim_err_writeln("Error when finding workspace symbols: " .. err.message) + return + end + + local locations = vim.lsp.util.symbols_to_items(server_result or {}, buffer) or {} + if vim.tbl_isempty(locations) then + vim.api.nvim_err_writeln("Empty response looking for class: " .. class) + return + end + + local class_location = locations[1] + + vim.lsp.buf_request( + buffer, + "workspace/symbol", + { query = method }, + function(method_err, method_server_result, _, _) + if err then + vim.api.nvim_err_writeln("Error when finding workspace symbols: " .. method_err.message) + return + end + + local method_locations = vim.lsp.util.symbols_to_items(method_server_result or {}, buffer) or {} + if vim.tbl_isempty(method_locations) then + P("empty response looking for method") + return + end + + local method_location = nil + for _, value in ipairs(method_locations) do + if value.filename == class_location.filename then + method_location = value + break + end + end + + if method_location == nil then + return + end + + local command = "edit" + local filename = method_location.filename + local row = method_location.lnum + local col = method_location.col - 1 + + if vim.api.nvim_buf_get_name(0) ~= filename or command ~= "edit" then + filename = Path:new(vim.fn.fnameescape(filename)):normalize(vim.loop.cwd()) + pcall(vim.cmd, string.format("%s %s", command, filename)) + end + + if row and col then + local ok, err_msg = pcall(vim.api.nvim_win_set_cursor, 0, { row, col }) + if not ok then + vim.api.nvim_err_writeln("error seting row and col: " .. err_msg) + end + vim.cmd("normal zt") + end + end + ) + end) +end + +return lsp diff --git a/lua/alpha/scratchs/graphql_queries.lua b/lua/alpha/scratchs/graphql_queries.lua deleted file mode 100644 index 3997d86..0000000 --- a/lua/alpha/scratchs/graphql_queries.lua +++ /dev/null @@ -1,75 +0,0 @@ -local pickers = require("telescope.pickers") -local finders = require("telescope.finders") -local conf = require("telescope.config").values -local action_state = require("telescope.actions.state") -local action_set = require("telescope.actions.set") -local get_node_text = vim.treesitter.get_node_text - -local function getElements() - vim.treesitter.set_query( - "yaml", - "GraphQL_endpoints", - [[ - (document (block_node (block_mapping (block_mapping_pair - value: (block_node (block_mapping (block_mapping_pair - value: (block_node (block_mapping (block_mapping_pair - value: (block_node (block_mapping (block_mapping_pair - key: (flow_node) @mutation - value: (block_node (block_mapping (block_mapping_pair - key: (flow_node) @resolve (#eq? @resolve "resolve") - value: (flow_node) @resolver - ))) - ))) - ))) - ))) - )))) - ]] - ) - - local query = vim.treesitter.get_query("yaml", "GraphQL_endpoints") - - local elements = {} - - local parsers = require("nvim-treesitter.parsers") - local parser = parsers.get_parser(0) - local tree = unpack(parser:parse()) - - for id, node in query:iter_captures(tree:root(), 0) do - if query.captures[id] == "mutation" then - table.insert(elements, { get_node_text(node, 0), node:start() + 1 }) - end - end - - return elements -end - -function Queries(opts) - opts = opts or {} - pickers.new(opts, { - promt_title = "Queries", - finder = finders.new_table({ - results = getElements(), - entry_maker = function(entry) - return { - value = entry, - display = entry[1], - ordinal = entry[1], - path = vim.api.nvim_buf_get_name(0), - lnum = entry[2], - } - end, - }), - sorter = conf.generic_sorter(opts), - previewer = conf.grep_previewer(opts), - attach_mappings = function() - action_set.select:enhance({ - post = function() - local selection = action_state.get_selected_entry() - vim.api.nvim_win_set_cursor(0, { selection.lnum, 0 }) - end, - }) - - return true - end, - }):find() -end diff --git a/lua/alpha/scratchs/intelephense_symbol.lua b/lua/alpha/scratchs/intelephense_symbol.lua deleted file mode 100644 index 3f039f3..0000000 --- a/lua/alpha/scratchs/intelephense_symbol.lua +++ /dev/null @@ -1,28 +0,0 @@ -local function get_intelephense_buffer() - local clients = vim.lsp.get_active_clients({ name = "intelephense" }) - if #clients == 0 then - return - end - - local intelephense = clients[1] - - local attached_buffers = intelephense.attached_buffers - - for key, val in pairs(attached_buffers) do - if val then - return key - end - end - - return nil -end - -vim.keymap.set({'n'}, '<leader>pc', function () - local buffer = get_intelephense_buffer() - - if buffer == nil then - return - end - - require("telescope.builtin").lsp_workspace_symbols({ bufnr = buffer, query = vim.fn.expand("<cword>") }) -end) diff --git a/lua/alpha/snips/ft/yaml.lua b/lua/alpha/snips/ft/yaml.lua index 708a67e..27704f9 100644 --- a/lua/alpha/snips/ft/yaml.lua +++ b/lua/alpha/snips/ft/yaml.lua @@ -7,6 +7,7 @@ local d = ls.dynamic_node local f = ls.function_node local i = ls.insert_node local fmt = require("luasnip.extras.fmt").fmt +local rep = require("luasnip.extras").rep local M = { str = fmt([[{}: @@ -85,6 +86,31 @@ properties: i(1, ""), i(2, ""), }), + + mut = fmt([[{}: + type: "{}" + resolve: '@=mutation("App\\GraphQL\\Mutation\\{}::{}", {}, info)' + args: + {} +]], { + i(1, ""), + i(2, ""), + i(3, ""), + rep(1), + i(5, ""), + i(6, ""), + }), + + input = fmt([[{}: + type: input-object + config: + fields: + {} +]], { + i(1, ""), + i(2, ""), + }), + f = fmt([[{}: {{ type: "{}" }}]], {i(1, ""), i(2, "")}), } return M diff --git a/lua/alpha/telescope/init.lua b/lua/alpha/telescope/init.lua index 62055e4..b0e9cf4 100644 --- a/lua/alpha/telescope/init.lua +++ b/lua/alpha/telescope/init.lua @@ -1,11 +1,11 @@ SHOULD_RELOAD_TELESCOPE = true local reloader = function() - if SHOULD_RELOAD_TELESCOPE then - RELOAD("plenary") - RELOAD("telescope") - RELOAD("alpha.telescope.setup") - end + if SHOULD_RELOAD_TELESCOPE then + RELOAD("plenary") + RELOAD("telescope") + RELOAD("alpha.telescope.setup") + end end local action_state = require("telescope.actions.state") @@ -15,134 +15,146 @@ local actions = require("telescope.actions") local M = {} function M.project_files() - local opts = {show_untracked = true} -- define here if you want to define something - local ok = pcall(require("telescope.builtin").git_files, opts) - if not ok then - require("telescope.builtin").find_files(opts) - end + local opts = { show_untracked = true } -- define here if you want to define something + local ok = pcall(require("telescope.builtin").git_files, opts) + if not ok then + require("telescope.builtin").find_files(opts) + end end function M.branches() - require("telescope.builtin").git_branches({ - attach_mappings = function(_, map) - map("i", "<c-j>", actions.git_create_branch) - map("n", "<c-j>", actions.git_create_branch) - return true - end, - }) + require("telescope.builtin").git_branches({ + attach_mappings = function(_, map) + map("i", "<c-j>", actions.git_create_branch) + map("n", "<c-j>", actions.git_create_branch) + return true + end, + }) end function M.search_config() - require("telescope.builtin").git_files({ - prompt_title = "< Dotfiles >", - cwd = "$HOME/.dotfiles", - show_untracked = true - }) + require("telescope.builtin").git_files({ + prompt_title = "< Dotfiles >", + cwd = "$HOME/.dotfiles", + show_untracked = true, + }) end function M.grep_string() - vim.ui.input({ prompt = "Grep for > " }, function(input) - if input == nil then - return - end - require("telescope.builtin").grep_string({ search = input }) - end) + vim.ui.input({ prompt = "Grep for > " }, function(input) + if input == nil then + return + end + require("telescope.builtin").grep_string({ search = input }) + end) end function M.grep_word() - require("telescope.builtin").grep_string({ search = vim.fn.expand("<cword>") }) + require("telescope.builtin").grep_string({ search = vim.fn.expand("<cword>") }) end function M.find_symbol() - vim.ui.input({ prompt = "Symbol for > " }, function(input) - if input == nil then - return - end - require("telescope.builtin").lsp_workspace_symbols({ query = input }) - end) + vim.ui.input({ prompt = "Symbol for > " }, function(input) + if input == nil then + return + end + require("telescope.builtin").lsp_workspace_symbols({ query = input }) + end) end function M.my_plugins() - require("telescope.builtin").find_files({ - cwd = "~/plugins/", - }) + require("telescope.builtin").find_files({ + cwd = "~/plugins/", + }) end function M.projectionist() - return require("telescope").extensions.projectionist.projectionist() + return require("telescope").extensions.projectionist.projectionist() end function M.laravel() - return require("telescope").extensions.laravel.laravel() + return require("telescope").extensions.laravel.laravel() end function M.worktree() - return require("telescope").extensions.git_worktree.git_worktrees() + return require("telescope").extensions.git_worktree.git_worktrees() end function M.worktree_create() - return require("telescope").extensions.git_worktree.create_git_worktree() + return require("telescope").extensions.git_worktree.create_git_worktree() end function M.refactor() - return require("telescope").extensions.refactoring.refactors() + return require("telescope").extensions.refactoring.refactors() end function M.file_browser_relative() - return M.file_browser({ path = "%:p:h" }) + return M.file_browser({ path = "%:p:h" }) +end + +function M.gateway() + return require("alpha.php.gateway").graphql_definitions({ + layout_config = { + horizontal = { + preview_width = function(_, cols, _) + return math.floor(cols * 0.7) + end, + }, + }, + }) end function M.file_browser(opts) - opts = opts or {} + opts = opts or {} - opts = { - path = opts.path, - sorting_strategy = "ascending", - scroll_strategy = "cycle", - layout_config = { - prompt_position = "top", - }, + opts = { + path = opts.path, + sorting_strategy = "ascending", + scroll_strategy = "cycle", + layout_config = { + prompt_position = "top", + }, - attach_mappings = function(prompt_bufnr, map) - local current_picker = action_state.get_current_picker(prompt_bufnr) + attach_mappings = function(prompt_bufnr, map) + local current_picker = action_state.get_current_picker(prompt_bufnr) - local modify_cwd = function(new_cwd) - local finder = current_picker.finder + local modify_cwd = function(new_cwd) + local finder = current_picker.finder - finder.path = new_cwd - finder.files = true - current_picker:refresh(false, { reset_prompt = true }) - end + finder.path = new_cwd + finder.files = true + current_picker:refresh(false, { reset_prompt = true }) + end - map("n", "-", function() - modify_cwd(current_picker.cwd .. "/..") - end) + map("n", "-", function() + modify_cwd(current_picker.cwd .. "/..") + end) - map("i", "~", function() - modify_cwd(vim.fn.expand("~")) - end) + map("i", "~", function() + modify_cwd(vim.fn.expand("~")) + end) - map("n", "yy", function() - local entry = action_state.get_selected_entry() - vim.fn.setreg("+", entry.value) - end) + map("n", "yy", function() + local entry = action_state.get_selected_entry() + vim.fn.setreg("+", entry.value) + end) - map("i", "<c-y>", fb_actions.create) + map("i", "<c-y>", fb_actions.create) - return true - end, - } + return true + end, + } - return require("telescope").extensions.file_browser.file_browser(opts) + return require("telescope").extensions.file_browser.file_browser(opts) end return setmetatable({}, { - __index = function(_, k) - reloader() - if M[k] then - return M[k] - else - return require("telescope.builtin")[k] - end - end, + __index = function(_, k) + reloader() + if M[k] then + return M[k] + else + return require("telescope.builtin")[k] + end + end, }) diff --git a/lua/alpha/telescope/mappings.lua b/lua/alpha/telescope/mappings.lua index 4da58c4..e389a5e 100644 --- a/lua/alpha/telescope/mappings.lua +++ b/lua/alpha/telescope/mappings.lua @@ -42,5 +42,6 @@ map_tele("<leader>fp", "my_plugins") map_tele("<leader>rr", "refactor") map_tele("<leader>pa", "laravel") +map_tele("<leader>pm", "gateway") return map_tele diff --git a/lua/alpha/telescope/setup.lua b/lua/alpha/telescope/setup.lua index 819da4a..09dcd14 100644 --- a/lua/alpha/telescope/setup.lua +++ b/lua/alpha/telescope/setup.lua @@ -28,7 +28,7 @@ require("telescope").setup({ horizontal = { preview_width = function(_, cols, _) if cols > 200 then - return math.floor(cols * 0.4) + return math.floor(cols * 0.5) else return math.floor(cols * 0.6) end |