local ls = require 'luasnip' local s = ls.snippet local t = ls.text_node local i = ls.insert_node local f = ls.function_node local function get_psr4_root() local handle = io.popen [[php -r "echo array_keys(json_decode(file_get_contents('composer.json'), true)['autoload']['psr-4'])[0];"]] local ns_root = handle and handle:read '*a' or '' if handle then handle:close() end ns_root = ns_root:gsub('\\$', '') -- Remove trailing backslash return ns_root end local function psr_namespace(args, snip) local path = snip.env.TM_FILENAME_FULL or '' local composer_root = get_psr4_root() -- Find the directory mapped by composer.json local root_dir = composer_root:gsub('\\', '/') local ns = path:match(root_dir .. '/(.*)/[^/]+%.php$') if ns then return composer_root .. '\\' .. ns:gsub('/', '\\') else return composer_root ~= '' and composer_root or 'App' end end local function class_name(args, snip) local filename = snip.env.TM_FILENAME or '' return filename:match '([^%.]+)' or 'ClassName' end return { s('du', { t 'dump(', i(0), t ');' }), s('dt', { t '\\PhpStan\\dumpType(', i(0), t ');' }), s('ql', { t '\\Illuminate\\Support\\Facades\\DB::listen(function (\\Illuminate\\Database\\Events\\QueryExecuted $e) {', t { '', ' dump($e->sql, $e->bindings);' }, t { '', '});' }, }), s('test', { t 'test(', i(1), t ', function () {', t { '', ' ' }, i(0), t { '', ');' }, }), s('/**', { t '/**', t { '', ' * ' }, i(0), t { '', ' */' }, }), s('@p', { t '@property ', i(1), t ' $', i(0) }), s('@pb', { t '@property bool $', i(0) }), s('@ps', { t '@property string $', i(0) }), s('@pi', { t '@property int $', i(0) }), s('@pc', { t '@property \\Illuminate\\Support\\Collection $', i(0) }), s('@pd', { t '@property \\Illuminate\\Support\\Carbon $', i(0) }), s('@pp', { t '/**', t { '', ' * @property int $id' }, t { '', ' * ' }, i(1), t { '', ' * @property \\Illuminate\\Support\\Carbon $created_at' }, t { '', ' * @property \\Illuminate\\Support\\Carbon $updated_at' }, t { '', ' *', ' * Relationships' }, t { '', ' * ' }, i(0), t { '', ' */' }, }), s('php', { t '