From 3c9d21dfaa0117bc3580af1776e33df5aad08a6f Mon Sep 17 00:00:00 2001 From: Sebastian Imlay Date: Fri, 8 Jul 2022 15:06:39 -0400 Subject: [PATCH 1/2] WIP for ra-debug-single --- autoload/lsp_settings/utils.vim | 13 ++++++++++ settings/rust-analyzer.vim | 45 +++++++++++++++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/autoload/lsp_settings/utils.vim b/autoload/lsp_settings/utils.vim index 40711d9e..f5e9a760 100644 --- a/autoload/lsp_settings/utils.vim +++ b/autoload/lsp_settings/utils.vim @@ -96,6 +96,19 @@ function! lsp_settings#utils#term_start(cmd, options) abort endif endfunction +function! lsp_settings#utils#debugger_start(cmd, options) abort + let l:options = {} + if has_key(a:options, 'cwd') + let l:options['cwd'] = a:options['cwd'] + endif + if has('nvim') + split new + call termopen(a:cmd, l:options) + else + call TermdebugCommand(a:cmd, a:options) + endif +endfunction + function! s:extend(lhs, rhs) abort let [l:lhs, l:rhs] = [a:lhs, a:rhs] if type(l:lhs) ==# 3 diff --git a/settings/rust-analyzer.vim b/settings/rust-analyzer.vim index 5e52e230..e46a9a27 100644 --- a/settings/rust-analyzer.vim +++ b/settings/rust-analyzer.vim @@ -229,6 +229,50 @@ function! s:rust_analyzer_run_single(context) abort endif endfunction +function! s:rust_analyzer_debug_single(context) abort + let l:command = get(a:context, 'command', {}) + let l:arguments = get(l:command, 'arguments', []) + let l:argument = get(l:arguments, 0, {}) + + if !has_key(l:argument, 'kind') + call lsp_settings#utils#error('unsupported rust-analyzer.debugSingle command. ' . json_encode(l:command)) + return + endif + + if l:argument['kind'] ==# 'cargo' + let l:label = get(l:argument, 'label', 'cargo') + let l:args = get(l:argument, 'args', {}) + let l:workspaceRoot = get(l:args, 'workspaceRoot', getcwd()) + let l:cargoArgs = get(l:args, 'cargoArgs', []) + let l:cargoExtraArgs = get(l:args, 'cargoExtraArgs', []) + let l:executableArgs = get(l:args, 'executableArgs', []) + + if l:cargoArgs[0] == "test" + l:cargoArgs += ["--no-run"] + endif + l:cargoArgs += ['--message-format=json', '-q'] + if l:cargoArgs[0] == "run" + l:cargoArgs[0] = "build" + endif + + + let l:args = l:cargoExtraArgs + l:cargoExtraArgs + + let l:cmd = ['cargo'] + l:cargoArgs + l:cargoExtraArgs + + call lsp_settings#utils#term_start(l:cmd, {'cwd': l:workspaceRoot}) + + if !empty(l:executableArgs) + let l:cmd += ['--'] + l:executableArgs + endif + + "call lsp_settings#utils#debugger_start(l:cmd, {'cwd': l:workspaceRoot}) + " `TermdebugCommand ${executable} ${executableArgs}` + else + call lsp_settings#utils#error('unsupported rust-analyzer.debugSingle command. ' . json_encode(l:command)) + endif +endfunction + function! s:register_command() abort if get(s:, 'setup') | return | endif let s:setup = 1 @@ -238,5 +282,6 @@ function! s:register_command() abort if exists('*lsp#register_command') call lsp#register_command('rust-analyzer.applySourceChange', function('s:rust_analyzer_apply_source_change')) call lsp#register_command('rust-analyzer.runSingle', function('s:rust_analyzer_run_single')) + call lsp#register_command('rust-analyzer.debugSingle', function('s:rust_analyzer_debug_single')) endif endfunction From eba710a7c7734f79b7744f4205aff605e5dead8c Mon Sep 17 00:00:00 2001 From: Sebastian Imlay Date: Sun, 10 Jul 2022 17:36:20 -0400 Subject: [PATCH 2/2] Got vimspector working --- settings/rust-analyzer.vim | 52 ++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/settings/rust-analyzer.vim b/settings/rust-analyzer.vim index e46a9a27..806ab6ad 100644 --- a/settings/rust-analyzer.vim +++ b/settings/rust-analyzer.vim @@ -187,7 +187,7 @@ function! s:rust_analyzer_apply_source_change(context) abort let l:command = get(a:context, 'command', {}) let l:arguments = get(l:command, 'arguments', []) - let l:argument = get(l:arguments, 0, {}) + let l:argument = get(l:arguments, 0, {}) let l:workspace_edit = get(l:argument, 'workspaceEdit', {}) if !empty(l:workspace_edit) @@ -203,7 +203,7 @@ endfunction function! s:rust_analyzer_run_single(context) abort let l:command = get(a:context, 'command', {}) let l:arguments = get(l:command, 'arguments', []) - let l:argument = get(l:arguments, 0, {}) + let l:argument = get(l:arguments, 0, {}) if !has_key(l:argument, 'kind') call lsp_settings#utils#error('unsupported rust-analyzer.runSingle command. ' . json_encode(l:command)) @@ -232,7 +232,7 @@ endfunction function! s:rust_analyzer_debug_single(context) abort let l:command = get(a:context, 'command', {}) let l:arguments = get(l:command, 'arguments', []) - let l:argument = get(l:arguments, 0, {}) + let l:argument = get(l:arguments, 0, {}) if !has_key(l:argument, 'kind') call lsp_settings#utils#error('unsupported rust-analyzer.debugSingle command. ' . json_encode(l:command)) @@ -248,26 +248,50 @@ function! s:rust_analyzer_debug_single(context) abort let l:executableArgs = get(l:args, 'executableArgs', []) if l:cargoArgs[0] == "test" - l:cargoArgs += ["--no-run"] + let l:cargoArgs += ["--no-run"] endif - l:cargoArgs += ['--message-format=json', '-q'] + + let l:cargoArgs += ['--message-format=json', '-q'] + if l:cargoArgs[0] == "run" - l:cargoArgs[0] = "build" + let l:cargoArgs[0] = "build" endif - let l:args = l:cargoExtraArgs + l:cargoExtraArgs let l:cmd = ['cargo'] + l:cargoArgs + l:cargoExtraArgs - - call lsp_settings#utils#term_start(l:cmd, {'cwd': l:workspaceRoot}) - - if !empty(l:executableArgs) - let l:cmd += ['--'] + l:executableArgs + let l:cmd = join(l:cmd, ' ') + + let l:cargoResponse = systemlist(l:cmd) + let l:executable = '' + for l:cargoMsg in l:cargoResponse + let l:cargoMsg = json_decode(l:cargoMsg) + let l:cargoReason = get(l:cargoMsg, 'reason', '') + + if l:cargoReason == 'build-finished' + if !get(l:cargoMsg, 'success', v:false) + call lsp_settings#utils#error('Cargo build failed') + endif + elseif l:cargoReason == 'compiler-artifact' + let l:executable = get(l:cargoMsg, 'executable', '') + endif + endfor + echo l:executable + echo l:executableArgs + + if l:executable != '' + " let l:executableArgs = join(l:executableArgs, ' ') + let l:settings = { + \ "Executable": l:executable, + \ "Args": l:executableArgs, + \ "name": "launch", + \ } + call vimspector#LaunchWithSettings(l:settings) + "call Termdebug(l:executable) + else + call lsp_settings#utils#error('Failed to get find executable') endif - "call lsp_settings#utils#debugger_start(l:cmd, {'cwd': l:workspaceRoot}) - " `TermdebugCommand ${executable} ${executableArgs}` else call lsp_settings#utils#error('unsupported rust-analyzer.debugSingle command. ' . json_encode(l:command)) endif