64 lines
1.4 KiB
VimL
64 lines
1.4 KiB
VimL
let s:uid = 0
|
|
|
|
"
|
|
" vsnip#snippet#node#variable#import
|
|
"
|
|
function! vsnip#snippet#node#variable#import() abort
|
|
return s:Variable
|
|
endfunction
|
|
|
|
let s:Variable = {}
|
|
|
|
"
|
|
" new.
|
|
"
|
|
function! s:Variable.new(ast) abort
|
|
let s:uid += 1
|
|
|
|
let l:resolver = vsnip#variable#get(a:ast.name)
|
|
return extend(deepcopy(s:Variable), {
|
|
\ 'uid': s:uid,
|
|
\ 'type': 'variable',
|
|
\ 'name': a:ast.name,
|
|
\ 'unknown': empty(l:resolver),
|
|
\ 'resolver': l:resolver,
|
|
\ 'children': vsnip#snippet#node#create_from_ast(get(a:ast, 'children', [])),
|
|
\ 'transform': vsnip#snippet#node#create_transform(get(a:ast, 'transform')),
|
|
\ })
|
|
endfunction
|
|
|
|
"
|
|
" text.
|
|
"
|
|
function! s:Variable.text() abort
|
|
return self.transform.text(join(map(copy(self.children), 'v:val.text()'), ''))
|
|
endfunction
|
|
|
|
"
|
|
" resolve.
|
|
"
|
|
function! s:Variable.resolve(context) abort
|
|
if !self.unknown
|
|
let l:resolved = self.transform.text(self.resolver.func({ 'node': self }))
|
|
if l:resolved isnot v:null
|
|
" Fix indent when one variable returns multiple lines
|
|
let l:base_indent = vsnip#indent#get_base_indent(split(a:context.before_text, "\n", v:true)[-1])
|
|
return substitute(l:resolved, "\n\\zs", l:base_indent, 'g')
|
|
endif
|
|
endif
|
|
return v:null
|
|
endfunction
|
|
|
|
"
|
|
" to_string
|
|
"
|
|
function! s:Variable.to_string() abort
|
|
return printf('%s(name=%s, unknown=%s, text=%s)',
|
|
\ self.type,
|
|
\ self.name,
|
|
\ self.unknown ? 'true' : 'false',
|
|
\ self.text()
|
|
\ )
|
|
endfunction
|
|
|