aboutsummaryrefslogtreecommitdiffstats
path: root/lua/alpha/php_code_actions.lua
blob: 32b3ed9ed0e36dd9d3245bf9b178b76202d19e07 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
local null_ls = require("null-ls")
local utils = require("alpha.utils")
local ts_utils = require("nvim-treesitter.ts_utils")
local generator = require("alpha.setter_getter_template")

local get_node_text = vim.treesitter.get_node_text

local function tableConcat(t1, t2)
    for i = 1, #t2 do
        t1[#t1 + 1] = t2[i]
    end
    return t1
end

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_primitives",
    [[
    [
        (type_list
            (primitive_type) @primitive
        )
    ]
    ]]
)

vim.treesitter.set_query(
    "phpdoc",
    "Alpha_refactor_property_phpdoc_class",
    [[
    [
        (type_list
            (named_type
                (name) @class
            )
        )
    ]
    ]]
)

local M = {}

M.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 == nil then
                return
            end
            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 nullable = false
                        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)
                        if comment_node ~= nil then
                            -- P(comment_node:type())
                            local row, column = comment_node:start()
                            local test_node = ts_utils.get_root_for_position(row, column)
                            local primitive_query = vim.treesitter.get_query("phpdoc", "Alpha_refactor_property_phpdoc_primitives")
                            for _, match in primitive_query:iter_matches(test_node, 0) do
                                for _, subNode in pairs(match) do
                                    local type = get_node_text(subNode, 0)
                                    -- P(type)
                                    if type ~= "null" then
                                        table.insert(property_types, type)
                                    else
                                        nullable = true
                                    end
                                end
                            end

                            local class_query = vim.treesitter.get_query("phpdoc", "Alpha_refactor_property_phpdoc_class")
                            for _, match in class_query:iter_matches(test_node, 0) do
                                for _, subNode in pairs(match) do
                                    local type = get_node_text(subNode, 0)
                                    table.insert(property_types, type)
                                end
                            end
                        end
                        -- P(property_types)
                        local getter = generator.getGetter(property_name, nullable, property_types, true)
                        local setter = generator.getSetter(property_name, nullable, property_types, true)

                        -- this is using the last line of file mines 2
                        vim.api.nvim_buf_set_lines(
                            0,
                            #context.content - 2,
                            #context.content - 2,
                            false,
                            tableConcat(getter, setter)
                        )
                    end,
                },
            }
            -- context dump
            -- {
            --   bufname = "/home/alpha/.dotfiles/nvim/.config/nvim/test.php",
            --   bufnr = 90,
            --   client_id = 1,
            --   col = 20,
            --   content = { "<?php", "", "class Some", "{", "    /**", "     * @var []int", "     */", "    private array $test = 1;", "}", "" },
            --   ft = "php",
            --   lsp_method = "textDocument/codeAction",
            --   method = "NULL_LS_CODE_ACTION",
            --   range = {
            --     col = 21,
            --     end_col = 21,
            --     end_row = 8,
            --     row = 8
            --   },
            --   row = 8
            -- }
            -- una solucion manar el archivo a algo php para q lo procece

            -- P(context)
        end,
    },
}

return M