From b1725f68a1443d554017666887fff8a0544870ef Mon Sep 17 00:00:00 2001 From: Tim Pope Date: Wed, 30 Sep 2015 12:22:01 -0400 Subject: [PATCH] Determine aliases by statically parsing ns declaration --- plugin/fireplace.vim | 105 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 93 insertions(+), 12 deletions(-) diff --git a/plugin/fireplace.vim b/plugin/fireplace.vim index 52d205a..5c2d161 100644 --- a/plugin/fireplace.vim +++ b/plugin/fireplace.vim @@ -1375,26 +1375,107 @@ function! fireplace#findfile(path) abort return '' endfunction +let s:iskeyword = '[[:alnum:]_=?!#$%&*+|./<>:-]' +let s:token = '^\%(#"\%(\\\@.-]' + let lines = join(head, "\n") + let match = matchstr(lines, '\C^(\s*ns\s\+.*') + if len(match) + try + return s:read(match, 0)[0] + catch /^fireplace: Clojure parse error$/ + endtry + endif + return [] +endfunction + +function! fireplace#resolve_alias(name) abort + if a:name =~# '\.' + return a:name + endif + let _ = {} + for refs in filter(copy(s:ns()), 'type(v:val) == type([])') + if a:name =~# '^\u' && refs[0] is# ':import' + for _.ref in refs + if type(_.ref) == type([]) && index(_.ref, a:name) > 0 + return _.ref[0] . '.' . a:name + elseif type(_.ref) == type('') && _.ref =~# '\.'.a:name.'$' + return _.ref + endif + endfor + endif + if refs[0] is# ':require' + for _.ref in refs + if type(_.ref) == type([]) + let i = index(_.ref, ':as') + if i > 0 && get(_.ref, i+1) ==# a:name + return _.ref[0] + endif + for nref in filter(copy(_.ref), 'type(v:val) == type([])') + let i = index(nref, ':as') + if i > 0 && get(nref, i+1) ==# a:name + return _.ref[0].'.'.nref[0] + endif + endfor + endif + endfor + endif + endfor + return a:name +endfunction + function! fireplace#cfile() abort let file = expand('') if file =~# '^\w[[:alnum:]_/]*$' && \ synIDattr(synID(line("."),col("."),1),"name") =~# 'String' - let file = substitute(expand('%:p'), '[^\/:]*$', '', '').a:file + let file = substitute(expand('%:p'), '[^\/:]*$', '', '').file elseif file =~# '^[^/]*/[^/.]*$' && file =~# '^\k\+$' let [file, jump] = split(file, "/") - if file !~# '\.' - if fireplace#op_available('info') - let res = fireplace#message({'op': 'info', 'symbol': file}) - let file = get(get(res, 0, {}), 'ns', file) - else - try - let file = tr(fireplace#evalparse('((ns-aliases *ns*) '.s:qsym(file).' '.s:qsym(file).')'), '.-', '/_') - catch /^Clojure:/ - endtry - endif + let file = fireplace#resolve_alias(file) + if file !~# '\.' && fireplace#op_available('info') + let res = fireplace#message({'op': 'info', 'symbol': file}) + let file = get(get(res, 0, {}), 'ns', file) endif - elseif file =~# '^\w[[:alnum:]-]\+\.[[:alnum:].-]\+$' let file = tr(file, '.-', '/_') + elseif file =~# '^\w[[:alnum:].-]*$' + let file = tr(fireplace#resolve_alias(file), '.-', '/_') endif if exists('jump') return '+sil!dj\ ' . jump . ' ' . fnameescape(file)