From d202cdf85864d5392c3c476727390c01f43e38bb Mon Sep 17 00:00:00 2001 From: Ariel D'Alessandro Date: Tue, 19 Apr 2022 08:50:47 +0200 Subject: Update the null ls to move the refactor there --- lua/alpha/php_code_actions.lua | 136 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 lua/alpha/php_code_actions.lua (limited to 'lua/alpha/php_code_actions.lua') diff --git a/lua/alpha/php_code_actions.lua b/lua/alpha/php_code_actions.lua new file mode 100644 index 0000000..998fcb5 --- /dev/null +++ b/lua/alpha/php_code_actions.lua @@ -0,0 +1,136 @@ +local null_ls = require("null-ls") +local utils = require("alpha.utils") +local ts_utils = require("nvim-treesitter.ts_utils") + +local get_node_text = vim.treesitter.get_node_text + +vim.treesitter.set_query( + "php", + "Alpha_refactor_property", + [[ + [ + (union_type + (primitive_type) @type + ) + (union_type + (named_type) @type + ) + (property_element + (variable_name) @name + ) + ] +]] +) + +vim.treesitter.set_query( + "phpdoc", + "Alpha_refactor_property_phpdoc", + [[ + [ + (text) @types + ] + ]] +) + +local php_setter_getter_actions = { + method = null_ls.methods.CODE_ACTION, + filetypes = { "php" }, + generator = { + fn = function(context) + local cursor_node = utils.get_master_node() + if cursor_node.type(cursor_node) ~= "property_declaration" then + return + end + return { + { + title = "Create Getter and Setter", + action = function() + local property_node = cursor_node + + local property_name + local property_types = {} + local query = vim.treesitter.get_query("php", "Alpha_refactor_property") + for _, match in query:iter_matches(property_node, 0) do + for id, subNode in pairs(match) do + local capture_name = query.captures[id] + if capture_name == "name" then + property_name = string.sub(get_node_text(subNode, 0), 2) + elseif capture_name == "type" then + table.insert(property_types, get_node_text(subNode, 0)) + end + end + end + + local comment_node = ts_utils.get_previous_node(property_node) + P(comment_node:type()) + local row, column = comment_node:start() + local test_node = ts_utils.get_root_for_position(row, column) + local comment_query = vim.treesitter.get_query("phpdoc", "Alpha_refactor_property_phpdoc") + for _, match in comment_query:iter_matches(test_node, 0) do + for _, subNode in pairs(match) do + P(get_node_text(subNode, 0)) + end + end + + local insert = {} + table.insert(insert, "") + table.insert( + insert, + string.format( + " public function get%s(): %s", + utils.ucfirst(property_name), + table.concat(property_types, "|") + ) + ) + table.insert(insert, " {") + table.insert(insert, string.format(" return $this->%s;", property_name)) + table.insert(insert, " }") + table.insert(insert, "") + + table.insert( + insert, + string.format( + " public function set%s(%s $%s): self", + utils.ucfirst(property_name), + table.concat(property_types, "|"), + property_name + ) + ) + table.insert(insert, " {") + table.insert(insert, string.format(" $this->%s = $%s;", property_name, property_name)) + table.insert(insert, "") + table.insert(insert, string.format(" return $this;")) + table.insert(insert, " }") + + -- this is using the last line of file mines 2 + vim.api.nvim_buf_set_lines(0, #context.content - 2, #context.content - 2, false, insert) + end, + }, + } + -- context dump + -- { + -- bufname = "/home/alpha/.dotfiles/nvim/.config/nvim/test.php", + -- bufnr = 90, + -- client_id = 1, + -- col = 20, + -- content = { "