aboutsummaryrefslogtreecommitdiffstats
path: root/lua/alpha/snips/ft/php.lua
blob: c2210a9bf612dc6daadbfeb55feb49853ff28ee1 (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
local ls = require("luasnip")

local snippet_from_nodes = ls.sn
local c = ls.choice_node
local t = ls.text_node
local d = ls.dynamic_node
local f = ls.function_node
local i = ls.insert_node
local fmt = require("luasnip.extras.fmt").fmt


function string.starts(String,Start)
   return string.sub(String,1,string.len(Start))==Start
end

local newline = function(text)
  return t { "", text }
end

local visibility = function(_, _, _, inital)
    local possibles = {'private', 'public', 'protected'}

    local options = {}

    for _, value in pairs(possibles) do
        if value == inital then
            table.insert(options, 1, t(value))
        else
            table.insert(options, t(value))
        end
    end

    return snippet_from_nodes(nil, {
        c(1, options)
    })
end

local promoted_property
promoted_property = function()
    return snippet_from_nodes(nil, {
        c(1, {
            t(""),
            snippet_from_nodes(nil, {
                newline "\t",
                d(1, visibility, {}, "private"),
                i(2, '$var'),
                t ",",
                d(3, promoted_property, {})
            }),
        }),
    })
end

local namespace = function ()
    local dir = vim.fn.expand('%:h')
    local autoloads = vim.call('composer#query', 'autoload.psr-4')
    if autoloads == nil then
        return (dir:gsub("^%l", string.upper))
    end

    local globalNamespace
    for key, value in pairs(autoloads) do
        if string.starts(dir, value:sub(1, -2)) then
            globalNamespace = key:sub(1, -2);
            dir = dir:sub(#key + 1)
            break
        end
    end
    dir = dir:gsub("/", "\\")

    return string.format("%s\\%s",globalNamespace, dir )
end

local class_name = function ()
    local filename = vim.fn.expand('%:t:r')
    return filename
end
local M = {
    v = fmt(
[[
/**
 * @var {}
 */
{} ${};
]], {
            i(1, "type"),
            d(2, visibility, { 1 }, "private"),
            i(3, "var")
        }),
    class = fmt(
[[
<?php

declare(strict_types=1);

namespace [];

class []
{
    []
}
]],
    {
        f(namespace),
        f(class_name),
        i(0),
    }, { delimiters = "[]"}),
}

return M