From 48dc1f3f90c6bbebcaa93ecf3348648f45c45239 Mon Sep 17 00:00:00 2001 From: James McCoy Date: Fri, 16 Feb 2018 13:33:07 -0500 Subject: provider: ruby: Use stderr_buffered to collect stderr --- runtime/autoload/provider/ruby.vim | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) (limited to 'runtime') diff --git a/runtime/autoload/provider/ruby.vim b/runtime/autoload/provider/ruby.vim index 3fb65fecdf..3d1f7a4138 100644 --- a/runtime/autoload/provider/ruby.vim +++ b/runtime/autoload/provider/ruby.vim @@ -4,16 +4,7 @@ if exists('g:loaded_ruby_provider') endif let g:loaded_ruby_provider = 1 -let s:stderr = {} -let s:job_opts = {'rpc': v:true} - -function! s:job_opts.on_stderr(chan_id, data, event) abort - let stderr = get(s:stderr, a:chan_id, ['']) - let last = remove(stderr, -1) - let a:data[0] = last.a:data[0] - call extend(stderr, a:data) - let s:stderr[a:chan_id] = stderr -endfunction +let s:job_opts = {'rpc': v:true, 'stderr_buffered': v:true} function! provider#ruby#Detect() abort if exists("g:ruby_host_prog") @@ -36,14 +27,15 @@ function! provider#ruby#Require(host) abort endfor try - let channel_id = jobstart(prog, s:job_opts) + let job = copy(s:job_opts) + let channel_id = jobstart(prog, job) if rpcrequest(channel_id, 'poll') ==# 'ok' return channel_id endif catch echomsg v:throwpoint echomsg v:exception - for row in get(s:stderr, channel_id, []) + for row in get(job, 'stderr', []) echomsg row endfor endtry -- cgit From 6fbb8d6739b353752dc405452fb41f9cdf20a0b9 Mon Sep 17 00:00:00 2001 From: James McCoy Date: Fri, 16 Feb 2018 13:33:23 -0500 Subject: provider: Safely access job.stderr in #Require If `jobstart()` fails, then the subsequent `rpcrequest()` will throw due to an invalid channel id. This causes `job.stderr` not to exist, so we throw another exception when trying to dump the job's stderr. Error detected while processing function remote#define#AutocmdBootstrap[1]..remote#host#Require[10]..provider#pythonx#Require: line 22: E716: Key not present in Dictionary: stderr This obfuscates the actual problem. --- runtime/autoload/provider/node.vim | 2 +- runtime/autoload/provider/pythonx.vim | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'runtime') diff --git a/runtime/autoload/provider/node.vim b/runtime/autoload/provider/node.vim index 3dde18022e..493eecf433 100644 --- a/runtime/autoload/provider/node.vim +++ b/runtime/autoload/provider/node.vim @@ -81,7 +81,7 @@ function! provider#node#Require(host) abort catch echomsg v:throwpoint echomsg v:exception - for row in job.stderr + for row in get(job, 'stderr', []) echomsg row endfor endtry diff --git a/runtime/autoload/provider/pythonx.vim b/runtime/autoload/provider/pythonx.vim index 1c77eabe23..f9aa09b16b 100644 --- a/runtime/autoload/provider/pythonx.vim +++ b/runtime/autoload/provider/pythonx.vim @@ -29,7 +29,7 @@ function! provider#pythonx#Require(host) abort catch echomsg v:throwpoint echomsg v:exception - for row in job.stderr + for row in get(job, 'stderr', []) echomsg row endfor endtry -- cgit From 3af3515e74c925c783ad5321589830ed3d54b24a Mon Sep 17 00:00:00 2001 From: James McCoy Date: Fri, 16 Feb 2018 13:53:02 -0500 Subject: Add provider#Poll() to handle starting and polling the provider --- runtime/autoload/provider.vim | 21 +++++++++++++++++++++ runtime/autoload/provider/node.vim | 18 +----------------- runtime/autoload/provider/pythonx.vim | 18 +----------------- runtime/autoload/provider/ruby.vim | 17 +---------------- 4 files changed, 24 insertions(+), 50 deletions(-) create mode 100644 runtime/autoload/provider.vim (limited to 'runtime') diff --git a/runtime/autoload/provider.vim b/runtime/autoload/provider.vim new file mode 100644 index 0000000000..dc24e801d0 --- /dev/null +++ b/runtime/autoload/provider.vim @@ -0,0 +1,21 @@ +" Common functions for providers + +" Start the provider and perform a 'poll' request +" +" Returns a valid channel on success +function! provider#Poll(argv, orig_name, log_env) abort + let job = {'rpc': v:true, 'stderr_buffered': v:true} + try + let channel_id = jobstart(a:argv, job) + if channel_id > 0 && rpcrequest(channel_id, 'poll') ==# 'ok' + return channel_id + endif + catch + echomsg v:throwpoint + echomsg v:exception + for row in get(job, 'stderr', []) + echomsg row + endfor + endtry + throw remote#host#LoadErrorForHost(a:orig_name, a:log_env) +endfunction diff --git a/runtime/autoload/provider/node.vim b/runtime/autoload/provider/node.vim index 493eecf433..ae6f84de72 100644 --- a/runtime/autoload/provider/node.vim +++ b/runtime/autoload/provider/node.vim @@ -3,8 +3,6 @@ if exists('g:loaded_node_provider') endif let g:loaded_node_provider = 1 -let s:job_opts = {'rpc': v:true, 'stderr_buffered': v:true} - function! s:is_minimum_version(version, min_major, min_minor) abort if empty(a:version) let nodejs_version = get(split(system(['node', '-v']), "\n"), 0, '') @@ -72,21 +70,7 @@ function! provider#node#Require(host) abort call add(args, provider#node#Prog()) - try - let job = copy(s:job_opts) - let channel_id = jobstart(args, job) - if rpcrequest(channel_id, 'poll') ==# 'ok' - return channel_id - endif - catch - echomsg v:throwpoint - echomsg v:exception - for row in get(job, 'stderr', []) - echomsg row - endfor - endtry - endtry - throw remote#host#LoadErrorForHost(a:host.orig_name, '$NVIM_NODE_LOG_FILE') + return provider#Poll(args, a:host.orig_name, '$NVIM_NODE_LOG_FILE') endfunction function! provider#node#Call(method, args) abort diff --git a/runtime/autoload/provider/pythonx.vim b/runtime/autoload/provider/pythonx.vim index f9aa09b16b..b51c398410 100644 --- a/runtime/autoload/provider/pythonx.vim +++ b/runtime/autoload/provider/pythonx.vim @@ -5,8 +5,6 @@ endif let s:loaded_pythonx_provider = 1 -let s:job_opts = {'rpc': v:true, 'stderr_buffered': v:true} - function! provider#pythonx#Require(host) abort let ver = (a:host.orig_name ==# 'python') ? 2 : 3 @@ -20,21 +18,7 @@ function! provider#pythonx#Require(host) abort call add(args, plugin.path) endfor - try - let job = copy(s:job_opts) - let channel_id = jobstart(args, job) - if rpcrequest(channel_id, 'poll') ==# 'ok' - return channel_id - endif - catch - echomsg v:throwpoint - echomsg v:exception - for row in get(job, 'stderr', []) - echomsg row - endfor - endtry - throw remote#host#LoadErrorForHost(a:host.orig_name, - \ '$NVIM_PYTHON_LOG_FILE') + return provider#Poll(args, a:host.orig_name, '$NVIM_PYTHON_LOG_FILE') endfunction function! provider#pythonx#Detect(major_ver) abort diff --git a/runtime/autoload/provider/ruby.vim b/runtime/autoload/provider/ruby.vim index 3d1f7a4138..2fe3817512 100644 --- a/runtime/autoload/provider/ruby.vim +++ b/runtime/autoload/provider/ruby.vim @@ -4,8 +4,6 @@ if exists('g:loaded_ruby_provider') endif let g:loaded_ruby_provider = 1 -let s:job_opts = {'rpc': v:true, 'stderr_buffered': v:true} - function! provider#ruby#Detect() abort if exists("g:ruby_host_prog") return g:ruby_host_prog @@ -26,20 +24,7 @@ function! provider#ruby#Require(host) abort let prog .= " " . shellescape(plugin.path) endfor - try - let job = copy(s:job_opts) - let channel_id = jobstart(prog, job) - if rpcrequest(channel_id, 'poll') ==# 'ok' - return channel_id - endif - catch - echomsg v:throwpoint - echomsg v:exception - for row in get(job, 'stderr', []) - echomsg row - endfor - endtry - throw remote#host#LoadErrorForHost(a:host.orig_name, '$NVIM_RUBY_LOG_FILE') + return provider#Poll(prog, a:host.orig_name, '$NVIM_RUBY_LOG_FILE') endfunction function! provider#ruby#Call(method, args) abort -- cgit