1
0
mirror of https://github.com/SpaceVim/SpaceVim.git synced 2025-03-26 12:10:32 +08:00
2020-06-13 14:06:35 +08:00

180 lines
5.9 KiB
VimL
Vendored

let s:level_to_name = {0: 'error ', 1: 'warning', 2: 'verbose', 3: 'debug '}
let s:name_to_level = {'error': 0, 'warning': 1, 'verbose': 2, 'debug': 3}
let s:short_level_to_name = {0: 'E', 1: 'W', 2: 'V', 3: 'D'}
let s:is_testing = exists('g:neomake_test_messages')
let s:pid = getpid()
let s:indent = 0
let s:indent_str = ''
if !exists('s:last_msg_ts')
let s:last_msg_ts = neomake#compat#reltimefloat()
endif
function! s:reltime_lastmsg() abort
let cur = neomake#compat#reltimefloat()
let diff = (cur - s:last_msg_ts)
let s:last_msg_ts = cur
if diff < 0.01
return ' '
elseif diff < 10
let format = '+%.2f'
elseif diff < 100
let format = '+%.1f'
elseif diff < 100
let format = ' +%.0f'
elseif diff < 1000
let format = ' +%.0f'
else
let format = '+%.0f'
endif
return printf(format, diff)
endfunction
function! s:log(level, msg, ...) abort
let context = a:0 ? a:1 : {}
let verbosity = neomake#utils#get_verbosity(context)
let logfile = get(g:, 'neomake_logfile', '')
if !s:is_testing && verbosity < a:level && empty(logfile)
return
endif
let msg = s:indent_str . a:msg
if a:0
if has_key(a:1, 'options')
let context = copy(a:1.options)
let context.make_id = a:1.make_id
else
let context = copy(a:1)
endif
let msg = printf('[%s.%s:%s:%d] %s',
\ get(context, 'make_id', '-'),
\ get(context, 'id', '-'),
\ get(context, 'bufnr', get(context, 'file_mode', 0) ? '?' : '-'),
\ get(context, 'winnr', winnr()),
\ msg)
endif
" Use Vader's log for messages during tests.
" @vimlint(EVL104, 1, l:timediff)
if s:is_testing && (verbosity >= a:level || get(g:, 'neomake_test_log_all_messages', 0))
let timediff = s:reltime_lastmsg()
if timediff !=# ' '
let test_msg = '['.s:short_level_to_name[a:level].' '.timediff.']: '.msg
else
let test_msg = '['.s:level_to_name[a:level].']: '.msg
endif
if exists('*vader#log')
" Might not exist with rpcrequest-based nvim test, or throw errors
" if called too early.
call vader#log(test_msg)
endif
" Only keep context entries that are relevant for / used in the message.
let context = a:0
\ ? extend(filter(copy(context), "index(['id', 'make_id', 'bufnr', 'winnr'], v:key) != -1"), {'winnr': winnr()}, 'keep')
\ : {}
call add(g:neomake_test_messages, [a:level, a:msg, context])
if index(['.', '!', ')', ']'], a:msg[-1:-1]) == -1
let g:neomake_test_errors += ['Log msg does not end with punctuation: "'.a:msg.'".']
endif
elseif verbosity >= a:level
if verbosity > 2
echom 'Neomake: '.msg
else
if a:level ==# 0
echohl ErrorMsg
else
echohl WarningMsg
endif
" Use message without context for non-debug msgs.
echom 'Neomake: '.a:msg
echohl None
endif
endif
if !empty(logfile)
if !exists('s:logfile_writefile_opts')
" Use 'append' with writefile, but only if it is available. Otherwise, just
" overwrite the file. 'S' is used to disable fsync in Neovim
" (https://github.com/neovim/neovim/pull/6427).
if has('patch-7.4.503')
let s:logfile_writefile_opts = 'aS'
else
let s:logfile_writefile_opts = ''
echohl WarningMsg
echom 'Neomake: appending to the logfile is not supported in your Vim version.'
echohl NONE
endif
endif
let time = strftime('%H:%M:%S')
if !exists('timediff')
let timediff = s:reltime_lastmsg()
endif
try
call writefile([printf('%s %s [%s %s] %s',
\ time, s:pid, s:short_level_to_name[a:level], timediff, msg)],
\ logfile, s:logfile_writefile_opts)
catch
unlet g:neomake_logfile
call neomake#log#error(printf('Error when trying to write to logfile %s: %s. Unsetting g:neomake_logfile.', logfile, v:exception))
endtry
endif
" @vimlint(EVL104, 0, l:timediff)
endfunction
function! neomake#log#indent(offset) abort
if a:offset < 0 && s:indent <= 0
throw 'invalid offset (already 0)'
endif
let s:indent += a:offset
let s:indent_str = repeat(' ', s:indent*2)
endfunction
function! neomake#log#error(...) abort
call call('s:log', [0] + a:000)
endfunction
function! neomake#log#warning(...) abort
call call('s:log', [1] + a:000)
endfunction
function! neomake#log#info(...) abort
call call('s:log', [2] + a:000)
endfunction
function! neomake#log#debug(...) abort
call call('s:log', [3] + a:000)
endfunction
function! neomake#log#debug_obj(msg, obj) abort
if s:is_testing || neomake#utils#get_verbosity() >= 3 || !empty(get(g:, 'neomake_logfile', ''))
call neomake#log#debug(a:msg.': '.neomake#utils#Stringify(a:obj).'.')
endif
endfunction
function! neomake#log#exception(error, ...) abort
let log_context = a:0 ? a:1 : {'bufnr': bufnr('%')}
echom printf('Neomake error in: %s', v:throwpoint)
call neomake#log#error(a:error, log_context)
call neomake#log#debug(printf('(in %s)', v:throwpoint), log_context)
endfunction
let s:warned = {}
function! neomake#log#warn_once(msg, key) abort
if !has_key(s:warned, a:key)
let s:warned[a:key] = 1
echohl WarningMsg
echom 'Neomake: ' . a:msg
echohl None
let v:warningmsg = 'Neomake: '.a:msg
call neomake#log#debug('Neomake warning: '.a:msg)
endif
endfunction
function! neomake#log#reset_warnings() abort
let s:warned = {}
endfunction
" vim: ts=4 sw=4 et