diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 828ec18..f01a833 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -57,12 +57,6 @@ discussing on Gitter rather than raising an issue. * Version of Vimspector: (e.g. output of `git rev-parse HEAD` if cloned or the name of the tarball used to install otherwise) -* Output of `:VimspectorDebugInfo` - -``` -paste here -``` - * Output of `vim --version` or `nvim --version` ``` diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index f186f5d..17f9601 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -13,7 +13,7 @@ defaults: jobs: PythonLint: - runs-on: ubuntu-18.04 + runs-on: ubuntu-16.04 container: 'puremourning/vimspector:test' steps: - uses: actions/checkout@v2 @@ -22,7 +22,7 @@ jobs: - name: 'Run flake8' run: '$HOME/.local/bin/flake8 python3/ *.py' VimscriptLint: - runs-on: 'ubuntu-18.04' + runs-on: 'ubuntu-16.04' container: 'puremourning/vimspector:test' steps: - uses: actions/checkout@v2 @@ -32,7 +32,7 @@ jobs: run: $HOME/.local/bin/vint autoload/ compiler/ plugin/ tests/ syntax/ Linux: - runs-on: 'ubuntu-18.04' + runs-on: 'ubuntu-16.04' container: image: 'puremourning/vimspector:test' options: --cap-add=SYS_PTRACE --security-opt seccomp=unconfined @@ -111,16 +111,6 @@ jobs: path: gadgets/macos/download name: Cache gadgets - - name: 'Install .NET Core SDK 3.1' - uses: actions/setup-dotnet@v1.7.2 - with: - dotnet-version: 3.1 - - - uses: maxim-lobanov/setup-xcode@v1 - with: - xcode-version: ^11 - name: "Switch to xcode 11 because of .NET debugging bug" - - run: vim --version name: 'Print vim version information' @@ -153,10 +143,10 @@ jobs: # if: failure() # with: # NGROK_AUTH_TOKEN: ${{ secrets.NGROK_AUTH_TOKEN }} - # SSH_PASS: ${{ secrets.SSH_PASS }} # [V]imspector + # SSH_PASS: ${{ secrets.SSH_PASS }} PublishRelease: - runs-on: 'ubuntu-18.04' + runs-on: 'ubuntu-16.04' needs: - Linux - MacOS diff --git a/.github/workflows/lock_old_issues.yaml b/.github/workflows/lock_old_issues.yaml deleted file mode 100644 index 25d65e0..0000000 --- a/.github/workflows/lock_old_issues.yaml +++ /dev/null @@ -1,27 +0,0 @@ -name: "Lock Old Issues" - -on: - schedule: - - cron: '0 0 * * *' - workflow_dispatch: - -jobs: - lock: - runs-on: ubuntu-latest - steps: - - uses: dessant/lock-threads@v2 - with: - github-token: ${{ github.token }} - issue-lock-inactive-days: '60' - # issue-exclude-created-before: '' - # issue-exclude-labels: '' - # issue-lock-labels: '' - # issue-lock-comment: '' - # issue-lock-reason: 'resolved' - # pr-lock-inactive-days: '365' - # pr-exclude-created-before: '' - # pr-exclude-labels: '' - # pr-lock-labels: '' - # pr-lock-comment: '' - # pr-lock-reason: 'resolved' - process-only: 'issues' diff --git a/.mergify.yml b/.mergify.yml index 0f02002..09d3d83 100644 --- a/.mergify.yml +++ b/.mergify.yml @@ -9,8 +9,9 @@ pull_request_rules: # CI https://doc.mergify.io/conditions.html#github-actions - status-success=PythonLint - status-success=VimscriptLint - - status-success=Linux - status-success=MacOS + + actions: &merge-actions merge: method: merge diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index adec034..1866974 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -46,23 +46,6 @@ The GitHub issue tracker is for *bug reports* and *features requests* for the Vimspector project, and on-topic comments and follow-ups to them. It is not for general discussion, general support or for any other purpose. -Please **search the issue tracker for similar issues** before creating a new -one. There's no point in duplication; if an existing open issue addresses your -problem, please comment there instead of creating a duplicate. However, if the -issue you found is **closed as resolved** (e.g. with a PR or the original user's -problem was resolved), raise a **new issue**, because you've found a new -problem. Reference the original issue if you think that's useful information. - -Closed issues which have been inactive for 60 days will be locked, this helps to -keep discussions focussed. If you believe you are still experiencing an issue -which has been closed, please raise a new issue, completing the issue template. - -If you do find a similar _open_ issue, **don't just post 'me too' or similar** -responses. This almost never helps resolve the issue, and just causes noise for -the maintainers. Only post if it will aid the maintainers in solving the issue; -if there are existing diagnostics requested in the thread, perform -them and post the results. - Please do not be offended if your Issue or comment is closed or hidden, for any of the following reasons: @@ -70,7 +53,6 @@ of the following reasons: * The issue or comment is off-topic * The issue does not represent a Vimspector bug or feature request * The issue cannot be reasonably reproduced using the minimal vimrc -* The issue is a duplicate of an existing issue * etc. Issue titles are important. It's not usually helpful to write a title like diff --git a/README.md b/README.md index d198292..6979e44 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ For a tutorial and usage overview, take a look at the [Vimspector website][website]. -For detailed explanation of the `.vimspector.json` format, see the +For detailed explanatin of the `.vimspector.json` format, see the [reference guide][vimspector-ref]. ![Build](https://github.com/puremourning/vimspector/workflows/Build/badge.svg?branch=master) [![Gitter](https://badges.gitter.im/vimspector/Lobby.svg)](https://gitter.im/vimspector/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) @@ -61,14 +61,14 @@ For detailed explanation of the `.vimspector.json` format, see the * [Closing debugger](#closing-debugger) * [Terminate debuggee](#terminate-debuggee) * [Debug profile configuration](#debug-profile-configuration) - * [C, C++, Rust, etc.](#c-c-rust-etc) - * [Data visualization / pretty printing](#data-visualization--pretty-printing) - * [C++ Remote debugging](#c-remote-debugging) - * [C++ Remote launch and attach](#c-remote-launch-and-attach) + * [C, C , Rust, etc.](#c-c-rust-etc) + * [C Remote debugging](#c-remote-debugging) + * [C Remote launch and attach](#c-remote-launch-and-attach) * [Rust](#rust) * [Python](#python) * [Python Remote Debugging](#python-remote-debugging) * [Python Remote launch and attach](#python-remote-launch-and-attach) + * [Legacy: vscode-python](#legacy-vscode-python) * [TCL](#tcl) * [C♯](#c) * [Go](#go) @@ -100,7 +100,7 @@ For detailed explanation of the `.vimspector.json` format, see the # Features and Usage The plugin is a capable Vim graphical debugger for multiple languages. -It's mostly tested for C++, Python and TCL, but in theory supports any +It's mostly tested for c++, python and TCL, but in theory supports any language that Visual Studio Code supports (but see caveats). The [Vimspector website][website] has an overview of the UI, along with basic @@ -145,24 +145,23 @@ runtime dependencies). They are categorised by their level of support: * `Supported` : Fully supported, frequently used and manually tested * `Experimental`: Working, but not frequently used and rarely tested * `Legacy`: No longer supported, please migrate your config -* `Retired`: No longer included or supported. -| Language | Status | Switch (for `install_gadget.py`) | Adapter (for `:VimspectorInstall`) | Dependencies | -|--------------------|-----------|----------------------------------|------------------------------------|--------------------------------------------| -| C, C++, Rust etc. | Tested | `--all` or `--enable-c` (or cpp) | vscode-cpptools | mono-core | -| Rust, C, C++, etc. | Supported | `--force-enable-rust` | CodeLLDB | Python 3 | -| Python | Tested | `--all` or `--enable-python` | debugpy | Python 2.7 or Python 3 | -| Go | Tested | `--enable-go` | vscode-go | Node, Go, [Delve][] | -| TCL | Supported | `--all` or `--enable-tcl` | tclpro | TCL 8.5 | -| Bourne Shell | Supported | `--all` or `--enable-bash` | vscode-bash-debug | Bash v?? | -| Lua | Supported | `--all` or `--enable-lua` | local-lua-debugger-vscode | Node >=12.13.0, Npm, Lua interpreter | -| Node.js | Supported | `--force-enable-node` | vscode-node-debug2 | 6 < Node < 12, Npm | -| Javascript | Supported | `--force-enable-chrome` | debugger-for-chrome | Chrome | -| Java | Supported | `--force-enable-java ` | vscode-java-debug | Compatible LSP plugin (see [later](#java)) | -| C# (dotnet core) | Tested | `--force-enable-csharp` | netcoredbg | DotNet core | -| F#, VB, etc. | Supported | `--force-enable-[fsharp,vbnet]` | `, `--force-enable-vbnet` | netcoredbg | DotNet core | -| C# (mono) | _Retired_ | N/A | N/A | N/A | -| Python.legacy | _Retired_ | N/A | N/A | N/A | +| Language | Status | Switch (for `install_gadget.py`) | Adapter (for `:VimspectorInstall`) | Dependencies | +|--------------------|--------------|------------------------------------|------------------------------------|--------------------------------------------| +| C, C++, Rust etc. | Tested | `--all` or `--enable-c` (or cpp) | vscode-cpptools | mono-core | +| Rust, C, C++, etc. | Supported | `--force-enable-rust` | CodeLLDB | Python 3 | +| Python | Tested | `--all` or `--enable-python` | debugpy | Python 2.7 or Python 3 | +| Go | Tested | `--enable-go` | vscode-go | Node, Go, [Delve][] | +| TCL | Supported | `--all` or `--enable-tcl` | tclpro | TCL 8.5 | +| Bourne Shell | Supported | `--all` or `--enable-bash` | vscode-bash-debug | Bash v?? | +| Lua | Supported | `--all` or `--enable-lua` | local-lua-debugger-vscode | Node >=12.13.0, Npm, Lua interpreter | +| Node.js | Supported | `--force-enable-node` | vscode-node-debug2 | 6 < Node < 12, Npm | +| Javascript | Supported | `--force-enable-chrome` | debugger-for-chrome | Chrome | +| Java | Supported | `--force-enable-java ` | vscode-java-debug | Compatible LSP plugin (see [later](#java)) | +| C# (dotnet core) | Experimental | `--force-enable-csharp` | netcoredbg | DotNet core | +| C# (mono) | Experimental | `--force-enable-csharp` | vscode-mono-debug | Mono | +| F#, VB, etc. | Experimental | `--force-enable-fsharp` (or vbnet) | netcoredbg | DotNet core | +| Python.legacy | Legacy | `--force-enable-python.legacy` | vscode-python | Node 10, Python 2.7 or Python 3 | ## Other languages @@ -291,7 +290,7 @@ If you just want to try out vimspector without changing your vim config, there are example projects for a number of languages in `support/test`, including: * Python (`support/test/python/simple_python`) -* Go (`support/test/go/hello_world` and `support/test/go/name-starts-with-vowel`) +* Go (`support/test/go/hello_world`) * Nodejs (`support/test/node/simple`) * Chrome (`support/test/chrome/`) * etc. @@ -527,6 +526,13 @@ Example: "${gadgetDir}/vscode-cpptools/debugAdapters/OpenDebugAD7" ], "name": "cppdbg" + }, + "vscode-python": { + "command": [ + "node", + "${gadgetDir}/vscode-python/out/client/debugger/debugAdapter/main.js" + ], + "name": "vscode-python" } } } @@ -1008,8 +1014,6 @@ be changed manually to "switch to" that thread. to set the "focussed" thread to the currently selected one. If the selected line is a stack frame, set the focussed thread to the thread of that frame and jump to that frame in the code window. -* The current frame when a breakpoint is hit or if manuall jumping is also - highlighted. ![stack trace](https://puremourning.github.io/vimspector-web/img/vimspector-callstack-window.png) @@ -1071,8 +1075,6 @@ information when something goes wrong that's not a Vim traceback. If you just want to see the Vimspector log file, use `:VimspectorToggleLog`, which will tail it in a little window (doesn't work on Windows). -You can see some debugging info with `:VimspectorDebugInfo` - ## Closing debugger To close the debugger, use: @@ -1177,38 +1179,6 @@ licensing. } ``` -### Data visualization / pretty printing - -Depending on the backend you need to enable pretty printing of complex types manually. - -* LLDB: Pretty printing is enabled by default - -* GDB: To enable gdb pretty printers, consider the snippet below. - It is not enough to have `set print pretty on` in your .gdbinit! - -``` -{ - "configurations": { - "Launch": { - "adapter": "vscode-cpptools", - "configuration": { - "request": "launch", - "program": "", - ... - "MIMode": "gdb" - "setupCommands": [ - { - "description": "Enable pretty-printing for gdb", - "text": "-enable-pretty-printing", - "ignoreFailures": true - } - ], - } - } - } -} -``` - ### C++ Remote debugging The cpptools documentation describes how to attach cpptools to gdbserver using @@ -1294,6 +1264,10 @@ Rust is supported with any gdb/lldb-based debugger. So it works fine with headers/libs to build a C python extension for performance. * Full options: https://github.com/microsoft/debugpy/wiki/Debug-configuration-settings + +**Migrating from `vscode-python`**: change `"adapter": "vscode-python"` to +`"adapter": "debugpy"`. + ```json { "configurations": { @@ -1360,6 +1334,34 @@ debugpy](https://github.com/microsoft/debugpy/wiki/Debugging-over-SSH). If you're feeling fancy, checkout the [reference guide][remote-debugging] for an example of getting Vimspector to remotely launch and attach. +### Legacy: vscode-python + +* No longer installed by default - please pass `--force-enable-python.legacy` if + you just want to continue using your working setup. +* [vscode-python](https://github.com/Microsoft/vscode-python) +* NOTE: You must be running `node` 10. See [this issue](https://github.com/puremourning/vimspector/issues/105) + +```json +{ + "configurations": { + ": Launch": { + "adapter": "vscode-python", + "configuration": { + "name": ": Launch", + "type": "python", + "request": "launch", + "cwd": "", + "stopOnEntry": true, + "console": "externalTerminal", + "debugOptions": [], + "program": "" + } + } + ... + } +} +``` + ## TCL * TCL (TclProDebug) @@ -1383,8 +1385,35 @@ netcoredbg` "program": "${workspaceRoot}/bin/Debug/netcoreapp2.2/csharp.dll", "args": [], "stopAtEntry": true, + "cwd": "${workspaceRoot}" + } + } + } +} +``` + +* C# - mono + +Install with `install_gadget.py --force-enable-csharp` or `:VimspectorInstall +vscode-mono-debug`. + +***Known not to work.*** + +```json +{ + "configurations": { + "launch - mono": { + "adapter": "vscode-mono-debug", + "configuration": { + "request": "launch", + "program": "${workspaceRoot}/bin/Debug/netcoreapp2.2/csharp.dll", + "args": [], "cwd": "${workspaceRoot}", - "env": {} + "runtimeExecutable": "mono", + "runtimeArgs": [], + "env": [], + "externalConsole": false, + "console": "integratedTerminal" } } } @@ -1401,8 +1430,6 @@ Requires: * [Delve][delve-install] installed, e.g. `go get -u github.com/go-delve/delve/cmd/dlv` * Delve to be in your PATH, or specify the `dlvToolPath` launch option -NOTE: Vimspector uses the ["legacy" vscode-go debug adapter](https://github.com/golang/vscode-go/blob/master/docs/debugging-legacy.md) rather than the "built-in" DAP support in Delve. You can track https://github.com/puremourning/vimspector/issues/186 for that. - ```json { "configurations": { @@ -1420,7 +1447,7 @@ NOTE: Vimspector uses the ["legacy" vscode-go debug adapter](https://github.com/ ``` See the vscode-go docs for -[troubleshooting information](https://github.com/golang/vscode-go/blob/master/docs/debugging-legacy.md#troubleshooting) +[troubleshooting information](https://github.com/golang/vscode-go/blob/master/docs/debugging.md#troubleshooting) ## PHP @@ -1739,26 +1766,22 @@ Vimsector uses them, they will not be replaced. So to customise the signs, define them in your `vimrc`. -| Sign | Description | Priority | -|---------------------------|-----------------------------------------|----------| -| `vimspectorBP` | Line breakpoint | 9 | -| `vimspectorBPCond` | Conditional line breakpoint | 9 | -| `vimspectorBPDisabled` | Disabled breakpoint | 9 | -| `vimspectorPC` | Program counter (i.e. current line) | 200 | -| `vimspectorPCBP` | Program counter and breakpoint | 200 | -| `vimspectorCurrentThread` | Focussed thread in stack trace view | 200 | -| `vimspectorCurrentFrame` | Current stack frame in stack trace view | 200 | +| Sign | Description | Priority | +|------------------------|-------------------------------------|----------| +| `vimspectorBP` | Line breakpoint | 9 | +| `vimspectorBPCond` | Conditional line breakpoint | 9 | +| `vimspectorBPDisabled` | Disabled breakpoint | 9 | +| `vimspectorPC` | Program counter (i.e. current line) | 200 | +| `vimspectorPCBP` | Program counter and breakpoint | 200 | The default symbols are the equivalent of something like the following: ```viml -sign define vimspectorBP text=\ ● texthl=WarningMsg -sign define vimspectorBPCond text=\ ◆ texthl=WarningMsg -sign define vimspectorBPDisabled text=\ ● texthl=LineNr -sign define vimspectorPC text=\ ▶ texthl=MatchParen linehl=CursorLine -sign define vimspectorPCBP text=●▶ texthl=MatchParen linehl=CursorLine -sign define vimspectorCurrentThread text=▶ texthl=MatchParen linehl=CursorLine -sign define vimspectorCurrentFrame text=▶ texthl=Special linehl=CursorLine +sign define vimspectorBP text=\ ● texthl=WarningMsg +sign define vimspectorBPCond text=\ ◆ texthl=WarningMsg +sign define vimspectorBPDisabled text=\ ● texthl=LineNr +sign define vimspectorPC text=\ ▶ texthl=MatchParen linehl=CursorLine +sign define vimspectorPCBP text=●▶ texthl=MatchParen linehl=CursorLine ``` If the signs don't display properly, your font probably doesn't contain these @@ -1766,13 +1789,11 @@ glyphs. You can easily change them by defining the sign in your vimrc. For example, you could put this in your `vimrc` to use some simple ASCII symbols: ```viml -sign define vimspectorBP text=o texthl=WarningMsg -sign define vimspectorBPCond text=o? texthl=WarningMsg -sign define vimspectorBPDisabled text=o! texthl=LineNr -sign define vimspectorPC text=\ > texthl=MatchParen -sign define vimspectorPCBP text=o> texthl=MatchParen -sign define vimspectorCurrentThread text=> texthl=MatchParen -sign define vimspectorCurrentFrame text=> texthl=Special +sign define vimspectorBP text=o texthl=WarningMsg +sign define vimspectorBPCond text=o? texthl=WarningMsg +sign define vimspectorBPDisabled text=o! texthl=LineNr +sign define vimspectorPC text=\ > texthl=MatchParen +sign define vimspectorPCBP text=o> texthl=MatchParen ``` ## Sign priority @@ -2049,10 +2070,6 @@ hi link jsonComment Comment Debug adapters (for some reason) send telemetry data to clients. Vimspector simply displays this information in the output window. It *does not* and *will not ever* collect, use, forward or otherwise share any data with any third parties. -10. Do I _have_ to put a `.vimspector.json` in the root of every project? No, you - can put all of your adapter and debug configs in a [single directory](https://puremourning.github.io/vimspector/configuration.html#debug-configurations) if you want to, but note - the caveat that `${workspaceRoot}` won't be calculated correctly in that case. - The vimsepctor author uses this [a lot](https://github.com/puremourning/.vim-mac/tree/master/vimspector-conf). [ycmd]: https://github.com/Valloric/ycmd diff --git a/autoload/vimspector.vim b/autoload/vimspector.vim index 78c7c1b..a0b6c42 100644 --- a/autoload/vimspector.vim +++ b/autoload/vimspector.vim @@ -13,9 +13,6 @@ " See the License for the specific language governing permissions and " limitations under the License. -if !has( 'python3' ) - finish -endif " Boilerplate {{{ let s:save_cpo = &cpoptions @@ -557,14 +554,6 @@ function! vimspector#ShowEvalBalloon( is_visual ) abort \ . '", 0 )' ) endfunction -function! vimspector#PrintDebugInfo() abort - if !s:Enabled() - return - endif - - py3 _vimspector_session.PrintDebugInfo() -endfunction - " Boilerplate {{{ let &cpoptions=s:save_cpo diff --git a/autoload/vimspector/internal/channel.vim b/autoload/vimspector/internal/channel.vim index e033cff..60eddf4 100644 --- a/autoload/vimspector/internal/channel.vim +++ b/autoload/vimspector/internal/channel.vim @@ -19,30 +19,36 @@ let s:save_cpo = &cpoptions set cpoptions&vim " }}} -function! s:_OnServerData( channel, data ) abort - if !exists( 's:ch' ) || s:ch isnot a:channel +let s:channels = {} +let s:jobs = {} + +function! s:_OnServerData( session_id, channel, data ) abort + if !has_key( s:channels, a:session_id ) || + \ s:channels[ a:session_id ] isnot a:channel return endif - py3 << EOF -_vimspector_session.OnChannelData( vim.eval( 'a:data' ) ) -EOF + py3 _VimspectorSession( vim.eval( 'a:session_id' ) ).OnChannelData( + \ vim.eval( 'a:data' ) ) endfunction -function! s:_OnClose( channel ) abort - if !exists( 's:ch' ) || s:ch isnot a:channel +function! s:_OnClose( session_id, channel ) abort + if !has_key( s:channels, a:session_id ) || + \ s:channels[ a:session_id ] isnot a:channel return endif echom 'Channel closed' redraw - unlet s:ch - py3 _vimspector_session.OnServerExit( 0 ) + unlet s:channels[ a:session_id ] + py3 _VimspectorSession( vim.eval( 'a:session_id' ) ).OnServerExit( 0 ) endfunction -function! vimspector#internal#channel#StartDebugSession( config ) abort +function! vimspector#internal#channel#StartDebugSession( + \ session_id, + \ config ) abort - if exists( 's:ch' ) + if has_key( s:channels, a:session_id ) echo 'Channel is already running' return v:false endif @@ -50,7 +56,7 @@ function! vimspector#internal#channel#StartDebugSession( config ) abort " If we _also_ have a command line, then start the actual job. This allows for " servers which start up and listen on some port if has_key( a:config, 'command' ) - let s:job = job_start( a:config[ 'command' ], + let s:jobs[ a:session_id ] = job_start( a:config[ 'command' ], \ { \ 'in_mode': 'raw', \ 'out_mode': 'raw', @@ -65,16 +71,19 @@ function! vimspector#internal#channel#StartDebugSession( config ) abort let l:addr = get( a:config, 'host', '127.0.0.1' ) . ':' . a:config[ 'port' ] echo 'Connecting to ' . l:addr . '... (waiting fo up to 10 seconds)' - let s:ch = ch_open( l:addr, + " FIXME: This _always_ waits 10s; the neochannel version is quicker + let s:channels[ a:session_id ] = ch_open( l:addr, \ { \ 'mode': 'raw', - \ 'callback': funcref( 's:_OnServerData' ), - \ 'close_cb': funcref( 's:_OnClose' ), + \ 'callback': funcref( 's:_OnServerData', + \ [ a:session_id ] ), + \ 'close_cb': funcref( 's:_OnClose', + \ [ a:session_id ] ), \ 'waittime': 10000, \ } \ ) - if ch_status( s:ch ) !=# 'open' + if ch_status( s:channels[ a:session_id ] ) !=# 'open' echom 'Unable to connect to' l:addr redraw return v:false @@ -83,62 +92,67 @@ function! vimspector#internal#channel#StartDebugSession( config ) abort return v:true endfunction -function! vimspector#internal#channel#Send( msg ) abort - call ch_sendraw( s:ch, a:msg ) +function! vimspector#internal#channel#Send( session_id, msg ) abort + call ch_sendraw( s:channels[ a:session_id ], a:msg ) return 1 endfunction -function! vimspector#internal#channel#Timeout( id ) abort - py3 << EOF -_vimspector_session.OnRequestTimeout( vim.eval( 'a:id' ) ) -EOF +function! vimspector#internal#channel#Timeout( session_id, id ) abort + py3 _VimspectorSession( vim.eval( 'a:session_id' ) ).OnRequestTimeout( + \ vim.eval( 'a:id' ) ) endfunction -function! vimspector#internal#channel#StopDebugSession() abort +function! s:_ChannelExists( session_id ) abort + return has_key( s:channels, a:session_id ) && + \ count( [ 'closed', 'fail' ], + \ ch_status( s:channels[ a:session_id ] ) ) == 0 +endfunction - if exists( 's:job' ) +function! vimspector#internal#channel#StopDebugSession( session_id ) abort + + if has_key( s:jobs, a:session_id ) " We started the job, so we need to kill it and wait to read all the data " from the socket - if job_status( s:job ) ==# 'run' - call job_stop( s:job, 'term' ) + let job = s:jobs[ a:session_id ] + if job_status( job ) ==# 'run' + call job_stop( job, 'term' ) endif - while job_status( s:job ) ==# 'run' - call job_stop( s:job, 'kill' ) + while job_status( job ) ==# 'run' + call job_stop( job, 'kill' ) endwhile - unlet s:job + call remove( s:jobs, a:session_id ) - if exists( 's:ch' ) && count( [ 'closed', 'fail' ], ch_status( s:ch ) ) == 0 + if s:_ChannelExists( a:session_id ) " We're going to block on this channel reading, then manually call the " close callback, so remove the automatic close callback to avoid tricky " re-entrancy - call ch_setoptions( s:ch, { 'close_cb': '' } ) + call ch_setoptions( s:channels[ a:session_id ], { 'close_cb': '' } ) endif - - elseif exists( 's:ch' ) && - \ count( [ 'closed', 'fail' ], ch_status( s:ch ) ) == 0 - + elseif s:_ChannelExists( a:session_id ) " channel is open, close it and trigger the callback. The callback is _not_ " triggered when manually calling ch_close. if we get here and the channel " is not open, then we there is a _OnClose callback waiting for us, so do " nothing. - call ch_close( s:ch ) + call ch_close( s:channels[ a:session_id ] ) endif " block until we've read all data from the socket and handled it. - while count( [ 'open', 'buffered' ], ch_status( s:ch ) ) == 1 - let data = ch_read( s:ch, { 'timeout': 10 } ) - call s:_OnServerData( s:ch, data ) + while has_key( s:channels, a:session_id ) && + \ count( [ 'open', 'buffered' ], + \ ch_status( s:channels[ a:session_id ] ) ) == 1 + let data = ch_read( s:channels[ a:session_id ], { 'timeout': 10 } ) + call s:_OnServerData( s:channels[ a:session_id ], data ) endwhile - call s:_OnClose( s:ch ) + if has_key( s:channels, a:session_id ) + call s:_OnClose( a:session_id, s:channels[ a:session_id ] ) + endif endfunction -function! vimspector#internal#channel#Reset() abort - if exists( 's:ch' ) || exists( 's:job' ) - call vimspector#internal#channel#StopDebugSession() - endif +function! vimspector#internal#channel#Reset( session_id ) abort + call vimspector#internal#channel#StopDebugSession( a:session_id ) endfunction " Boilerplate {{{ diff --git a/autoload/vimspector/internal/job.vim b/autoload/vimspector/internal/job.vim index 206baf0..413abb8 100644 --- a/autoload/vimspector/internal/job.vim +++ b/autoload/vimspector/internal/job.vim @@ -19,44 +19,54 @@ let s:save_cpo = &cpoptions set cpoptions&vim " }}} -function! s:_OnServerData( channel, data ) abort - if !exists( 's:job' ) || ch_getjob( a:channel ) isnot s:job +let s:jobs = {} +let s:commands = {} + +function! s:_OnServerData( session_id, channel, data ) abort + if !has_key( s:jobs, a:session_id ) || + \ ch_getjob( a:channel ) isnot s:jobs[ a:session_id ] call ch_log( 'Get data after process exit' ) return endif - py3 _vimspector_session.OnChannelData( vim.eval( 'a:data' ) ) + py3 _VimspectorSession( vim.eval( 'a:session_id' ) ).OnChannelData( + \ vim.eval( 'a:data' ) ) endfunction -function! s:_OnServerError( channel, data ) abort - if !exists( 's:job' ) || ch_getjob( a:channel ) isnot s:job +function! s:_OnServerError( session_id, channel, data ) abort + if !has_key( s:jobs, a:session_id ) || + \ ch_getjob( a:channel ) isnot s:jobs[ a:session_id ] call ch_log( 'Get data after process exit' ) return endif - py3 _vimspector_session.OnServerStderr( vim.eval( 'a:data' ) ) + py3 _VimspectorSession( vim.eval( 'a:session_id' ) ).OnServerStderr( + \ vim.eval( 'a:data' ) ) endfunction " FIXME: We should wait until both the exit_cb _and_ the channel closed callback " have been received before OnServerExit? -function! s:_OnExit( channel, status ) abort - if !exists( 's:job' ) || ch_getjob( a:channel ) isnot s:job +function! s:_OnExit( session_id, channel, status ) abort + if !has_key( s:jobs, a:session_id ) || + \ ch_getjob( a:channel ) isnot s:jobs[ a:session_id ] call ch_log( 'Unexpected exit callback' ) return endif echom 'Channel exit with status ' . a:status redraw - if exists( 's:job' ) - unlet s:job + if has_key( s:jobs, a:session_id ) + unlet s:jobs[ a:session_id ] endif - py3 _vimspector_session.OnServerExit( vim.eval( 'a:status' ) ) + py3 _VimspectorSession( vim.eval( 'a:session_id' ) ).OnServerExit( + \ vim.eval( 'a:status' ) ) endfunction -function! s:_OnClose( channel ) abort - if !exists( 's:job' ) || job_getchannel( s:job ) != a:channel +function! s:_OnClose( session_id, channel ) abort + if !has_key( s:jobs, a:session_id ) || + \ ch_getjob( a:channel ) isnot s:jobs[ a:session_id ] call ch_log( 'Channel closed after exit' ) return endif @@ -65,34 +75,38 @@ function! s:_OnClose( channel ) abort redraw endfunction -function! vimspector#internal#job#StartDebugSession( config ) abort - if exists( 's:job' ) +function! vimspector#internal#job#StartDebugSession( session_id, config ) abort + if has_key( s:jobs, a:session_id ) echom 'Not starting: Job is already running' redraw return v:false endif - let s:job = job_start( a:config[ 'command' ], + let s:jobs[ a:session_id ] = job_start( a:config[ 'command' ], \ { \ 'in_mode': 'raw', \ 'out_mode': 'raw', \ 'err_mode': 'raw', - \ 'exit_cb': funcref( 's:_OnExit' ), - \ 'close_cb': funcref( 's:_OnClose' ), - \ 'out_cb': funcref( 's:_OnServerData' ), - \ 'err_cb': funcref( 's:_OnServerError' ), + \ 'exit_cb': funcref( 's:_OnExit', + \ [ a:session_id ] ), + \ 'close_cb': funcref( 's:_OnClose', + \ [ a:session_id ] ), + \ 'out_cb': funcref( 's:_OnServerData', + \ [ a:session_id ] ), + \ 'err_cb': funcref( 's:_OnServerError', + \ [ a:session_id ] ), \ 'stoponexit': 'term', \ 'env': a:config[ 'env' ], \ 'cwd': a:config[ 'cwd' ], \ } \ ) - if !exists( 's:job' ) + if !has_key( s:jobs, a:session_id ) " The job died immediately after starting and we cleaned up return v:false endif - let status = job_status( s:job ) + let status = job_status( s:jobs[ a:session_id ] ) echom 'Started job, status is: ' . status redraw @@ -104,20 +118,22 @@ function! vimspector#internal#job#StartDebugSession( config ) abort return v:true endfunction -function! vimspector#internal#job#Send( msg ) abort - if ! exists( 's:job' ) +function! vimspector#internal#job#Send( session_id, msg ) abort + if ! has_key( s:jobs, a:session_id ) echom "Can't send message: Job was not initialised correctly" redraw return 0 endif - if job_status( s:job ) !=# 'run' + let job = s:jobs[ a:session_id ] + + if job_status( job ) !=# 'run' echom "Can't send message: Job is not running" redraw return 0 endif - let ch = job_getchannel( s:job ) + let ch = job_getchannel( job ) if ch ==# 'channel fail' echom 'Channel was closed unexpectedly!' redraw @@ -128,45 +144,55 @@ function! vimspector#internal#job#Send( msg ) abort return 1 endfunction -function! vimspector#internal#job#StopDebugSession() abort - if !exists( 's:job' ) +function! vimspector#internal#job#StopDebugSession( session_id ) abort + if ! has_key( s:jobs, a:session_id ) echom "Not stopping session: Job doesn't exist" redraw return endif - if job_status( s:job ) ==# 'run' + let job = s:jobs[ a:session_id ] + + if job_status( job ) ==# 'run' echom 'Terminating job' redraw - call job_stop( s:job, 'kill' ) + call job_stop( job, 'kill' ) endif endfunction -function! vimspector#internal#job#Reset() abort - call vimspector#internal#job#StopDebugSession() +function! vimspector#internal#job#Reset( session_id ) abort + call vimspector#internal#job#StopDebugSession( a:session_id ) endfunction -function! s:_OnCommandExit( category, ch, code ) abort +function! s:_OnCommandExit( session_id, category, ch, code ) abort py3 __import__( "vimspector", \ fromlist = [ "utils" ] ).utils.OnCommandWithLogComplete( + \ vim.eval( 'a:session_id' ), \ vim.eval( 'a:category' ), \ int( vim.eval( 'a:code' ) ) ) endfunction -function! vimspector#internal#job#StartCommandWithLog( cmd, category ) abort +function! vimspector#internal#job#StartCommandWithLog( + \ session_id, + \ cmd, + \ category ) abort if ! exists( 's:commands' ) let s:commands = {} endif - if ! has_key( s:commands, a:category ) - let s:commands[ a:category ] = [] + if ! has_key( s:commands, a:session_id ) + let s:commands[ a:session_id ] = {} endif - let l:index = len( s:commands[ a:category ] ) + if ! has_key( s:commands[ a:session_id ], a:category ) + let s:commands[ a:session_id ][ a:category ] = [] + endif - let buf = '_vimspector_log_' . a:category + let l:index = len( s:commands[ a:session_id ][ a:category ] ) - call add( s:commands[ a:category ], job_start( + let buf = '_vimspector_log_' . a:session_id . '_' . a:category + + call add( s:commands[ a:session_id ][ a:category ], job_start( \ a:cmd, \ { \ 'out_io': 'buffer', @@ -175,13 +201,14 @@ function! vimspector#internal#job#StartCommandWithLog( cmd, category ) abort \ 'err_msg': 0, \ 'out_name': buf, \ 'err_name': buf, - \ 'exit_cb': funcref( 's:_OnCommandExit', [ a:category ] ), + \ 'exit_cb': funcref( 's:_OnCommandExit', + \ [ a:session_id, a:category ] ), \ 'out_modifiable': 0, \ 'err_modifiable': 0, \ 'stoponexit': 'kill' \ } ) ) - if job_status( s:commands[ a:category ][ index ] ) !=# 'run' + if job_status( s:commands[ a:session_id ][ a:category ][ index ] ) !=# 'run' echom 'Unable to start job for ' . string( a:cmd ) redraw return v:none @@ -191,19 +218,27 @@ function! vimspector#internal#job#StartCommandWithLog( cmd, category ) abort endfunction -function! vimspector#internal#job#CleanUpCommand( category ) abort +function! vimspector#internal#job#CleanUpCommand( session_id, category ) abort if ! exists( 's:commands' ) let s:commands = {} endif - if ! has_key( s:commands, a:category ) + if ! has_key( s:commands, a:session_id ) + let s:commands[ a:session_id ] = {} + endif + + if ! has_key( s:commands[ a:session_id ], a:category ) return endif - for j in s:commands[ a:category ] + for j in s:commands[ a:session_id ][ a:category ] call job_stop( j, 'kill' ) endfor - unlet s:commands[ a:category ] + unlet s:commands[ a:session_id ][ a:category ] + + if len( s:commands[ a:session_id ] ) == 0 + unlet s:commands[ a:session_id ] + endif endfunction " Boilerplate {{{ diff --git a/autoload/vimspector/internal/neochannel.vim b/autoload/vimspector/internal/neochannel.vim index f20684d..3a6fe0e 100644 --- a/autoload/vimspector/internal/neochannel.vim +++ b/autoload/vimspector/internal/neochannel.vim @@ -20,28 +20,34 @@ set cpoptions&vim " }}} +let s:channels = {} +let s:jobs = {} -function! s:_OnEvent( chan_id, data, event ) abort + +function! s:_OnEvent( session_id, chan_id, data, event ) abort if v:exiting isnot# v:null return endif - if !exists( 's:ch' ) || a:chan_id != s:ch + if !has_key( s:channels, a:session_id ) || + \ a:chan_id != s:channels[ a:session_id ] return endif if a:data == [''] echom 'Channel closed' redraw - unlet s:ch + unlet s:channels[ a:session_id ] py3 _vimspector_session.OnServerExit( 0 ) else py3 _vimspector_session.OnChannelData( '\n'.join( vim.eval( 'a:data' ) ) ) endif endfunction -function! vimspector#internal#neochannel#StartDebugSession( config ) abort - if exists( 's:ch' ) +function! vimspector#internal#neochannel#StartDebugSession( + \ session_id, + \ config ) abort + if has_key( s:channels, a:session_id ) echom 'Not starting: Channel is already running' redraw return v:false @@ -54,12 +60,12 @@ function! vimspector#internal#neochannel#StartDebugSession( config ) abort try let old_env = vimspector#internal#neoterm#PrepareEnvironment( \ a:config[ 'env' ] ) - let s:job = jobstart( a:config[ 'command' ], - \ { - \ 'cwd': a:config[ 'cwd' ], - \ 'env': a:config[ 'env' ], - \ } - \ ) + let s:jobs[ a:session_id ] = jobstart( a:config[ 'command' ], + \ { + \ 'cwd': a:config[ 'cwd' ], + \ 'env': a:config[ 'env' ], + \ } + \ ) finally call vimspector#internal#neoterm#ResetEnvironment( a:config[ 'env' ], \ old_env ) @@ -72,9 +78,10 @@ function! vimspector#internal#neochannel#StartDebugSession( config ) abort while attempt <= 10 echo 'Connecting to ' . l:addr . '... (attempt' attempt 'of 10)' try - let s:ch = sockconnect( 'tcp', - \ addr, - \ { 'on_data': funcref( 's:_OnEvent' ) } ) + let s:channels[ a:session_id ] = sockconnect( + \ 'tcp', + \ addr, + \ { 'on_data': funcref( 's:_OnEvent', [ a:session_id ] ) } ) redraw return v:true catch /connection refused/ @@ -88,30 +95,30 @@ function! vimspector#internal#neochannel#StartDebugSession( config ) abort return v:false endfunction -function! vimspector#internal#neochannel#Send( msg ) abort - if ! exists( 's:ch' ) +function! vimspector#internal#neochannel#Send( session_id, msg ) abort + if ! has_key( s:channels, a:session_id ) echom "Can't send message: Channel was not initialised correctly" redraw return 0 endif - call chansend( s:ch, a:msg ) + call chansend( s:channels[ a:session_id ], a:msg ) return 1 endfunction -function! vimspector#internal#neochannel#StopDebugSession() abort - if exists( 's:ch' ) - call chanclose( s:ch ) +function! vimspector#internal#neochannel#StopDebugSession( session_id ) abort + if has_key( s:channels, a:session_id ) + call chanclose( s:channels[ a:session_id ] ) " It doesn't look like we get a callback after chanclos. Who knows if we " will subsequently receive data callbacks. - call s:_OnEvent( s:ch, [ '' ], 'data' ) + call s:_OnEvent( a:session_id, s:channels[ a:session_id ], [ '' ], 'data' ) endif - if exists( 's:job' ) - if vimspector#internal#neojob#JobIsRunning( s:job ) - call jobstop( s:job ) + if has_key( s:jobs, a:session_id ) + if vimspector#internal#neojob#JobIsRunning( s:jobs[ a:session_id ] ) + call jobstop( s:jobs[ a:session_id ] ) endif - unlet s:job + unlet s:jobs[ a:session_id ] endif endfunction diff --git a/autoload/vimspector/internal/neojob.vim b/autoload/vimspector/internal/neojob.vim index a398afe..73a7984 100644 --- a/autoload/vimspector/internal/neojob.vim +++ b/autoload/vimspector/internal/neojob.vim @@ -19,14 +19,17 @@ let s:save_cpo = &cpoptions set cpoptions&vim " }}} +let s:jobs = {} +let s:commands = {} -function! s:_OnEvent( chan_id, data, event ) abort + +function! s:_OnEvent( session_id, chan_id, data, event ) abort if v:exiting isnot# v:null return endif - if !exists( 's:job' ) || a:chan_id != s:job + if !has_key( s:jobs, a:session_id ) || a:chan_id != s:jobs[ a:session_id ] return endif @@ -38,13 +41,15 @@ function! s:_OnEvent( chan_id, data, event ) abort elseif a:event ==# 'exit' echom 'Channel exit with status ' . a:data redraw - unlet s:job + unlet s:jobs[ a:session_id ] py3 _vimspector_session.OnServerExit( vim.eval( 'a:data' ) ) endif endfunction -function! vimspector#internal#neojob#StartDebugSession( config ) abort - if exists( 's:job' ) +function! vimspector#internal#neojob#StartDebugSession( + \ session_id, + \ config ) abort + if has_key( s:jobs, a:session_id ) echom 'Not starging: Job is already running' redraw return v:false @@ -57,11 +62,14 @@ function! vimspector#internal#neojob#StartDebugSession( config ) abort try let old_env = vimspector#internal#neoterm#PrepareEnvironment( \ a:config[ 'env' ] ) - let s:job = jobstart( a:config[ 'command' ], + let s:jobs[ a:session_id ] = jobstart( a:config[ 'command' ], \ { - \ 'on_stdout': funcref( 's:_OnEvent' ), - \ 'on_stderr': funcref( 's:_OnEvent' ), - \ 'on_exit': funcref( 's:_OnEvent' ), + \ 'on_stdout': funcref( 's:_OnEvent', + \ [ a:session_id ] ), + \ 'on_stderr': funcref( 's:_OnEvent', + \ [ a:session_id ] ), + \ 'on_exit': funcref( 's:_OnEvent', + \ [ a:session_id ] ), \ 'cwd': a:config[ 'cwd' ], \ 'env': a:config[ 'env' ], \ } @@ -78,40 +86,40 @@ function! vimspector#internal#neojob#JobIsRunning( job ) abort return jobwait( [ a:job ], 0 )[ 0 ] == -1 endfunction -function! vimspector#internal#neojob#Send( msg ) abort - if ! exists( 's:job' ) +function! vimspector#internal#neojob#Send( session_id, msg ) abort + if ! has_key( s:jobs, a:session_id ) echom "Can't send message: Job was not initialised correctly" redraw return 0 endif - if !vimspector#internal#neojob#JobIsRunning( s:job ) + if !vimspector#internal#neojob#JobIsRunning( s:jobs[ a:session_id ] ) echom "Can't send message: Job is not running" redraw return 0 endif - call chansend( s:job, a:msg ) + call chansend( s:jobs[ a:session_id ], a:msg ) return 1 endfunction -function! vimspector#internal#neojob#StopDebugSession() abort - if !exists( 's:job' ) +function! vimspector#internal#neojob#StopDebugSession( session_id ) abort + if !has_key( s:jobs, a:session_id ) return endif - if vimspector#internal#neojob#JobIsRunning( s:job ) + if vimspector#internal#neojob#JobIsRunning( s:jobs[ a:session_id ] ) echom 'Terminating job' redraw - call jobstop( s:job ) + call jobstop( s:jobs[ a:session_id ] ) endif endfunction -function! vimspector#internal#neojob#Reset() abort - call vimspector#internal#neojob#StopDebugSession() +function! vimspector#internal#neojob#Reset( session_id ) abort + call vimspector#internal#neojob#StopDebugSession( a:session_id ) endfunction -function! s:_OnCommandEvent( category, id, data, event ) abort +function! s:_OnCommandEvent( session_id, category, id, data, event ) abort if v:exiting isnot# v:null return endif @@ -121,18 +129,22 @@ function! s:_OnCommandEvent( category, id, data, event ) abort return endif - if !has_key( s:commands, a:category ) + if ! has_key( s:commands, a:session_id ) return endif - if !has_key( s:commands[ a:category ], a:id ) + if !has_key( s:commands[ a:session_id ], a:category ) + return + endif + + if !has_key( s:commands[ a:session_id ][ a:category ], a:id ) return endif if a:event ==# 'stdout' - let buffer = s:commands[ a:category ][ a:id ].stdout + let buffer = s:commands[ a:session_id ][ a:category ][ a:id ].stdout elseif a:event ==# 'stderr' - let buffer = s:commands[ a:category ][ a:id ].stderr + let buffer = s:commands[ a:session_id ][ a:category ][ a:id ].stderr endif try @@ -159,21 +171,21 @@ function! s:_OnCommandEvent( category, id, data, event ) abort call setbufvar( buffer, '&modified', 0 ) endtry - " if the buffer is visible, scroll it, but don't allow autocommands to fire, - " as this may close the current window! + " if the buffer is visible, scroll it let w = bufwinnr( buffer ) if w > 0 let cw = winnr() try - noautocmd execute w . 'wincmd w' - noautocmd normal! Gz- + execute w . 'wincmd w' + normal! Gz- finally - noautocmd execute cw . 'wincmd w' + execute cw . 'wincmd w' endtry endif elseif a:event ==# 'exit' py3 __import__( "vimspector", \ fromlist = [ "utils" ] ).utils.OnCommandWithLogComplete( + \ vim.eval( 'a:session_id' ), \ vim.eval( 'a:category' ), \ int( vim.eval( 'a:data' ) ) ) endif @@ -199,11 +211,16 @@ function! s:MakeBufferWritable( buffer ) abort endfunction -let s:commands = {} +function! vimspector#internal#neojob#StartCommandWithLog( + \ session_id, + \ cmd, + \ category ) abort + if ! has_key( s:commands, a:session_id ) + let s:commands[ a:session_id ] = {} + endif -function! vimspector#internal#neojob#StartCommandWithLog( cmd, category ) abort - if ! has_key( s:commands, a:category ) - let s:commands[ a:category ] = {} + if ! has_key( s:commands[ a:session_id ], a:category ) + let s:commands[ a:session_id ][ a:category ] = {} endif let buf = bufnr( '_vimspector_log_' . a:category, v:true ) @@ -216,14 +233,14 @@ function! vimspector#internal#neojob#StartCommandWithLog( cmd, category ) abort let id = jobstart(a:cmd, \ { \ 'on_stdout': funcref( 's:_OnCommandEvent', - \ [ a:category ] ), + \ [ a:session_id, a:category ] ), \ 'on_stderr': funcref( 's:_OnCommandEvent', - \ [ a:category ] ), + \ [ a:session_id, a:category ] ), \ 'on_exit': funcref( 's:_OnCommandEvent', - \ [ a:category ] ), + \ [ a:session_id, a:category ] ), \ } ) - let s:commands[ a:category ][ id ] = { + let s:commands[ a:session_id ][ a:category ][ id ] = { \ 'stdout': buf, \ 'stderr': buf \ } @@ -231,19 +248,25 @@ function! vimspector#internal#neojob#StartCommandWithLog( cmd, category ) abort return buf endfunction -function! vimspector#internal#neojob#CleanUpCommand( category ) abort - if ! has_key( s:commands, a:category ) +function! vimspector#internal#neojob#CleanUpCommand( + \ session_id, + \ category ) abort + if ! has_key( s:commands, a:session_id ) return endif - for id in keys( s:commands[ a:category ] ) + if ! has_key( s:commands[ a:session_id ], a:category ) + return + endif + + for id in keys( s:commands[ a:session_id ][ a:category ] ) let id = str2nr( id ) if jobwait( [ id ], 0 )[ 0 ] == -1 call jobstop( id ) endif call jobwait( [ id ], -1 ) endfor - unlet! s:commands[ a:category ] + unlet! s:commands[ a:session_id ][ a:category ] endfunction " Boilerplate {{{ diff --git a/autoload/vimspector/internal/state.vim b/autoload/vimspector/internal/state.vim index f1e690a..59966dd 100644 --- a/autoload/vimspector/internal/state.vim +++ b/autoload/vimspector/internal/state.vim @@ -26,11 +26,22 @@ endif function! vimspector#internal#state#Reset() abort try - py3 import vim - py3 _vimspector_session = __import__( - \ "vimspector", - \ fromlist=[ "debug_session" ] ).debug_session.DebugSession( - \ vim.eval( 's:prefix' ) ) + py3 < 1.0, >= 1.0.2) i18n (>= 0.7, < 2) minitest (~> 5.1) tzinfo (~> 1.1) zeitwerk (~> 2.2, >= 2.2.2) - addressable (2.8.0) + addressable (2.7.0) public_suffix (>= 2.0.2, < 5.0) coffee-script (2.4.1) coffee-script-source @@ -16,7 +16,7 @@ GEM colorator (1.1.0) commonmarker (0.17.13) ruby-enum (~> 0.5) - concurrent-ruby (1.1.8) + concurrent-ruby (1.1.7) dnsruby (1.61.5) simpleidn (~> 0.1) em-websocket (0.5.2) @@ -30,12 +30,12 @@ GEM faraday-net_http (~> 1.0) multipart-post (>= 1.2, < 3) ruby2_keywords - faraday-net_http (1.0.1) - ffi (1.15.0) + faraday-net_http (1.0.0) + ffi (1.14.2) forwardable-extended (2.6.0) gemoji (3.0.1) - github-pages (214) - github-pages-health-check (= 1.17.0) + github-pages (209) + github-pages-health-check (= 1.16.1) jekyll (= 3.9.0) jekyll-avatar (= 0.7.0) jekyll-coffeescript (= 1.1.1) @@ -50,9 +50,9 @@ GEM jekyll-readme-index (= 0.3.0) jekyll-redirect-from (= 0.16.0) jekyll-relative-links (= 0.6.1) - jekyll-remote-theme (= 0.4.3) + jekyll-remote-theme (= 0.4.2) jekyll-sass-converter (= 1.5.2) - jekyll-seo-tag (= 2.7.1) + jekyll-seo-tag (= 2.6.1) jekyll-sitemap (= 1.4.0) jekyll-swiss (= 1.0.0) jekyll-theme-architect (= 0.1.1) @@ -70,19 +70,19 @@ GEM jekyll-theme-time-machine (= 0.1.1) jekyll-titles-from-headings (= 0.5.3) jemoji (= 0.12.0) - kramdown (= 2.3.1) + kramdown (= 2.3.0) kramdown-parser-gfm (= 1.1.0) liquid (= 4.0.3) mercenary (~> 0.3) minima (= 2.5.1) nokogiri (>= 1.10.4, < 2.0) - rouge (= 3.26.0) + rouge (= 3.23.0) terminal-table (~> 1.4) - github-pages-health-check (1.17.0) + github-pages-health-check (1.16.1) addressable (~> 2.3) dnsruby (~> 1.60) octokit (~> 4.0) - public_suffix (>= 2.0.2, < 5.0) + public_suffix (~> 3.0) typhoeus (~> 1.3) html-pipeline (2.14.0) activesupport (>= 2) @@ -136,15 +136,15 @@ GEM jekyll (>= 3.3, < 5.0) jekyll-relative-links (0.6.1) jekyll (>= 3.3, < 5.0) - jekyll-remote-theme (0.4.3) + jekyll-remote-theme (0.4.2) addressable (~> 2.0) jekyll (>= 3.5, < 5.0) jekyll-sass-converter (>= 1.0, <= 3.0.0, != 2.0.0) rubyzip (>= 1.3.0, < 3.0) jekyll-sass-converter (1.5.2) sass (~> 3.4) - jekyll-seo-tag (2.7.1) - jekyll (>= 3.8, < 5.0) + jekyll-seo-tag (2.6.1) + jekyll (>= 3.3, < 5.0) jekyll-sitemap (1.4.0) jekyll (>= 3.7, < 5.0) jekyll-swiss (1.0.0) @@ -196,23 +196,23 @@ GEM gemoji (~> 3.0) html-pipeline (~> 2.2) jekyll (>= 3.0, < 5.0) - kramdown (2.3.1) + kramdown (2.3.0) rexml kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) liquid (4.0.3) - listen (3.5.1) + listen (3.4.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) mercenary (0.3.6) - mini_portile2 (2.5.1) + mini_portile2 (2.5.0) minima (2.5.1) jekyll (>= 3.5, < 5.0) jekyll-feed (~> 0.9) jekyll-seo-tag (~> 2.1) - minitest (5.14.4) + minitest (5.14.3) multipart-post (2.1.1) - nokogiri (1.11.5) + nokogiri (1.11.1) mini_portile2 (~> 2.5.0) racc (~> 1.4) octokit (4.20.0) @@ -220,16 +220,16 @@ GEM sawyer (~> 0.8.0, >= 0.5.3) pathutil (0.16.2) forwardable-extended (~> 2.6) - public_suffix (4.0.6) + public_suffix (3.1.1) racc (1.5.2) rb-fsevent (0.10.4) rb-inotify (0.10.1) ffi (~> 1.0) - rexml (3.2.5) - rouge (3.26.0) - ruby-enum (0.9.0) + rexml (3.2.4) + rouge (3.23.0) + ruby-enum (0.8.0) i18n - ruby2_keywords (0.0.4) + ruby2_keywords (0.0.2) rubyzip (2.3.0) safe_yaml (1.0.5) sass (3.7.4) @@ -240,7 +240,7 @@ GEM sawyer (0.8.2) addressable (>= 2.3.5) faraday (> 0.8, < 2.0) - simpleidn (0.2.1) + simpleidn (0.1.1) unf (~> 0.1.4) terminal-table (1.8.0) unicode-display_width (~> 1.1, >= 1.1.1) diff --git a/docs/configuration.md b/docs/configuration.md index 3d524bf..e736985 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -271,7 +271,7 @@ JSON value `true`, and the suffix is stripped fom the key, resulting in the following: ```json - "stopOnEntry": true + "stopOnEntry#json": true ``` Which is what we need. @@ -722,7 +722,7 @@ Vimspector then orchestrates the various tools to set you up. "variables": { // Just an example of how to specify a variable manually rather than // vimspector asking for input from the user - "ServiceName": "${fileBasenameNoExtension}" + "ServiceName": "${fileBasenameNoExtention}" }, "adapter": "python-remote", diff --git a/plugin/vimspector.vim b/plugin/vimspector.vim index 2668bf1..676186f 100644 --- a/plugin/vimspector.vim +++ b/plugin/vimspector.vim @@ -13,13 +13,6 @@ " See the License for the specific language governing permissions and " limitations under the License. -if !has( 'python3' ) - echohl WarningMsg - echom 'Vimspector unavailable: Requires Vim compiled with +python3' - echohl None - finish -endif - " Boilerplate {{{ let s:save_cpo = &cpoptions set cpoptions&vim @@ -115,9 +108,6 @@ command! -bar -nargs=? -complete=custom,vimspector#CompleteOutput command! -bar \ VimspectorToggleLog \ call vimspector#ToggleLog() -command! -bar - \ VimspectorDebugInfo - \ call vimspector#PrintDebugInfo() command! -nargs=1 -complete=custom,vimspector#CompleteExpr \ VimspectorEval \ call vimspector#Evaluate( ) @@ -151,6 +141,7 @@ augroup END augroup Vimspector autocmd! autocmd BufNew * call vimspector#OnBufferCreated( expand( '' ) ) + autocmd TabEnter * call vimspector#internal#state#OnTabEnter() augroup END " boilerplate {{{ diff --git a/python3/vimspector/breakpoints.py b/python3/vimspector/breakpoints.py index 7aa50ce..a33c468 100644 --- a/python3/vimspector/breakpoints.py +++ b/python3/vimspector/breakpoints.py @@ -34,13 +34,24 @@ class ServerBreakpointHandler( object ): pass +# FIXME: THis really should be project scope and not associated with a debug +# session. Breakpoints set by the user should be independent and breakpoints for +# the current active session should be associated with the session when they are +# in use. +# +# Questions include: +# 1. what happens if we set/chnage a breakpiont in session #2 while session #1 +# is active ? Maybe we re-send the breakpoints to _all_ active sessions? +# +# More... class ProjectBreakpoints( object ): - def __init__( self ): + def __init__( self, session_id ): self._connection = None - self._logger = logging.getLogger( __name__ ) - utils.SetUpLogging( self._logger ) + self._logger = logging.getLogger( __name__ + '.' + str( session_id ) ) + utils.SetUpLogging( self._logger, session_id ) - # These are the user-entered breakpoints. + # These are the user-entered breakpoints. NOTE: if updating this, also + # update Copy() self._line_breakpoints = defaultdict( list ) self._func_breakpoints = [] self._exception_breakpoints = None @@ -91,6 +102,12 @@ class ProjectBreakpoints( object ): # FIXME: If the adapter type changes, we should probably forget this ? + def Copy( self, other: 'ProjectBreakpoints' ): + self._line_breakpoints = dict( other._line_breakpoints ) + self._func_breakpoints = list( other._func_breakpoints ) + if other._exception_breakpoints is not None: + self._exception_breakpoints = dict( other._exception_breakpoints ) + def BreakpointsAsQuickFix( self ): # FIXME: Handling of breakpoints is a mess, split between _codeView and this # object. This makes no sense and should be centralised so that we don't diff --git a/python3/vimspector/code.py b/python3/vimspector/code.py index 98aeca5..ffcf912 100644 --- a/python3/vimspector/code.py +++ b/python3/vimspector/code.py @@ -20,20 +20,20 @@ from collections import defaultdict from vimspector import utils, terminal, signs +NEXT_SIGN_ID = 1 + class CodeView( object ): - def __init__( self, window, api_prefix ): + def __init__( self, session_id, window, api_prefix ): self._window = window self._api_prefix = api_prefix self._terminal = None self.current_syntax = None - self._logger = logging.getLogger( __name__ ) + self._logger = logging.getLogger( __name__ + '.' + str( session_id ) ) utils.SetUpLogging( self._logger ) - # FIXME: This ID is by group, so should be module scope - self._next_sign_id = 1 self._breakpoints = defaultdict( list ) self._signs = { 'vimspectorPC': None, @@ -92,8 +92,9 @@ class CodeView( object ): self._UndisplayPC( clear_pc = False ) # FIXME: Do we relly need to keep using up IDs ? - self._signs[ 'vimspectorPC' ] = self._next_sign_id - self._next_sign_id += 1 + global NEXT_SIGN_ID + self._signs[ 'vimspectorPC' ] = NEXT_SIGN_ID + NEXT_SIGN_ID += 1 sign = 'vimspectorPC' # If there's also a breakpoint on this line, use vimspectorPCBP @@ -247,8 +248,9 @@ class CodeView( object ): if 'line' not in breakpoint: continue - sign_id = self._next_sign_id - self._next_sign_id += 1 + global NEXT_SIGN_ID + sign_id = NEXT_SIGN_ID + NEXT_SIGN_ID += 1 self._signs[ 'breakpoints' ].append( sign_id ) if utils.BufferExists( file_name ): signs.PlaceSign( sign_id, diff --git a/python3/vimspector/custom/python.py b/python3/vimspector/custom/python.py new file mode 100644 index 0000000..2283ee1 --- /dev/null +++ b/python3/vimspector/custom/python.py @@ -0,0 +1,77 @@ +# vimspector - A multi-language debugging system for Vim +# Copyright 2021 Ben Jackson +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from vimspector.debug_session import DebugSession +from vimspector import session_manager, gadgets, utils + +from typing import Sequence + + +class Debugpy( object ): + parent: DebugSession + sessions: Sequence[ DebugSession ] + + def __init__( self, debug_session: DebugSession ): + self.parent = debug_session + self.queue = [] + + def LaunchSubprocessDebugSession( self, result ): + launch_arguments = self.queue.pop( 0 ) + + if result == 1: + session = session_manager.Get().NewSession( self.parent._api_prefix ) + + # Inject the launch config (HACK!). This will actually mean that the + # configuration passed below is ignored. + session._launch_config = launch_arguments + + # FIXME: We probably do need to add a StartWithLauncArguments and somehow + # tell the new session that it shoud not support "Restart" requests ? + # + # In fact, what even would Reset do... ? + session._breakpoints.Copy( self.parent._breakpoints ) + session._StartWithConfiguration( { 'configuration': launch_arguments }, + launch_arguments[ 'connect' ] ) + + self.HandleNext() + + + def OnEvent_debugpyAttach( self, message ): + # Debugpy sends us the contents of a launch request that we should use. We + # probaly just jave to guess the rest + launch_arguments = message[ 'body' ] + self.queue.append( launch_arguments ) + + # We use a queue because the confirm mechanism is quasi-modal and we can't + # do multiple 'confirm' dialogs at once. It's not uncommon for + # multiprocessing to create multiple subprocesses all at the same time. + if len( self.queue ) == 1: + self.HandleNext() + + def HandleNext( self ): + if not self.queue: + return + + launch_argyments = self.queue[ 0 ] + pid = launch_argyments[ 'subProcessId' ] + + utils.Confirm( + self.parent._api_prefix, + f"Subprocess {pid} was launched.\nAttach to it in a new tab?", + self.LaunchSubprocessDebugSession, + default_value = 1, + options = [ 'Yes', 'No' ], + keys = [ 'y', 'n' ] ) + diff --git a/python3/vimspector/debug_adapter_connection.py b/python3/vimspector/debug_adapter_connection.py index 206938a..edebf68 100644 --- a/python3/vimspector/debug_adapter_connection.py +++ b/python3/vimspector/debug_adapter_connection.py @@ -29,14 +29,15 @@ class PendingRequest( object ): class DebugAdapterConnection( object ): - def __init__( self, handlers, send_func ): - self._logger = logging.getLogger( __name__ ) - utils.SetUpLogging( self._logger ) + def __init__( self, handlers, session_id, send_func ): + self._logger = logging.getLogger( __name__ + '.' + str( session_id ) ) + utils.SetUpLogging( self._logger, session_id ) self._Write = send_func self._SetState( 'READ_HEADER' ) self._buffer = bytes() self._handlers = handlers + self._session_id = session_id self._next_message_id = 0 self._outstanding_requests = {} @@ -51,10 +52,12 @@ class DebugAdapterConnection( object ): msg[ 'seq' ] = this_id msg[ 'type' ] = 'request' - # TODO/FIXME: This is so messy expiry_id = vim.eval( - 'timer_start( {}, "vimspector#internal#channel#Timeout" )'.format( - timeout ) ) + 'timer_start( {}, ' + ' function( "vimspector#internal#channel#Timeout", ' + ' [ {} ] ) )'.format( + timeout, + self._session_id ) ) request = PendingRequest( msg, handler, @@ -226,12 +229,7 @@ class DebugAdapterConnection( object ): # self._logger.debug( 'Message received (raw): %s', payload ) - try: - message = json.loads( payload, strict = False ) - except Exception: - self._logger.exception( "Invalid message received: %s", payload ) - self._SetState( 'READ_HEADER' ) - raise + message = json.loads( payload ) self._logger.debug( 'Message received: {0}'.format( message ) ) diff --git a/python3/vimspector/debug_session.py b/python3/vimspector/debug_session.py index 36ad62b..82eb70e 100644 --- a/python3/vimspector/debug_session.py +++ b/python3/vimspector/debug_session.py @@ -42,15 +42,17 @@ VIMSPECTOR_HOME = utils.GetVimspectorBase() # cache of what the user entered for any option we ask them USER_CHOICES = {} - class DebugSession( object ): - def __init__( self, api_prefix ): - self._logger = logging.getLogger( __name__ ) - utils.SetUpLogging( self._logger ) + def __init__( self, session_id, session_manager, api_prefix ): + self.session_id = session_id + self.manager = session_manager + self._logger = logging.getLogger( __name__ + '.' + str( session_id ) ) + utils.SetUpLogging( self._logger, session_id ) self._api_prefix = api_prefix - self._logger.info( "**** INITIALISING NEW VIMSPECTOR SESSION ****" ) + self._logger.info( "**** INITIALISING NEW VIMSPECTOR SESSION FOR ID " + f"{session_id } ****" ) self._logger.info( "API is: {}".format( api_prefix ) ) self._logger.info( 'VIMSPECTOR_HOME = %s', VIMSPECTOR_HOME ) self._logger.info( 'gadgetDir = %s', @@ -61,7 +63,7 @@ class DebugSession( object ): self._stackTraceView = None self._variablesView = None self._outputView = None - self._breakpoints = breakpoints.ProjectBreakpoints() + self._breakpoints = breakpoints.ProjectBreakpoints( session_id ) self._splash_screen = None self._remote_term = None @@ -73,6 +75,11 @@ class DebugSession( object ): self._ResetServerState() + + def __del__( self ): + self.manager.DestroySession( self ) + + def _ResetServerState( self ): self._connection = None self._init_complete = False @@ -408,7 +415,13 @@ class DebugSession( object ): if self._uiTab: self._logger.debug( "Clearing down UI" ) - del vim.vars[ 'vimspector_session_windows' ] + try: + # FIXME: vimspector_session_windows is totally buseted with multiple + # sessions + del vim.vars[ 'vimspector_session_windows' ] + except KeyError: + pass + vim.current.tabpage = self._uiTab self._splash_screen = utils.HideSplash( self._api_prefix, @@ -667,6 +680,15 @@ class DebugSession( object ): def _SetUpUI( self ): vim.command( 'tab split' ) + + # Switch to this session now that we've made it visible. Note that the + # TabEnter autocmd does trigger when the above is run, but that's before the + # following line assigns the tab to this session, so when we try to find + # this session by tab number, it's not found. So we have to manually switch + # to it when creating a new tab. + utils.Call( 'vimspector#internal#state#SwitchToSession', + self.session_id ) + self._uiTab = vim.current.tabpage mode = settings.Get( 'ui_mode' ) @@ -710,7 +732,9 @@ class DebugSession( object ): def _SetUpUIHorizontal( self ): # Code window code_window = vim.current.window - self._codeView = code.CodeView( code_window, self._api_prefix ) + self._codeView = code.CodeView( self.session_id, + code_window, + self._api_prefix ) # Call stack vim.command( @@ -735,7 +759,8 @@ class DebugSession( object ): with utils.LetCurrentWindow( stack_trace_window ): vim.command( f'{ one_third }wincmd _' ) - self._variablesView = variables.VariablesView( vars_window, + self._variablesView = variables.VariablesView( self, + vars_window, watch_window ) # Output/logging @@ -743,7 +768,8 @@ class DebugSession( object ): vim.command( f'rightbelow { settings.Int( "bottombar_height" ) }new' ) output_window = vim.current.window self._outputView = output.DAPOutputView( output_window, - self._api_prefix ) + self._api_prefix, + session_id = self.session_id ) # TODO: If/when we support multiple sessions, we'll need some way to # indicate which tab was created and store all the tabs @@ -766,7 +792,9 @@ class DebugSession( object ): def _SetUpUIVertical( self ): # Code window code_window = vim.current.window - self._codeView = code.CodeView( code_window, self._api_prefix ) + self._codeView = code.CodeView( self.session_id, + code_window, + self._api_prefix ) # Call stack vim.command( @@ -793,7 +821,8 @@ class DebugSession( object ): with utils.LetCurrentWindow( stack_trace_window ): vim.command( f'{ one_third }wincmd |' ) - self._variablesView = variables.VariablesView( vars_window, + self._variablesView = variables.VariablesView( self, + vars_window, watch_window ) @@ -802,7 +831,8 @@ class DebugSession( object ): vim.command( f'rightbelow { settings.Int( "bottombar_height" ) }new' ) output_window = vim.current.window self._outputView = output.DAPOutputView( output_window, - self._api_prefix ) + self._api_prefix, + session_id = self.session_id ) # TODO: If/when we support multiple sessions, we'll need some way to # indicate which tab was created and store all the tabs @@ -887,8 +917,10 @@ class DebugSession( object ): vim.vars[ '_vimspector_adapter_spec' ] = self._adapter if not vim.eval( "vimspector#internal#{}#StartDebugSession( " + " {}," " g:_vimspector_adapter_spec " - ")".format( self._connection_type ) ): + ")".format( self._connection_type, + self.session_id ) ): self._logger.error( "Unable to start debug server" ) self._splash_screen = utils.DisplaySplash( self._api_prefix, self._splash_screen, @@ -908,9 +940,11 @@ class DebugSession( object ): handlers = [ self ] self._connection = debug_adapter_connection.DebugAdapterConnection( - handlers, - lambda msg: utils.Call( + handlers = handlers, + session_id = self.session_id, + send_func = lambda msg: utils.Call( "vimspector#internal#{}#Send".format( self._connection_type ), + self.session_id, msg ) ) self._logger.info( 'Debug Adapter Started' ) @@ -933,8 +967,9 @@ class DebugSession( object ): assert not self._run_on_server_exit self._run_on_server_exit = callback - vim.eval( 'vimspector#internal#{}#StopDebugSession()'.format( - self._connection_type ) ) + vim.eval( 'vimspector#internal#{}#StopDebugSession( {} )'.format( + self._connection_type, + self.session_id ) ) self._connection.DoRequest( handler, { 'command': 'disconnect', @@ -1179,9 +1214,10 @@ class DebugSession( object ): self._on_init_complete_handlers = [] self._logger.debug( "LAUNCH!" ) - self._launch_config = {} - self._launch_config.update( self._adapter.get( 'configuration', {} ) ) - self._launch_config.update( self._configuration[ 'configuration' ] ) + if self._launch_config is None: + self._launch_config = {} + self._launch_config.update( self._adapter.get( 'configuration', {} ) ) + self._launch_config.update( self._configuration[ 'configuration' ] ) request = self._configuration.get( 'remote-request', @@ -1270,37 +1306,6 @@ class DebugSession( object ): self._stackTraceView.LoadThreads( True ) - @IfConnected() - @RequiresUI() - def PrintDebugInfo( self ): - def Line(): - return ( "--------------------------------------------------------------" - "------------------" ) - - def Pretty( obj ): - if obj is None: - return [ "None" ] - return [ Line() ] + json.dumps( obj, indent=2 ).splitlines() + [ Line() ] - - - debugInfo = [ - "Vimspector Debug Info", - Line(), - f"ConnectionType: { self._connection_type }", - "Adapter: " ] + Pretty( self._adapter ) + [ - "Configuration: " ] + Pretty( self._configuration ) + [ - f"API Prefix: { self._api_prefix }", - f"Launch/Init: { self._launch_complete } / { self._init_complete }", - f"Workspace Root: { self._workspace_root }", - "Launch Config: " ] + Pretty( self._launch_config ) + [ - "Server Capabilities: " ] + Pretty( self._server_capabilities ) + [ - ] - - self._outputView.ClearCategory( 'DebugInfo' ) - self._outputView.Print( "DebugInfo", debugInfo ) - self.ShowOutput( "DebugInfo" ) - - def OnEvent_loadedSource( self, msg ): pass diff --git a/python3/vimspector/gadgets.py b/python3/vimspector/gadgets.py index 02eb0e7..5524899 100644 --- a/python3/vimspector/gadgets.py +++ b/python3/vimspector/gadgets.py @@ -30,12 +30,12 @@ GADGETS = { root, gadget ), 'all': { - 'version': '1.6.0', + 'version': '0.27.0', "adapters": { "vscode-cpptools": { "name": "cppdbg", "command": [ - "${gadgetDir}/vscode-cpptools/debugAdapters/bin/OpenDebugAD7" + "${gadgetDir}/vscode-cpptools/debugAdapters/OpenDebugAD7" ], "attach": { "pidProperty": "processId", @@ -53,17 +53,17 @@ GADGETS = { 'linux': { 'file_name': 'cpptools-linux.vsix', 'checksum': - 'c25299bcfb46b22d41aa3f125df7184e6282a35ff9fb69c47def744cb4778f55', + '3695202e1e75a03de18049323b66d868165123f26151f8c974a480eaf0205435', }, 'macos': { - 'file_name': 'cpptools-osx-arm64.vsix', + 'file_name': 'cpptools-osx.vsix', 'checksum': - 'ceb3e8cdaa2b5bb45af50913ddd8402089969748af8d70f5d46480408287ba6f', + 'cb061e3acd7559a539e5586f8d3f535101c4ec4e8a48195856d1d39380b5cf3c', }, 'windows': { 'file_name': 'cpptools-win32.vsix', 'checksum': - 'ef7ac5831874a3c7dbf0feb826bfda2be579aff9b6d990622fff1d0d4ede00d1', + 'aa294368ed16d48c59e49c8000e146eae5a19ad07b654efed5db8ec93b24229e', "adapters": { "vscode-cpptools": { "name": "cppdbg", @@ -86,6 +86,29 @@ GADGETS = { }, }, }, + 'vscode-python': { + 'language': 'python.legacy', + 'enabled': False, + 'download': { + 'url': 'https://github.com/Microsoft/vscode-python/releases/download/' + '${version}/${file_name}', + }, + 'all': { + 'version': '2019.11.50794', + 'file_name': 'ms-python-release.vsix', + 'checksum': + '6a9edf9ecabed14aac424e6007858068204a3638bf3bb4f235bd6035d823acc6', + }, + 'adapters': { + "vscode-python": { + "name": "vscode-python", + "command": [ + "node", + "${gadgetDir}/vscode-python/out/client/debugger/debugAdapter/main.js", + ], + } + }, + }, 'debugpy': { 'language': 'python', 'download': { @@ -113,7 +136,8 @@ GADGETS = { # doesn't support the custom messages) # https://github.com/puremourning/vimspector/issues/141 "subProcess": False, - } + }, + 'custom_handler': 'vimspector.custom.python.Debugpy' } }, }, @@ -211,12 +235,13 @@ GADGETS = { 'format': 'tar', }, 'all': { - 'version': '1.2.0-782' + 'version': '1.2.0-738' }, 'macos': { 'file_name': 'netcoredbg-osx.tar.gz', + 'version': '1.2.0-635', 'checksum': - '', + '71c773e34d358950f25119bade7e3081c4c2f9d71847bd49027ca5792e918beb', }, 'linux': { 'file_name': 'netcoredbg-linux-bionic-amd64.tar.gz', @@ -246,6 +271,41 @@ GADGETS = { }, } }, + 'vscode-mono-debug': { + 'language': 'csharp', + 'enabled': False, + 'download': { + 'url': 'https://marketplace.visualstudio.com/_apis/public/gallery/' + 'publishers/ms-vscode/vsextensions/mono-debug/${version}/' + 'vspackage', + 'target': 'vscode-mono-debug.vsix.gz', + 'format': 'zip.gz', + }, + 'all': { + 'file_name': 'vscode-mono-debug.vsix', + 'version': '0.16.2', + 'checksum': + '121eca297d83daeeb1e6e1d791305d1827998dbd595c330086b3b94d33dba3b9', + }, + 'adapters': { + 'vscode-mono-debug': { + "name": "mono-debug", + "command": [ + "mono", + "${gadgetDir}/vscode-mono-debug/bin/Release/mono-debug.exe" + ], + "attach": { + "pidSelect": "none" + }, + "configuration": { + "cwd": "${workspaceRoot}", + "console": "integratedTerminal", + "args": [], + "env": {} + } + }, + } + }, 'vscode-bash-debug': { 'language': 'bash', 'download': { @@ -323,10 +383,10 @@ GADGETS = { '${version}/${file_name}', }, 'all': { - 'version': 'v1.17.0', - 'file_name': 'php-debug-1.17.0.vsix', + 'version': 'v1.14.9', + 'file_name': 'php-debug.vsix', 'checksum': - 'd0fff272503414b6696cc737bc2e18e060fdd5e5dc4bcaf38ae7373afd8d8bc9', + '0c5709cbbffe26b12aa63a88142195a9a045a5d8fca7fe63d62c789fe601630d', }, 'adapters': { 'vscode-php-debug': { @@ -394,12 +454,12 @@ GADGETS = { '${version}/${file_name}', }, 'all': { - 'version': 'v1.6.6', + 'version': 'v1.5.3', }, 'macos': { - 'file_name': 'codelldb-aarch64-darwin.vsix', + 'file_name': 'codelldb-x86_64-darwin.vsix', 'checksum': - '5adc3b9139eabdafd825bd5efc55df4424a203fb2b6087b425cd434956e7ec58', + '7505bc1cdfcfd1cb981e2996aec62d63577440709bac31dcadb41a3b4b44631a', 'make_executable': [ 'adapter/codelldb', 'lldb/bin/debugserver', @@ -410,7 +470,7 @@ GADGETS = { 'linux': { 'file_name': 'codelldb-x86_64-linux.vsix', 'checksum': - 'eda2cd9b3089dcc0524c273e91ffb5875fe08c930bf643739a2cd1846e1f98d6', + 'ce7efc3e94d775368e5942a02bf5c326b6809a0b4c389f79ffa6a8f6f6b72139', 'make_executable': [ 'adapter/codelldb', 'lldb/bin/lldb', @@ -421,7 +481,7 @@ GADGETS = { 'windows': { 'file_name': 'codelldb-x86_64-windows.vsix', 'checksum': - '8ddebe8381a3d22dc3d95139c3797fda06b5cc34aadf300e13b1c516b9da95fe', + '', 'make_executable': [] }, 'adapters': { diff --git a/python3/vimspector/installer.py b/python3/vimspector/installer.py index a81db8f..f0f85a4 100644 --- a/python3/vimspector/installer.py +++ b/python3/vimspector/installer.py @@ -358,8 +358,7 @@ def InstallCppTools( name, root, gadget ): # It's hilarious, but the execute bits aren't set in the vsix. So they # actually have javascript code which does this. It's just a horrible horrible # hack that really is not funny. - MakeExecutable( - os.path.join( extension, 'debugAdapters', 'bin', 'OpenDebugAD7' ) ) + MakeExecutable( os.path.join( extension, 'debugAdapters', 'OpenDebugAD7' ) ) with open( os.path.join( extension, 'package.json' ) ) as f: package = json.load( f ) runtime_dependencies = package[ 'runtimeDependencies' ] diff --git a/python3/vimspector/output.py b/python3/vimspector/output.py index 3f0da1e..223eb96 100644 --- a/python3/vimspector/output.py +++ b/python3/vimspector/output.py @@ -32,7 +32,6 @@ class TabBuffer( object ): BUFFER_MAP = { 'console': 'Console', 'stdout': 'Console', - 'output': 'Console', 'stderr': 'stderr', 'telemetry': None, } @@ -59,17 +58,20 @@ class OutputView( object ): files or the output of commands.""" _buffers: typing.Dict[ str, TabBuffer ] - def __init__( self, window, api_prefix ): + def __init__( self, window, api_prefix, session_id = None ): self._window = window self._buffers = {} self._api_prefix = api_prefix VIEWS.add( self ) - def Print( self, category, text: typing.Union[ str, list ] ): - if not isinstance( text, list ): - text = text.splitlines() + if session_id is None: + # FIXME: hack? + self._session_id = hash( self ) + else: + self._session_id = session_id - self._Print( category, text ) + def Print( self, categroy, text ): + self._Print( 'server', text.splitlines() ) def OnOutput( self, event ): category = CategoryToBuffer( event.get( 'category' ) or 'output' ) @@ -108,26 +110,13 @@ class OutputView( object ): def Clear( self ): for category, tab_buffer in self._buffers.items(): - self._CleanUpBuffer( category, tab_buffer ) + if tab_buffer.is_job: + utils.CleanUpCommand( self._session_id, category, self._api_prefix ) + utils.CleanUpHiddenBuffer( tab_buffer.buf ) # FIXME: nunmenu the WinBar ? self._buffers = {} - - def ClearCategory( self, category: str ): - if category not in self._buffers: - return - - self._CleanUpBuffer( category, self._buffers[ category ] ) - - - def _CleanUpBuffer( self, category: str, tab_buffer: TabBuffer ): - if tab_buffer.is_job: - utils.CleanUpCommand( category, self._api_prefix ) - - utils.CleanUpHiddenBuffer( tab_buffer.buf ) - - def WindowIsValid( self ): return self._window.valid @@ -191,8 +180,9 @@ class OutputView( object ): if cmd is not None: out = utils.SetUpCommandBuffer( + self._session_id, cmd, - category, + utils.BufferNameForSession( category, self._session_id ), self._api_prefix, completion_handler = completion_handler ) @@ -205,6 +195,8 @@ class OutputView( object ): else: name = 'vimspector.Output:{0}'.format( category ) + name = utils.BufferNameForSession( name, self._session_id ) + tab_buffer = TabBuffer( utils.NewEmptyBuffer(), len( self._buffers ) ) self._buffers[ category ] = tab_buffer @@ -267,8 +259,8 @@ class OutputView( object ): class DAPOutputView( OutputView ): """Specialised OutputView which adds the DAP Console (REPL)""" - def __init__( self, *args ): - super().__init__( *args ) + def __init__( self, *args, **kwargs ): + super().__init__( *args, **kwargs ) self._connection = None for b in set( BUFFER_MAP.values() ): diff --git a/python3/vimspector/session_manager.py b/python3/vimspector/session_manager.py new file mode 100644 index 0000000..1564388 --- /dev/null +++ b/python3/vimspector/session_manager.py @@ -0,0 +1,58 @@ +# vimspector - A multi-language debugging system for Vim +# Copyright 2020 Ben Jackson +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from vimspector.debug_session import DebugSession + +# Singleton +_session_manager = None + + +class SessionManager: + next_session_id = 0 + sessions = {} + + + def NewSession( self, *args, **kwargs ): + session_id = self.next_session_id + self.next_session_id += 1 + session = DebugSession( session_id, self, *args, **kwargs ) + self.sessions[ session_id ] = session + + return session + + + def DestroySession( self, session: DebugSession ): + # TODO: Call this! + del self.sessions[ session.session_id ] + + + def GetSession( self, session_id ): + return self.sessions.get( session_id ) + + + def SessionForTab( self, tabnr ): + for _, session in self.sessions.items(): + if session._HasUI() and session._uiTab.number == int( tabnr ): + return session + + return None + + +def Get(): + global _session_manager + if _session_manager is None: + _session_manager = SessionManager() + + return _session_manager diff --git a/python3/vimspector/settings.py b/python3/vimspector/settings.py index 89378af..a060543 100644 --- a/python3/vimspector/settings.py +++ b/python3/vimspector/settings.py @@ -42,8 +42,7 @@ DEFAULTS = { 'vimspectorBP': 9, 'vimspectorBPCond': 9, 'vimspectorBPDisabled': 9, - 'vimspectorCurrentThread': 200, - 'vimspectorCurrentFrame': 200, + 'vimspectorCurrentThread': 200 }, # Installer diff --git a/python3/vimspector/stack_trace.py b/python3/vimspector/stack_trace.py index 8b1d848..f55224a 100644 --- a/python3/vimspector/stack_trace.py +++ b/python3/vimspector/stack_trace.py @@ -86,8 +86,8 @@ class StackTraceView( object ): _line_to_thread = typing.Dict[ int, Thread ] def __init__( self, session, win ): - self._logger = logging.getLogger( __name__ ) - utils.SetUpLogging( self._logger ) + self._logger = logging.getLogger( __name__ + '.' + str( session.session_id ) ) + utils.SetUpLogging( self._logger, session.session_id ) self._buf = win.buffer self._session = session @@ -102,10 +102,12 @@ class StackTraceView( object ): self._scratch_buffers = [] # FIXME: This ID is by group, so should be module scope - self._current_thread_sign_id = 0 # 1 when used - self._current_frame_sign_id = 0 # 2 when used + self._next_sign_id = 1 - utils.SetUpHiddenBuffer( self._buf, 'vimspector.StackTrace' ) + utils.SetUpHiddenBuffer( + self._buf, + utils.BufferNameForSession( 'vimspector.StackTrace', + self._session.session_id ) ) utils.SetUpUIWindow( win ) mappings = settings.Dict( 'mappings' )[ 'stack_trace' ] @@ -128,7 +130,6 @@ class StackTraceView( object ): ':call vimspector#SetCurrentThread()' ) win.options[ 'cursorline' ] = False - win.options[ 'signcolumn' ] = 'auto' if not signs.SignDefined( 'vimspectorCurrentThread' ): @@ -138,13 +139,6 @@ class StackTraceView( object ): texthl = 'MatchParen', linehl = 'CursorLine' ) - if not signs.SignDefined( 'vimspectorCurrentFrame' ): - signs.DefineSign( 'vimspectorCurrentFrame', - text = '▶ ', - double_text = '▶', - texthl = 'Special', - linehl = 'CursorLine' ) - self._line_to_frame = {} self._line_to_thread = {} @@ -166,12 +160,9 @@ class StackTraceView( object ): self._sources = {} self._requesting_threads = StackTraceView.ThreadRequestState.NO self._pending_thread_request = None - if self._current_thread_sign_id: - signs.UnplaceSign( self._current_thread_sign_id, 'VimspectorStackTrace' ) - self._current_thread_sign_id = 0 - if self._current_frame_sign_id: - signs.UnplaceSign( self._current_frame_sign_id, 'VimspectorStackTrace' ) - self._current_frame_sign_id = 0 + if self._next_sign_id: + signs.UnplaceSign( self._next_sign_id, 'VimspectorStackTrace' ) + self._next_sign_id = 0 with utils.ModifiableScratchBuffer( self._buf ): utils.ClearBuffer( self._buf ) @@ -285,10 +276,10 @@ class StackTraceView( object ): self._line_to_frame.clear() self._line_to_thread.clear() - if self._current_thread_sign_id: - signs.UnplaceSign( self._current_thread_sign_id, 'VimspectorStackTrace' ) + if self._next_sign_id: + signs.UnplaceSign( self._next_sign_id, 'VimspectorStackTrace' ) else: - self._current_thread_sign_id = 1 + self._next_sign_id = 1 with utils.ModifiableScratchBuffer( self._buf ): with utils.RestoreCursorPosition(): @@ -302,7 +293,7 @@ class StackTraceView( object ): f'({thread.State()})' ) if self._current_thread == thread.id: - signs.PlaceSign( self._current_thread_sign_id, + signs.PlaceSign( self._next_sign_id, 'VimspectorStackTrace', 'vimspectorCurrentThread', self._buf.name, @@ -433,7 +424,6 @@ class StackTraceView( object ): # Should this set the current _Thread_ too ? If i jump to a frame in # Thread 2, should that become the focussed thread ? self._current_frame = frame - self._DrawThreads() return self._session.SetCurrentFrame( self._current_frame, reason ) return False @@ -531,11 +521,6 @@ class StackTraceView( object ): if not thread.IsExpanded(): return - if self._current_frame_sign_id: - signs.UnplaceSign( self._current_frame_sign_id, 'VimspectorStackTrace' ) - else: - self._current_frame_sign_id = 2 - for frame in thread.stacktrace: if frame.get( 'source' ): source = frame[ 'source' ] @@ -560,14 +545,6 @@ class StackTraceView( object ): source[ 'name' ], frame[ 'line' ] ) ) - if ( self._current_frame is not None and - self._current_frame[ 'id' ] == frame[ 'id' ] ): - signs.PlaceSign( self._current_frame_sign_id, - 'VimspectorStackTrace', - 'vimspectorCurrentFrame', - self._buf.name, - line ) - self._line_to_frame[ line ] = ( thread, frame ) def _ResolveSource( self, source, and_then ): @@ -588,7 +565,10 @@ class StackTraceView( object ): buf = utils.BufferForFile( buf_name ) self._scratch_buffers.append( buf ) - utils.SetUpHiddenBuffer( buf, buf_name ) + utils.SetUpHiddenBuffer( buf, + utils.BufferNameForSession( + buf_name, + self._session.session_id ) ) source[ 'path' ] = buf_name with utils.ModifiableScratchBuffer( buf ): utils.SetBufferContents( buf, msg[ 'body' ][ 'content' ] ) diff --git a/python3/vimspector/utils.py b/python3/vimspector/utils.py index 5f836fc..242d070 100644 --- a/python3/vimspector/utils.py +++ b/python3/vimspector/utils.py @@ -32,13 +32,30 @@ LOG_FILE = os.path.expanduser( os.path.join( '~', '.vimspector.log' ) ) _log_handler = logging.FileHandler( LOG_FILE, mode = 'w' ) _log_handler.setFormatter( - logging.Formatter( '%(asctime)s - %(levelname)s - %(message)s' ) ) + logging.Formatter( '%(asctime)s - %(levelname)s - %(filename)s:%(lineno)s - ' + '%(context)s - %(message)s' ) ) -def SetUpLogging( logger ): +class ContextLogFilter( logging.Filter ): + context: str + + def __init__( self, context ): + self.context = str( context ) + + def filter( self, record: logging.LogRecord ): + if self.context is None: + record.context = 'UNKNOWN' + else: + record.context = self.context + + return True + + +def SetUpLogging( logger, context = None ): logger.setLevel( logging.DEBUG ) if _log_handler not in logger.handlers: logger.addHandler( _log_handler ) + logger.addFilter( ContextLogFilter( context ) ) _logger = logging.getLogger( __name__ ) @@ -87,16 +104,21 @@ def OpenFileInCurrentWindow( file_name ): COMMAND_HANDLERS = {} -def OnCommandWithLogComplete( name, exit_code ): - cb = COMMAND_HANDLERS.get( name ) +def OnCommandWithLogComplete( session_id, name, exit_code ): + cb = COMMAND_HANDLERS.get( str( session_id ) + '.' + name ) if cb: cb( exit_code ) -def SetUpCommandBuffer( cmd, name, api_prefix, completion_handler = None ): - COMMAND_HANDLERS[ name ] = completion_handler +def SetUpCommandBuffer( session_id, + cmd, + name, + api_prefix, + completion_handler = None ): + COMMAND_HANDLERS[ str( session_id ) + '.' + name ] = completion_handler buf = Call( f'vimspector#internal#{api_prefix}job#StartCommandWithLog', + session_id, cmd, name ) @@ -110,10 +132,12 @@ def SetUpCommandBuffer( cmd, name, api_prefix, completion_handler = None ): return vim.buffers[ int( buf ) ] -def CleanUpCommand( name, api_prefix ): - return vim.eval( 'vimspector#internal#{}job#CleanUpCommand( "{}" )'.format( - api_prefix, - name ) ) +def CleanUpCommand( session_id, name, api_prefix ): + return vim.eval( + 'vimspector#internal#{}job#CleanUpCommand( {}, "{}" )'.format( + api_prefix, + session_id, + name ) ) def CleanUpHiddenBuffer( buf ): @@ -397,6 +421,8 @@ def Confirm( api_prefix, default_value = 2, options: list = None, keys: list = None ): + # TODO: Implement a queue here? If calling code calls Confirm (async) multiple + # times, we... well what happens?! if not options: options = [ '(Y)es', '(N)o' ] if not keys: @@ -864,3 +890,12 @@ def UseWinBar(): # Buggy neovim doesn't render correctly when the WinBar is defined: # https://github.com/neovim/neovim/issues/12689 return not int( Call( 'has', 'nvim' ) ) + + +def BufferNameForSession( name, session_id ): + if session_id == 0: + # Hack for backward compat - don't suffix with the ID for the "first" + # session + return name + + return f'{name}[{session_id}]' diff --git a/python3/vimspector/variables.py b/python3/vimspector/variables.py index 8dcb493..5f64ba6 100644 --- a/python3/vimspector/variables.py +++ b/python3/vimspector/variables.py @@ -166,10 +166,11 @@ def AddExpandMappings( mappings = None ): class VariablesView( object ): - def __init__( self, variables_win, watches_win ): - self._logger = logging.getLogger( __name__ ) - utils.SetUpLogging( self._logger ) + def __init__( self, session, variables_win, watches_win ): + self._logger = logging.getLogger( __name__ + '.' + str( session.session_id ) ) + utils.SetUpLogging( self._logger, session.session_id ) + self._session = session self._connection = None self._current_syntax = '' self._server_capabilities = None @@ -182,7 +183,10 @@ class VariablesView( object ): # Set up the "Variables" buffer in the variables_win self._scopes: typing.List[ Scope ] = [] self._vars = View( variables_win, {}, self._DrawScopes ) - utils.SetUpHiddenBuffer( self._vars.buf, 'vimspector.Variables' ) + utils.SetUpHiddenBuffer( + self._vars.buf, + utils.BufferNameForSession( 'vimspector.Variables', + self._session.session_id ) ) with utils.LetCurrentWindow( variables_win ): if utils.UseWinBar(): vim.command( 'nnoremenu 1.1 WinBar.Set ' @@ -193,11 +197,14 @@ class VariablesView( object ): # there) self._watches: typing.List[ Watch ] = [] self._watch = View( watches_win, {}, self._DrawWatches ) - utils.SetUpPromptBuffer( self._watch.buf, - 'vimspector.Watches', - 'Expression: ', - 'vimspector#AddWatchPrompt', - 'vimspector#OmniFuncWatch' ) + utils.SetUpPromptBuffer( + self._watch.buf, + utils.BufferNameForSession( 'vimspector.Watches', + self._session.session_id ), + 'Expression: ', + 'vimspector#AddWatchPrompt', + 'vimspector#OmniFuncWatch' ) + with utils.LetCurrentWindow( watches_win ): AddExpandMappings( mappings ) for mapping in utils.GetVimList( mappings, 'delete' ): @@ -224,9 +231,12 @@ class VariablesView( object ): 'balloonexpr': vim.options[ 'balloonexpr' ], 'balloondelay': vim.options[ 'balloondelay' ], } + # TODO: How can we make this work. I think we can set ballooneval as a + # buffer-local or maybe window-local variable ? We could pass session_id + # to the expression here, but still how would it work with 2 concurrent + # sessions? vim.options[ 'balloonexpr' ] = ( "vimspector#internal#" "balloon#HoverTooltip()" ) - vim.options[ 'balloondelay' ] = 250 if has_balloon: diff --git a/run_tests b/run_tests index 201ec1b..39dc7ec 100755 --- a/run_tests +++ b/run_tests @@ -21,7 +21,7 @@ out_fd=1 while [ -n "$1" ]; do case "$1" in - "--basedir"|"--base-dir"|"--test-base") + "--basedir") shift SetBaseDir $1 shift @@ -36,7 +36,7 @@ while [ -n "$1" ]; do INSTALL=$1 shift ;; - "--update"|"--upgrade") + "--update") UPDATE=1 shift ;; @@ -91,8 +91,7 @@ if [ "$INSTALL" = "1" ] || [ "$INSTALL" = "script" ]; then if ! python3 $(dirname $0)/install_gadget.py \ --basedir ${BASEDIR} \ ${INSTALLER_ARGS} \ - --all \ - --force-enable-csharp; then + --all; then echo "Script installation reported errors" >&2 exit 1 fi @@ -103,7 +102,7 @@ if [ "$INSTALL" = "1" ] || [ "$INSTALL" = "vim" ]; then --cmd "${BASEDIR_CMD}" \ -c 'autocmd User VimspectorInstallSuccess qa!' \ -c 'autocmd User VimspectorInstallFailed cquit!' \ - -c "VimspectorInstall --all netcoredbg"; then + -c "VimspectorInstall --all"; then echo "Vim installation reported errors" >&2 exit 1 fi @@ -145,9 +144,6 @@ set -e pushd tests/testdata/cpp/simple make clean all popd - pushd support/test/csharp - dotnet build - popd set +e echo "%DONE - built test programs" diff --git a/support/custom_ui_vimrc b/support/custom_ui_vimrc index e76c6ee..a8812cb 100644 --- a/support/custom_ui_vimrc +++ b/support/custom_ui_vimrc @@ -54,7 +54,7 @@ function s:SetUpTerminal() let padding = 4 let cols = max( [ min( [ &columns - left_bar - code - padding, 80 ] ), 10 ] ) call win_gotoid( terminal_win ) - execute string(cols) . 'wincmd |' + execute cols . 'wincmd |' endfunction function! s:CustomiseWinBar() diff --git a/support/gadget_upgrade/README.md b/support/gadget_upgrade/README.md deleted file mode 100644 index 9ae3d7f..0000000 --- a/support/gadget_upgrade/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Manually updating shipped gadgets - -Download the gadget files manuall from their official source into this dir. -Run `./checksum.py ` to get the checksums. - -Update ../../python3/vimspector/gadgets.py with the new version and the -checksums. - diff --git a/support/gadget_upgrade/checksum.py b/support/gadget_upgrade/checksum.py deleted file mode 100755 index d0c1404..0000000 --- a/support/gadget_upgrade/checksum.py +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env python3 - -import hashlib -import sys - - -def GetChecksumSHA254( file_path ): - with open( file_path, 'rb' ) as existing_file: - return hashlib.sha256( existing_file.read() ).hexdigest() - - -for arg in sys.argv[ 1: ]: - print( f"{ arg } = { GetChecksumSHA254( arg ) }" ) diff --git a/support/test/bash/.vimspector.json b/support/test/bash/.vimspector.json deleted file mode 100644 index a1be1b9..0000000 --- a/support/test/bash/.vimspector.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "$schema": "https://puremourning.github.io/vimspector/schema/vimspector.schema.json", - "configurations": { - "Run Current Script": { - "adapter": "vscode-bash", - "autoselect": false, - "configuration": { - "request": "launch", - "program": "${file}", - "cwd": "${fileDirname}", - "args": [ "*${args}" ] - } - } - } -} diff --git a/support/test/cpp/simple_c_program/.vimspector.json b/support/test/cpp/simple_c_program/.vimspector.json index fb4c958..7b8c53a 100644 --- a/support/test/cpp/simple_c_program/.vimspector.json +++ b/support/test/cpp/simple_c_program/.vimspector.json @@ -15,15 +15,6 @@ "program": "${workspaceRoot}/test", "stopAtEntry": true } - }, - "cpptools": { - "adapter": "vscode-cpptools", - "configuration": { - "request": "launch", - "program": "${workspaceRoot}/test", - "stopOnEntry": true, - "MIMode": "lldb" - } } } } diff --git a/support/test/cpp/simple_c_program/.ycm_extra_conf.py b/support/test/cpp/simple_c_program/.ycm_extra_conf.py index 4203b36..0d17586 100644 --- a/support/test/cpp/simple_c_program/.ycm_extra_conf.py +++ b/support/test/cpp/simple_c_program/.ycm_extra_conf.py @@ -1,4 +1,4 @@ def Settings( **kwargs ): return { - 'flags': [ '-x', 'c++', '-Wall', '-Wextra', '-std=c++17' ] + 'flags': [ '-x', 'c++', '-Wall', '-Wextra' ] } diff --git a/support/test/csharp/.gitignore b/support/test/csharp/.gitignore index 03cd7d8..b7d74e4 100644 --- a/support/test/csharp/.gitignore +++ b/support/test/csharp/.gitignore @@ -1,3 +1,2 @@ bin/ obj/Debug -obj/ diff --git a/support/test/csharp/.vimspector.json b/support/test/csharp/.vimspector.json index 326739b..524ae1a 100644 --- a/support/test/csharp/.vimspector.json +++ b/support/test/csharp/.vimspector.json @@ -1,57 +1,25 @@ { - "adapters": { - "netcoredbg-debuglog": { - "attach": { - "pidProperty": "processId", - "pidSelect": "ask" + "configurations": { + "launch - netcoredbg": { + "adapter": "netcoredbg", + "configuration": { + "request": "launch", + "program": "${workspaceRoot}/bin/Debug/netcoreapp2.2/csharp.dll", + "args": [], + "stopAtEntry": true + } }, - "command": [ - "${gadgetDir}/netcoredbg/netcoredbg", - "--interpreter=vscode", - "--engineLogging=${workspaceRoot}/netcoredbg.engine.log", - "--log=${workspaceRoot}/netcoredbg.log" - ], - "configuration": { - "cwd": "${workspaceRoot}" - }, - "name": "netcoredbg" - } - }, - "configurations": { - // - // NOTE: - // If you add to this, you must update tests/get_configurations.test.vim - // - - "launch - netcoredbg": { - "adapter": "netcoredbg", - "configuration": { - "request": "launch", - "program": "${workspaceRoot}/bin/Debug/netcoreapp3.1/csharp.dll", - "args": [], - "stopAtEntry": false - } - }, - "launch - netcoredbg - with debug log": { - "adapter": "netcoredbg-debuglog", - "configuration": { - "request": "launch", - "program": "${workspaceRoot}/bin/Debug/netcoreapp3.1/csharp.dll", - "args": [], - "stopAtEntry": false - } - }, - "launch - mono": { - "adapter": "vscode-mono-debug", - "configuration": { - "request": "launch", - "program": "${workspaceRoot}/Program.exe", - "console": "integratedTerminal", - "cwd": "${workspaceRoot}", - "args": [], - "env": {} + "launch - mono": { + "adapter": "vscode-mono-debug", + "configuration": { + "request": "launch", + "program": "${workspaceRoot}/Program.exe", + "console": "integratedTerminal", + "cwd": "${workspaceRoot}", + "args": [], + "env": {} + } } } - } } diff --git a/support/test/csharp/csharp.csproj b/support/test/csharp/csharp.csproj index d453e9a..01d5113 100644 --- a/support/test/csharp/csharp.csproj +++ b/support/test/csharp/csharp.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.1 + netcoreapp2.2 diff --git a/support/test/csharp/csharp.sln b/support/test/csharp/csharp.sln index 91f59bf..bba50e0 100644 --- a/support/test/csharp/csharp.sln +++ b/support/test/csharp/csharp.sln @@ -3,8 +3,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.26124.0 MinimumVisualStudioVersion = 15.0.26124.0 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "csharp", "csharp.csproj", "{91DB205F-E422-430B-BBB8-955110C7B3B6}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -17,18 +15,4 @@ Global GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {91DB205F-E422-430B-BBB8-955110C7B3B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {91DB205F-E422-430B-BBB8-955110C7B3B6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {91DB205F-E422-430B-BBB8-955110C7B3B6}.Debug|x64.ActiveCfg = Debug|Any CPU - {91DB205F-E422-430B-BBB8-955110C7B3B6}.Debug|x64.Build.0 = Debug|Any CPU - {91DB205F-E422-430B-BBB8-955110C7B3B6}.Debug|x86.ActiveCfg = Debug|Any CPU - {91DB205F-E422-430B-BBB8-955110C7B3B6}.Debug|x86.Build.0 = Debug|Any CPU - {91DB205F-E422-430B-BBB8-955110C7B3B6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {91DB205F-E422-430B-BBB8-955110C7B3B6}.Release|Any CPU.Build.0 = Release|Any CPU - {91DB205F-E422-430B-BBB8-955110C7B3B6}.Release|x64.ActiveCfg = Release|Any CPU - {91DB205F-E422-430B-BBB8-955110C7B3B6}.Release|x64.Build.0 = Release|Any CPU - {91DB205F-E422-430B-BBB8-955110C7B3B6}.Release|x86.ActiveCfg = Release|Any CPU - {91DB205F-E422-430B-BBB8-955110C7B3B6}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection EndGlobal diff --git a/support/test/csharp/obj/csharp.csproj.nuget.cache b/support/test/csharp/obj/csharp.csproj.nuget.cache new file mode 100644 index 0000000..3ac8d84 --- /dev/null +++ b/support/test/csharp/obj/csharp.csproj.nuget.cache @@ -0,0 +1,5 @@ +{ + "version": 1, + "dgSpecHash": "6/vdr7YprlSIoQecv/nNuLNflFpO0X7eN7jHUinZTsgian9nYpmHMWirsDWMi5l+29TH+Qy8O/QfaB/48QtjRQ==", + "success": true +} \ No newline at end of file diff --git a/support/test/csharp/obj/csharp.csproj.nuget.g.props b/support/test/csharp/obj/csharp.csproj.nuget.g.props new file mode 100644 index 0000000..c71f0e6 --- /dev/null +++ b/support/test/csharp/obj/csharp.csproj.nuget.g.props @@ -0,0 +1,21 @@ + + + + True + NuGet + $(MSBuildThisFileDirectory)project.assets.json + /Users/ben/.nuget/packages/ + /Users/ben/.nuget/packages/;/usr/local/share/dotnet/sdk/NuGetFallbackFolder + PackageReference + 5.7.0 + + + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + + + + + \ No newline at end of file diff --git a/support/test/csharp/obj/csharp.csproj.nuget.g.targets b/support/test/csharp/obj/csharp.csproj.nuget.g.targets new file mode 100644 index 0000000..099158b --- /dev/null +++ b/support/test/csharp/obj/csharp.csproj.nuget.g.targets @@ -0,0 +1,10 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + + + + + + \ No newline at end of file diff --git a/support/test/csharp/obj/project.assets.json b/support/test/csharp/obj/project.assets.json new file mode 100644 index 0000000..bd6c0fc --- /dev/null +++ b/support/test/csharp/obj/project.assets.json @@ -0,0 +1,748 @@ +{ + "version": 3, + "targets": { + ".NETCoreApp,Version=v2.2": { + "Microsoft.NETCore.App/2.2.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.DotNetHostPolicy": "2.2.0", + "Microsoft.NETCore.Platforms": "2.2.0", + "Microsoft.NETCore.Targets": "2.0.0", + "NETStandard.Library": "2.0.3" + }, + "compile": { + "ref/netcoreapp2.2/Microsoft.CSharp.dll": {}, + "ref/netcoreapp2.2/Microsoft.VisualBasic.dll": {}, + "ref/netcoreapp2.2/Microsoft.Win32.Primitives.dll": {}, + "ref/netcoreapp2.2/System.AppContext.dll": {}, + "ref/netcoreapp2.2/System.Buffers.dll": {}, + "ref/netcoreapp2.2/System.Collections.Concurrent.dll": {}, + "ref/netcoreapp2.2/System.Collections.Immutable.dll": {}, + "ref/netcoreapp2.2/System.Collections.NonGeneric.dll": {}, + "ref/netcoreapp2.2/System.Collections.Specialized.dll": {}, + "ref/netcoreapp2.2/System.Collections.dll": {}, + "ref/netcoreapp2.2/System.ComponentModel.Annotations.dll": {}, + "ref/netcoreapp2.2/System.ComponentModel.DataAnnotations.dll": {}, + "ref/netcoreapp2.2/System.ComponentModel.EventBasedAsync.dll": {}, + "ref/netcoreapp2.2/System.ComponentModel.Primitives.dll": {}, + "ref/netcoreapp2.2/System.ComponentModel.TypeConverter.dll": {}, + "ref/netcoreapp2.2/System.ComponentModel.dll": {}, + "ref/netcoreapp2.2/System.Configuration.dll": {}, + "ref/netcoreapp2.2/System.Console.dll": {}, + "ref/netcoreapp2.2/System.Core.dll": {}, + "ref/netcoreapp2.2/System.Data.Common.dll": {}, + "ref/netcoreapp2.2/System.Data.dll": {}, + "ref/netcoreapp2.2/System.Diagnostics.Contracts.dll": {}, + "ref/netcoreapp2.2/System.Diagnostics.Debug.dll": {}, + "ref/netcoreapp2.2/System.Diagnostics.DiagnosticSource.dll": {}, + "ref/netcoreapp2.2/System.Diagnostics.FileVersionInfo.dll": {}, + "ref/netcoreapp2.2/System.Diagnostics.Process.dll": {}, + "ref/netcoreapp2.2/System.Diagnostics.StackTrace.dll": {}, + "ref/netcoreapp2.2/System.Diagnostics.TextWriterTraceListener.dll": {}, + "ref/netcoreapp2.2/System.Diagnostics.Tools.dll": {}, + "ref/netcoreapp2.2/System.Diagnostics.TraceSource.dll": {}, + "ref/netcoreapp2.2/System.Diagnostics.Tracing.dll": {}, + "ref/netcoreapp2.2/System.Drawing.Primitives.dll": {}, + "ref/netcoreapp2.2/System.Drawing.dll": {}, + "ref/netcoreapp2.2/System.Dynamic.Runtime.dll": {}, + "ref/netcoreapp2.2/System.Globalization.Calendars.dll": {}, + "ref/netcoreapp2.2/System.Globalization.Extensions.dll": {}, + "ref/netcoreapp2.2/System.Globalization.dll": {}, + "ref/netcoreapp2.2/System.IO.Compression.Brotli.dll": {}, + "ref/netcoreapp2.2/System.IO.Compression.FileSystem.dll": {}, + "ref/netcoreapp2.2/System.IO.Compression.ZipFile.dll": {}, + "ref/netcoreapp2.2/System.IO.Compression.dll": {}, + "ref/netcoreapp2.2/System.IO.FileSystem.DriveInfo.dll": {}, + "ref/netcoreapp2.2/System.IO.FileSystem.Primitives.dll": {}, + "ref/netcoreapp2.2/System.IO.FileSystem.Watcher.dll": {}, + "ref/netcoreapp2.2/System.IO.FileSystem.dll": {}, + "ref/netcoreapp2.2/System.IO.IsolatedStorage.dll": {}, + "ref/netcoreapp2.2/System.IO.MemoryMappedFiles.dll": {}, + "ref/netcoreapp2.2/System.IO.Pipes.dll": {}, + "ref/netcoreapp2.2/System.IO.UnmanagedMemoryStream.dll": {}, + "ref/netcoreapp2.2/System.IO.dll": {}, + "ref/netcoreapp2.2/System.Linq.Expressions.dll": {}, + "ref/netcoreapp2.2/System.Linq.Parallel.dll": {}, + "ref/netcoreapp2.2/System.Linq.Queryable.dll": {}, + "ref/netcoreapp2.2/System.Linq.dll": {}, + "ref/netcoreapp2.2/System.Memory.dll": {}, + "ref/netcoreapp2.2/System.Net.Http.dll": {}, + "ref/netcoreapp2.2/System.Net.HttpListener.dll": {}, + "ref/netcoreapp2.2/System.Net.Mail.dll": {}, + "ref/netcoreapp2.2/System.Net.NameResolution.dll": {}, + "ref/netcoreapp2.2/System.Net.NetworkInformation.dll": {}, + "ref/netcoreapp2.2/System.Net.Ping.dll": {}, + "ref/netcoreapp2.2/System.Net.Primitives.dll": {}, + "ref/netcoreapp2.2/System.Net.Requests.dll": {}, + "ref/netcoreapp2.2/System.Net.Security.dll": {}, + "ref/netcoreapp2.2/System.Net.ServicePoint.dll": {}, + "ref/netcoreapp2.2/System.Net.Sockets.dll": {}, + "ref/netcoreapp2.2/System.Net.WebClient.dll": {}, + "ref/netcoreapp2.2/System.Net.WebHeaderCollection.dll": {}, + "ref/netcoreapp2.2/System.Net.WebProxy.dll": {}, + "ref/netcoreapp2.2/System.Net.WebSockets.Client.dll": {}, + "ref/netcoreapp2.2/System.Net.WebSockets.dll": {}, + "ref/netcoreapp2.2/System.Net.dll": {}, + "ref/netcoreapp2.2/System.Numerics.Vectors.dll": {}, + "ref/netcoreapp2.2/System.Numerics.dll": {}, + "ref/netcoreapp2.2/System.ObjectModel.dll": {}, + "ref/netcoreapp2.2/System.Reflection.DispatchProxy.dll": {}, + "ref/netcoreapp2.2/System.Reflection.Emit.ILGeneration.dll": {}, + "ref/netcoreapp2.2/System.Reflection.Emit.Lightweight.dll": {}, + "ref/netcoreapp2.2/System.Reflection.Emit.dll": {}, + "ref/netcoreapp2.2/System.Reflection.Extensions.dll": {}, + "ref/netcoreapp2.2/System.Reflection.Metadata.dll": {}, + "ref/netcoreapp2.2/System.Reflection.Primitives.dll": {}, + "ref/netcoreapp2.2/System.Reflection.TypeExtensions.dll": {}, + "ref/netcoreapp2.2/System.Reflection.dll": {}, + "ref/netcoreapp2.2/System.Resources.Reader.dll": {}, + "ref/netcoreapp2.2/System.Resources.ResourceManager.dll": {}, + "ref/netcoreapp2.2/System.Resources.Writer.dll": {}, + "ref/netcoreapp2.2/System.Runtime.CompilerServices.VisualC.dll": {}, + "ref/netcoreapp2.2/System.Runtime.Extensions.dll": {}, + "ref/netcoreapp2.2/System.Runtime.Handles.dll": {}, + "ref/netcoreapp2.2/System.Runtime.InteropServices.RuntimeInformation.dll": {}, + "ref/netcoreapp2.2/System.Runtime.InteropServices.WindowsRuntime.dll": {}, + "ref/netcoreapp2.2/System.Runtime.InteropServices.dll": {}, + "ref/netcoreapp2.2/System.Runtime.Loader.dll": {}, + "ref/netcoreapp2.2/System.Runtime.Numerics.dll": {}, + "ref/netcoreapp2.2/System.Runtime.Serialization.Formatters.dll": {}, + "ref/netcoreapp2.2/System.Runtime.Serialization.Json.dll": {}, + "ref/netcoreapp2.2/System.Runtime.Serialization.Primitives.dll": {}, + "ref/netcoreapp2.2/System.Runtime.Serialization.Xml.dll": {}, + "ref/netcoreapp2.2/System.Runtime.Serialization.dll": {}, + "ref/netcoreapp2.2/System.Runtime.dll": {}, + "ref/netcoreapp2.2/System.Security.Claims.dll": {}, + "ref/netcoreapp2.2/System.Security.Cryptography.Algorithms.dll": {}, + "ref/netcoreapp2.2/System.Security.Cryptography.Csp.dll": {}, + "ref/netcoreapp2.2/System.Security.Cryptography.Encoding.dll": {}, + "ref/netcoreapp2.2/System.Security.Cryptography.Primitives.dll": {}, + "ref/netcoreapp2.2/System.Security.Cryptography.X509Certificates.dll": {}, + "ref/netcoreapp2.2/System.Security.Principal.dll": {}, + "ref/netcoreapp2.2/System.Security.SecureString.dll": {}, + "ref/netcoreapp2.2/System.Security.dll": {}, + "ref/netcoreapp2.2/System.ServiceModel.Web.dll": {}, + "ref/netcoreapp2.2/System.ServiceProcess.dll": {}, + "ref/netcoreapp2.2/System.Text.Encoding.Extensions.dll": {}, + "ref/netcoreapp2.2/System.Text.Encoding.dll": {}, + "ref/netcoreapp2.2/System.Text.RegularExpressions.dll": {}, + "ref/netcoreapp2.2/System.Threading.Overlapped.dll": {}, + "ref/netcoreapp2.2/System.Threading.Tasks.Dataflow.dll": {}, + "ref/netcoreapp2.2/System.Threading.Tasks.Extensions.dll": {}, + "ref/netcoreapp2.2/System.Threading.Tasks.Parallel.dll": {}, + "ref/netcoreapp2.2/System.Threading.Tasks.dll": {}, + "ref/netcoreapp2.2/System.Threading.Thread.dll": {}, + "ref/netcoreapp2.2/System.Threading.ThreadPool.dll": {}, + "ref/netcoreapp2.2/System.Threading.Timer.dll": {}, + "ref/netcoreapp2.2/System.Threading.dll": {}, + "ref/netcoreapp2.2/System.Transactions.Local.dll": {}, + "ref/netcoreapp2.2/System.Transactions.dll": {}, + "ref/netcoreapp2.2/System.ValueTuple.dll": {}, + "ref/netcoreapp2.2/System.Web.HttpUtility.dll": {}, + "ref/netcoreapp2.2/System.Web.dll": {}, + "ref/netcoreapp2.2/System.Windows.dll": {}, + "ref/netcoreapp2.2/System.Xml.Linq.dll": {}, + "ref/netcoreapp2.2/System.Xml.ReaderWriter.dll": {}, + "ref/netcoreapp2.2/System.Xml.Serialization.dll": {}, + "ref/netcoreapp2.2/System.Xml.XDocument.dll": {}, + "ref/netcoreapp2.2/System.Xml.XPath.XDocument.dll": {}, + "ref/netcoreapp2.2/System.Xml.XPath.dll": {}, + "ref/netcoreapp2.2/System.Xml.XmlDocument.dll": {}, + "ref/netcoreapp2.2/System.Xml.XmlSerializer.dll": {}, + "ref/netcoreapp2.2/System.Xml.dll": {}, + "ref/netcoreapp2.2/System.dll": {}, + "ref/netcoreapp2.2/WindowsBase.dll": {}, + "ref/netcoreapp2.2/mscorlib.dll": {}, + "ref/netcoreapp2.2/netstandard.dll": {} + }, + "build": { + "build/netcoreapp2.2/Microsoft.NETCore.App.props": {}, + "build/netcoreapp2.2/Microsoft.NETCore.App.targets": {} + } + }, + "Microsoft.NETCore.DotNetAppHost/2.2.0": { + "type": "package" + }, + "Microsoft.NETCore.DotNetHostPolicy/2.2.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.DotNetHostResolver": "2.2.0" + } + }, + "Microsoft.NETCore.DotNetHostResolver/2.2.0": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.DotNetAppHost": "2.2.0" + } + }, + "Microsoft.NETCore.Platforms/2.2.0": { + "type": "package", + "compile": { + "lib/netstandard1.0/_._": {} + }, + "runtime": { + "lib/netstandard1.0/_._": {} + } + }, + "Microsoft.NETCore.Targets/2.0.0": { + "type": "package", + "compile": { + "lib/netstandard1.0/_._": {} + }, + "runtime": { + "lib/netstandard1.0/_._": {} + } + }, + "NETStandard.Library/2.0.3": { + "type": "package", + "dependencies": { + "Microsoft.NETCore.Platforms": "1.1.0" + }, + "compile": { + "lib/netstandard1.0/_._": {} + }, + "runtime": { + "lib/netstandard1.0/_._": {} + }, + "build": { + "build/netstandard2.0/NETStandard.Library.targets": {} + } + } + } + }, + "libraries": { + "Microsoft.NETCore.App/2.2.0": { + "sha512": "7z5l8Jp324S8bU8+yyWeYHXUFYvKyiI5lqS1dXgTzOx1H69Qbf6df12kCKlNX45LpMfCMd4U3M6p7Rl5Zk7SLA==", + "type": "package", + "path": "microsoft.netcore.app/2.2.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "Microsoft.NETCore.App.versions.txt", + "THIRD-PARTY-NOTICES.TXT", + "build/netcoreapp2.2/Microsoft.NETCore.App.PlatformManifest.txt", + "build/netcoreapp2.2/Microsoft.NETCore.App.props", + "build/netcoreapp2.2/Microsoft.NETCore.App.targets", + "microsoft.netcore.app.2.2.0.nupkg.sha512", + "microsoft.netcore.app.nuspec", + "ref/netcoreapp2.2/Microsoft.CSharp.dll", + "ref/netcoreapp2.2/Microsoft.CSharp.xml", + "ref/netcoreapp2.2/Microsoft.VisualBasic.dll", + "ref/netcoreapp2.2/Microsoft.VisualBasic.xml", + "ref/netcoreapp2.2/Microsoft.Win32.Primitives.dll", + "ref/netcoreapp2.2/Microsoft.Win32.Primitives.xml", + "ref/netcoreapp2.2/System.AppContext.dll", + "ref/netcoreapp2.2/System.Buffers.dll", + "ref/netcoreapp2.2/System.Buffers.xml", + "ref/netcoreapp2.2/System.Collections.Concurrent.dll", + "ref/netcoreapp2.2/System.Collections.Concurrent.xml", + "ref/netcoreapp2.2/System.Collections.Immutable.dll", + "ref/netcoreapp2.2/System.Collections.Immutable.xml", + "ref/netcoreapp2.2/System.Collections.NonGeneric.dll", + "ref/netcoreapp2.2/System.Collections.NonGeneric.xml", + "ref/netcoreapp2.2/System.Collections.Specialized.dll", + "ref/netcoreapp2.2/System.Collections.Specialized.xml", + "ref/netcoreapp2.2/System.Collections.dll", + "ref/netcoreapp2.2/System.Collections.xml", + "ref/netcoreapp2.2/System.ComponentModel.Annotations.dll", + "ref/netcoreapp2.2/System.ComponentModel.Annotations.xml", + "ref/netcoreapp2.2/System.ComponentModel.DataAnnotations.dll", + "ref/netcoreapp2.2/System.ComponentModel.EventBasedAsync.dll", + "ref/netcoreapp2.2/System.ComponentModel.EventBasedAsync.xml", + "ref/netcoreapp2.2/System.ComponentModel.Primitives.dll", + "ref/netcoreapp2.2/System.ComponentModel.Primitives.xml", + "ref/netcoreapp2.2/System.ComponentModel.TypeConverter.dll", + "ref/netcoreapp2.2/System.ComponentModel.TypeConverter.xml", + "ref/netcoreapp2.2/System.ComponentModel.dll", + "ref/netcoreapp2.2/System.ComponentModel.xml", + "ref/netcoreapp2.2/System.Configuration.dll", + "ref/netcoreapp2.2/System.Console.dll", + "ref/netcoreapp2.2/System.Console.xml", + "ref/netcoreapp2.2/System.Core.dll", + "ref/netcoreapp2.2/System.Data.Common.dll", + "ref/netcoreapp2.2/System.Data.Common.xml", + "ref/netcoreapp2.2/System.Data.dll", + "ref/netcoreapp2.2/System.Diagnostics.Contracts.dll", + "ref/netcoreapp2.2/System.Diagnostics.Contracts.xml", + "ref/netcoreapp2.2/System.Diagnostics.Debug.dll", + "ref/netcoreapp2.2/System.Diagnostics.Debug.xml", + "ref/netcoreapp2.2/System.Diagnostics.DiagnosticSource.dll", + "ref/netcoreapp2.2/System.Diagnostics.DiagnosticSource.xml", + "ref/netcoreapp2.2/System.Diagnostics.FileVersionInfo.dll", + "ref/netcoreapp2.2/System.Diagnostics.FileVersionInfo.xml", + "ref/netcoreapp2.2/System.Diagnostics.Process.dll", + "ref/netcoreapp2.2/System.Diagnostics.Process.xml", + "ref/netcoreapp2.2/System.Diagnostics.StackTrace.dll", + "ref/netcoreapp2.2/System.Diagnostics.StackTrace.xml", + "ref/netcoreapp2.2/System.Diagnostics.TextWriterTraceListener.dll", + "ref/netcoreapp2.2/System.Diagnostics.TextWriterTraceListener.xml", + "ref/netcoreapp2.2/System.Diagnostics.Tools.dll", + "ref/netcoreapp2.2/System.Diagnostics.Tools.xml", + "ref/netcoreapp2.2/System.Diagnostics.TraceSource.dll", + "ref/netcoreapp2.2/System.Diagnostics.TraceSource.xml", + "ref/netcoreapp2.2/System.Diagnostics.Tracing.dll", + "ref/netcoreapp2.2/System.Diagnostics.Tracing.xml", + "ref/netcoreapp2.2/System.Drawing.Primitives.dll", + "ref/netcoreapp2.2/System.Drawing.Primitives.xml", + "ref/netcoreapp2.2/System.Drawing.dll", + "ref/netcoreapp2.2/System.Dynamic.Runtime.dll", + "ref/netcoreapp2.2/System.Globalization.Calendars.dll", + "ref/netcoreapp2.2/System.Globalization.Extensions.dll", + "ref/netcoreapp2.2/System.Globalization.dll", + "ref/netcoreapp2.2/System.IO.Compression.Brotli.dll", + "ref/netcoreapp2.2/System.IO.Compression.FileSystem.dll", + "ref/netcoreapp2.2/System.IO.Compression.ZipFile.dll", + "ref/netcoreapp2.2/System.IO.Compression.ZipFile.xml", + "ref/netcoreapp2.2/System.IO.Compression.dll", + "ref/netcoreapp2.2/System.IO.Compression.xml", + "ref/netcoreapp2.2/System.IO.FileSystem.DriveInfo.dll", + "ref/netcoreapp2.2/System.IO.FileSystem.DriveInfo.xml", + "ref/netcoreapp2.2/System.IO.FileSystem.Primitives.dll", + "ref/netcoreapp2.2/System.IO.FileSystem.Watcher.dll", + "ref/netcoreapp2.2/System.IO.FileSystem.Watcher.xml", + "ref/netcoreapp2.2/System.IO.FileSystem.dll", + "ref/netcoreapp2.2/System.IO.FileSystem.xml", + "ref/netcoreapp2.2/System.IO.IsolatedStorage.dll", + "ref/netcoreapp2.2/System.IO.IsolatedStorage.xml", + "ref/netcoreapp2.2/System.IO.MemoryMappedFiles.dll", + "ref/netcoreapp2.2/System.IO.MemoryMappedFiles.xml", + "ref/netcoreapp2.2/System.IO.Pipes.dll", + "ref/netcoreapp2.2/System.IO.Pipes.xml", + "ref/netcoreapp2.2/System.IO.UnmanagedMemoryStream.dll", + "ref/netcoreapp2.2/System.IO.dll", + "ref/netcoreapp2.2/System.Linq.Expressions.dll", + "ref/netcoreapp2.2/System.Linq.Expressions.xml", + "ref/netcoreapp2.2/System.Linq.Parallel.dll", + "ref/netcoreapp2.2/System.Linq.Parallel.xml", + "ref/netcoreapp2.2/System.Linq.Queryable.dll", + "ref/netcoreapp2.2/System.Linq.Queryable.xml", + "ref/netcoreapp2.2/System.Linq.dll", + "ref/netcoreapp2.2/System.Linq.xml", + "ref/netcoreapp2.2/System.Memory.dll", + "ref/netcoreapp2.2/System.Memory.xml", + "ref/netcoreapp2.2/System.Net.Http.dll", + "ref/netcoreapp2.2/System.Net.Http.xml", + "ref/netcoreapp2.2/System.Net.HttpListener.dll", + "ref/netcoreapp2.2/System.Net.HttpListener.xml", + "ref/netcoreapp2.2/System.Net.Mail.dll", + "ref/netcoreapp2.2/System.Net.Mail.xml", + "ref/netcoreapp2.2/System.Net.NameResolution.dll", + "ref/netcoreapp2.2/System.Net.NameResolution.xml", + "ref/netcoreapp2.2/System.Net.NetworkInformation.dll", + "ref/netcoreapp2.2/System.Net.NetworkInformation.xml", + "ref/netcoreapp2.2/System.Net.Ping.dll", + "ref/netcoreapp2.2/System.Net.Ping.xml", + "ref/netcoreapp2.2/System.Net.Primitives.dll", + "ref/netcoreapp2.2/System.Net.Primitives.xml", + "ref/netcoreapp2.2/System.Net.Requests.dll", + "ref/netcoreapp2.2/System.Net.Requests.xml", + "ref/netcoreapp2.2/System.Net.Security.dll", + "ref/netcoreapp2.2/System.Net.Security.xml", + "ref/netcoreapp2.2/System.Net.ServicePoint.dll", + "ref/netcoreapp2.2/System.Net.ServicePoint.xml", + "ref/netcoreapp2.2/System.Net.Sockets.dll", + "ref/netcoreapp2.2/System.Net.Sockets.xml", + "ref/netcoreapp2.2/System.Net.WebClient.dll", + "ref/netcoreapp2.2/System.Net.WebClient.xml", + "ref/netcoreapp2.2/System.Net.WebHeaderCollection.dll", + "ref/netcoreapp2.2/System.Net.WebHeaderCollection.xml", + "ref/netcoreapp2.2/System.Net.WebProxy.dll", + "ref/netcoreapp2.2/System.Net.WebProxy.xml", + "ref/netcoreapp2.2/System.Net.WebSockets.Client.dll", + "ref/netcoreapp2.2/System.Net.WebSockets.Client.xml", + "ref/netcoreapp2.2/System.Net.WebSockets.dll", + "ref/netcoreapp2.2/System.Net.WebSockets.xml", + "ref/netcoreapp2.2/System.Net.dll", + "ref/netcoreapp2.2/System.Numerics.Vectors.dll", + "ref/netcoreapp2.2/System.Numerics.Vectors.xml", + "ref/netcoreapp2.2/System.Numerics.dll", + "ref/netcoreapp2.2/System.ObjectModel.dll", + "ref/netcoreapp2.2/System.ObjectModel.xml", + "ref/netcoreapp2.2/System.Reflection.DispatchProxy.dll", + "ref/netcoreapp2.2/System.Reflection.DispatchProxy.xml", + "ref/netcoreapp2.2/System.Reflection.Emit.ILGeneration.dll", + "ref/netcoreapp2.2/System.Reflection.Emit.ILGeneration.xml", + "ref/netcoreapp2.2/System.Reflection.Emit.Lightweight.dll", + "ref/netcoreapp2.2/System.Reflection.Emit.Lightweight.xml", + "ref/netcoreapp2.2/System.Reflection.Emit.dll", + "ref/netcoreapp2.2/System.Reflection.Emit.xml", + "ref/netcoreapp2.2/System.Reflection.Extensions.dll", + "ref/netcoreapp2.2/System.Reflection.Metadata.dll", + "ref/netcoreapp2.2/System.Reflection.Metadata.xml", + "ref/netcoreapp2.2/System.Reflection.Primitives.dll", + "ref/netcoreapp2.2/System.Reflection.Primitives.xml", + "ref/netcoreapp2.2/System.Reflection.TypeExtensions.dll", + "ref/netcoreapp2.2/System.Reflection.TypeExtensions.xml", + "ref/netcoreapp2.2/System.Reflection.dll", + "ref/netcoreapp2.2/System.Resources.Reader.dll", + "ref/netcoreapp2.2/System.Resources.ResourceManager.dll", + "ref/netcoreapp2.2/System.Resources.ResourceManager.xml", + "ref/netcoreapp2.2/System.Resources.Writer.dll", + "ref/netcoreapp2.2/System.Resources.Writer.xml", + "ref/netcoreapp2.2/System.Runtime.CompilerServices.VisualC.dll", + "ref/netcoreapp2.2/System.Runtime.CompilerServices.VisualC.xml", + "ref/netcoreapp2.2/System.Runtime.Extensions.dll", + "ref/netcoreapp2.2/System.Runtime.Extensions.xml", + "ref/netcoreapp2.2/System.Runtime.Handles.dll", + "ref/netcoreapp2.2/System.Runtime.InteropServices.RuntimeInformation.dll", + "ref/netcoreapp2.2/System.Runtime.InteropServices.RuntimeInformation.xml", + "ref/netcoreapp2.2/System.Runtime.InteropServices.WindowsRuntime.dll", + "ref/netcoreapp2.2/System.Runtime.InteropServices.WindowsRuntime.xml", + "ref/netcoreapp2.2/System.Runtime.InteropServices.dll", + "ref/netcoreapp2.2/System.Runtime.InteropServices.xml", + "ref/netcoreapp2.2/System.Runtime.Loader.dll", + "ref/netcoreapp2.2/System.Runtime.Loader.xml", + "ref/netcoreapp2.2/System.Runtime.Numerics.dll", + "ref/netcoreapp2.2/System.Runtime.Numerics.xml", + "ref/netcoreapp2.2/System.Runtime.Serialization.Formatters.dll", + "ref/netcoreapp2.2/System.Runtime.Serialization.Formatters.xml", + "ref/netcoreapp2.2/System.Runtime.Serialization.Json.dll", + "ref/netcoreapp2.2/System.Runtime.Serialization.Json.xml", + "ref/netcoreapp2.2/System.Runtime.Serialization.Primitives.dll", + "ref/netcoreapp2.2/System.Runtime.Serialization.Primitives.xml", + "ref/netcoreapp2.2/System.Runtime.Serialization.Xml.dll", + "ref/netcoreapp2.2/System.Runtime.Serialization.Xml.xml", + "ref/netcoreapp2.2/System.Runtime.Serialization.dll", + "ref/netcoreapp2.2/System.Runtime.dll", + "ref/netcoreapp2.2/System.Runtime.xml", + "ref/netcoreapp2.2/System.Security.Claims.dll", + "ref/netcoreapp2.2/System.Security.Claims.xml", + "ref/netcoreapp2.2/System.Security.Cryptography.Algorithms.dll", + "ref/netcoreapp2.2/System.Security.Cryptography.Algorithms.xml", + "ref/netcoreapp2.2/System.Security.Cryptography.Csp.dll", + "ref/netcoreapp2.2/System.Security.Cryptography.Csp.xml", + "ref/netcoreapp2.2/System.Security.Cryptography.Encoding.dll", + "ref/netcoreapp2.2/System.Security.Cryptography.Encoding.xml", + "ref/netcoreapp2.2/System.Security.Cryptography.Primitives.dll", + "ref/netcoreapp2.2/System.Security.Cryptography.Primitives.xml", + "ref/netcoreapp2.2/System.Security.Cryptography.X509Certificates.dll", + "ref/netcoreapp2.2/System.Security.Cryptography.X509Certificates.xml", + "ref/netcoreapp2.2/System.Security.Principal.dll", + "ref/netcoreapp2.2/System.Security.Principal.xml", + "ref/netcoreapp2.2/System.Security.SecureString.dll", + "ref/netcoreapp2.2/System.Security.dll", + "ref/netcoreapp2.2/System.ServiceModel.Web.dll", + "ref/netcoreapp2.2/System.ServiceProcess.dll", + "ref/netcoreapp2.2/System.Text.Encoding.Extensions.dll", + "ref/netcoreapp2.2/System.Text.Encoding.Extensions.xml", + "ref/netcoreapp2.2/System.Text.Encoding.dll", + "ref/netcoreapp2.2/System.Text.RegularExpressions.dll", + "ref/netcoreapp2.2/System.Text.RegularExpressions.xml", + "ref/netcoreapp2.2/System.Threading.Overlapped.dll", + "ref/netcoreapp2.2/System.Threading.Overlapped.xml", + "ref/netcoreapp2.2/System.Threading.Tasks.Dataflow.dll", + "ref/netcoreapp2.2/System.Threading.Tasks.Dataflow.xml", + "ref/netcoreapp2.2/System.Threading.Tasks.Extensions.dll", + "ref/netcoreapp2.2/System.Threading.Tasks.Extensions.xml", + "ref/netcoreapp2.2/System.Threading.Tasks.Parallel.dll", + "ref/netcoreapp2.2/System.Threading.Tasks.Parallel.xml", + "ref/netcoreapp2.2/System.Threading.Tasks.dll", + "ref/netcoreapp2.2/System.Threading.Tasks.xml", + "ref/netcoreapp2.2/System.Threading.Thread.dll", + "ref/netcoreapp2.2/System.Threading.Thread.xml", + "ref/netcoreapp2.2/System.Threading.ThreadPool.dll", + "ref/netcoreapp2.2/System.Threading.ThreadPool.xml", + "ref/netcoreapp2.2/System.Threading.Timer.dll", + "ref/netcoreapp2.2/System.Threading.Timer.xml", + "ref/netcoreapp2.2/System.Threading.dll", + "ref/netcoreapp2.2/System.Threading.xml", + "ref/netcoreapp2.2/System.Transactions.Local.dll", + "ref/netcoreapp2.2/System.Transactions.Local.xml", + "ref/netcoreapp2.2/System.Transactions.dll", + "ref/netcoreapp2.2/System.ValueTuple.dll", + "ref/netcoreapp2.2/System.Web.HttpUtility.dll", + "ref/netcoreapp2.2/System.Web.HttpUtility.xml", + "ref/netcoreapp2.2/System.Web.dll", + "ref/netcoreapp2.2/System.Windows.dll", + "ref/netcoreapp2.2/System.Xml.Linq.dll", + "ref/netcoreapp2.2/System.Xml.ReaderWriter.dll", + "ref/netcoreapp2.2/System.Xml.ReaderWriter.xml", + "ref/netcoreapp2.2/System.Xml.Serialization.dll", + "ref/netcoreapp2.2/System.Xml.XDocument.dll", + "ref/netcoreapp2.2/System.Xml.XDocument.xml", + "ref/netcoreapp2.2/System.Xml.XPath.XDocument.dll", + "ref/netcoreapp2.2/System.Xml.XPath.XDocument.xml", + "ref/netcoreapp2.2/System.Xml.XPath.dll", + "ref/netcoreapp2.2/System.Xml.XPath.xml", + "ref/netcoreapp2.2/System.Xml.XmlDocument.dll", + "ref/netcoreapp2.2/System.Xml.XmlSerializer.dll", + "ref/netcoreapp2.2/System.Xml.XmlSerializer.xml", + "ref/netcoreapp2.2/System.Xml.dll", + "ref/netcoreapp2.2/System.dll", + "ref/netcoreapp2.2/WindowsBase.dll", + "ref/netcoreapp2.2/mscorlib.dll", + "ref/netcoreapp2.2/netstandard.dll", + "runtime.json" + ] + }, + "Microsoft.NETCore.DotNetAppHost/2.2.0": { + "sha512": "DrhaKInRKKvN6Ns2VNIlC7ZffLOp9THf8cO6X4fytPRJovJUbF49/zzx4WfgX9E44FMsw9hT8hrKiIqDSHvGvA==", + "type": "package", + "path": "microsoft.netcore.dotnetapphost/2.2.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "microsoft.netcore.dotnetapphost.2.2.0.nupkg.sha512", + "microsoft.netcore.dotnetapphost.nuspec", + "runtime.json" + ] + }, + "Microsoft.NETCore.DotNetHostPolicy/2.2.0": { + "sha512": "FJie7IoPZFaPgNDxhZGmDBQP/Bs5vPdfca/G2Wf9gd6LIvMYkZcibtmJwB4tcf4KXkaOYfIOo4Cl9sEPMsSzkw==", + "type": "package", + "path": "microsoft.netcore.dotnethostpolicy/2.2.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "microsoft.netcore.dotnethostpolicy.2.2.0.nupkg.sha512", + "microsoft.netcore.dotnethostpolicy.nuspec", + "runtime.json" + ] + }, + "Microsoft.NETCore.DotNetHostResolver/2.2.0": { + "sha512": "spDm3AJYmebthDNhzY17YLPtvbc+Y1lCLVeiIH1uLJ/hZaM+40pBiPefFR8J1u66Ndkqi8ipR2tEbqPnYnjRhw==", + "type": "package", + "path": "microsoft.netcore.dotnethostresolver/2.2.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "microsoft.netcore.dotnethostresolver.2.2.0.nupkg.sha512", + "microsoft.netcore.dotnethostresolver.nuspec", + "runtime.json" + ] + }, + "Microsoft.NETCore.Platforms/2.2.0": { + "sha512": "T/J+XZo+YheFTJh8/4uoeJDdz5qOmOMkjg6/VL8mHJ9AnP8+fmV/kcbxeXsob0irRNiChf+V0ig1MCRLp/+Kog==", + "type": "package", + "path": "microsoft.netcore.platforms/2.2.0", + "files": [ + ".nupkg.metadata", + ".signature.p7s", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/netstandard1.0/_._", + "microsoft.netcore.platforms.2.2.0.nupkg.sha512", + "microsoft.netcore.platforms.nuspec", + "runtime.json", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "Microsoft.NETCore.Targets/2.0.0": { + "sha512": "odP/tJj1z6GylFpNo7pMtbd/xQgTC3Ex2If63dRTL38bBNMwsBnJ+RceUIyHdRBC0oik/3NehYT+oECwBhIM3Q==", + "type": "package", + "path": "microsoft.netcore.targets/2.0.0", + "files": [ + ".nupkg.metadata", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "lib/netstandard1.0/_._", + "microsoft.netcore.targets.2.0.0.nupkg.sha512", + "microsoft.netcore.targets.nuspec", + "runtime.json", + "useSharedDesignerContext.txt", + "version.txt" + ] + }, + "NETStandard.Library/2.0.3": { + "sha512": "st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "type": "package", + "path": "netstandard.library/2.0.3", + "files": [ + ".nupkg.metadata", + "LICENSE.TXT", + "THIRD-PARTY-NOTICES.TXT", + "build/netstandard2.0/NETStandard.Library.targets", + "build/netstandard2.0/ref/Microsoft.Win32.Primitives.dll", + "build/netstandard2.0/ref/System.AppContext.dll", + "build/netstandard2.0/ref/System.Collections.Concurrent.dll", + "build/netstandard2.0/ref/System.Collections.NonGeneric.dll", + "build/netstandard2.0/ref/System.Collections.Specialized.dll", + "build/netstandard2.0/ref/System.Collections.dll", + "build/netstandard2.0/ref/System.ComponentModel.Composition.dll", + "build/netstandard2.0/ref/System.ComponentModel.EventBasedAsync.dll", + "build/netstandard2.0/ref/System.ComponentModel.Primitives.dll", + "build/netstandard2.0/ref/System.ComponentModel.TypeConverter.dll", + "build/netstandard2.0/ref/System.ComponentModel.dll", + "build/netstandard2.0/ref/System.Console.dll", + "build/netstandard2.0/ref/System.Core.dll", + "build/netstandard2.0/ref/System.Data.Common.dll", + "build/netstandard2.0/ref/System.Data.dll", + "build/netstandard2.0/ref/System.Diagnostics.Contracts.dll", + "build/netstandard2.0/ref/System.Diagnostics.Debug.dll", + "build/netstandard2.0/ref/System.Diagnostics.FileVersionInfo.dll", + "build/netstandard2.0/ref/System.Diagnostics.Process.dll", + "build/netstandard2.0/ref/System.Diagnostics.StackTrace.dll", + "build/netstandard2.0/ref/System.Diagnostics.TextWriterTraceListener.dll", + "build/netstandard2.0/ref/System.Diagnostics.Tools.dll", + "build/netstandard2.0/ref/System.Diagnostics.TraceSource.dll", + "build/netstandard2.0/ref/System.Diagnostics.Tracing.dll", + "build/netstandard2.0/ref/System.Drawing.Primitives.dll", + "build/netstandard2.0/ref/System.Drawing.dll", + "build/netstandard2.0/ref/System.Dynamic.Runtime.dll", + "build/netstandard2.0/ref/System.Globalization.Calendars.dll", + "build/netstandard2.0/ref/System.Globalization.Extensions.dll", + "build/netstandard2.0/ref/System.Globalization.dll", + "build/netstandard2.0/ref/System.IO.Compression.FileSystem.dll", + "build/netstandard2.0/ref/System.IO.Compression.ZipFile.dll", + "build/netstandard2.0/ref/System.IO.Compression.dll", + "build/netstandard2.0/ref/System.IO.FileSystem.DriveInfo.dll", + "build/netstandard2.0/ref/System.IO.FileSystem.Primitives.dll", + "build/netstandard2.0/ref/System.IO.FileSystem.Watcher.dll", + "build/netstandard2.0/ref/System.IO.FileSystem.dll", + "build/netstandard2.0/ref/System.IO.IsolatedStorage.dll", + "build/netstandard2.0/ref/System.IO.MemoryMappedFiles.dll", + "build/netstandard2.0/ref/System.IO.Pipes.dll", + "build/netstandard2.0/ref/System.IO.UnmanagedMemoryStream.dll", + "build/netstandard2.0/ref/System.IO.dll", + "build/netstandard2.0/ref/System.Linq.Expressions.dll", + "build/netstandard2.0/ref/System.Linq.Parallel.dll", + "build/netstandard2.0/ref/System.Linq.Queryable.dll", + "build/netstandard2.0/ref/System.Linq.dll", + "build/netstandard2.0/ref/System.Net.Http.dll", + "build/netstandard2.0/ref/System.Net.NameResolution.dll", + "build/netstandard2.0/ref/System.Net.NetworkInformation.dll", + "build/netstandard2.0/ref/System.Net.Ping.dll", + "build/netstandard2.0/ref/System.Net.Primitives.dll", + "build/netstandard2.0/ref/System.Net.Requests.dll", + "build/netstandard2.0/ref/System.Net.Security.dll", + "build/netstandard2.0/ref/System.Net.Sockets.dll", + "build/netstandard2.0/ref/System.Net.WebHeaderCollection.dll", + "build/netstandard2.0/ref/System.Net.WebSockets.Client.dll", + "build/netstandard2.0/ref/System.Net.WebSockets.dll", + "build/netstandard2.0/ref/System.Net.dll", + "build/netstandard2.0/ref/System.Numerics.dll", + "build/netstandard2.0/ref/System.ObjectModel.dll", + "build/netstandard2.0/ref/System.Reflection.Extensions.dll", + "build/netstandard2.0/ref/System.Reflection.Primitives.dll", + "build/netstandard2.0/ref/System.Reflection.dll", + "build/netstandard2.0/ref/System.Resources.Reader.dll", + "build/netstandard2.0/ref/System.Resources.ResourceManager.dll", + "build/netstandard2.0/ref/System.Resources.Writer.dll", + "build/netstandard2.0/ref/System.Runtime.CompilerServices.VisualC.dll", + "build/netstandard2.0/ref/System.Runtime.Extensions.dll", + "build/netstandard2.0/ref/System.Runtime.Handles.dll", + "build/netstandard2.0/ref/System.Runtime.InteropServices.RuntimeInformation.dll", + "build/netstandard2.0/ref/System.Runtime.InteropServices.dll", + "build/netstandard2.0/ref/System.Runtime.Numerics.dll", + "build/netstandard2.0/ref/System.Runtime.Serialization.Formatters.dll", + "build/netstandard2.0/ref/System.Runtime.Serialization.Json.dll", + "build/netstandard2.0/ref/System.Runtime.Serialization.Primitives.dll", + "build/netstandard2.0/ref/System.Runtime.Serialization.Xml.dll", + "build/netstandard2.0/ref/System.Runtime.Serialization.dll", + "build/netstandard2.0/ref/System.Runtime.dll", + "build/netstandard2.0/ref/System.Security.Claims.dll", + "build/netstandard2.0/ref/System.Security.Cryptography.Algorithms.dll", + "build/netstandard2.0/ref/System.Security.Cryptography.Csp.dll", + "build/netstandard2.0/ref/System.Security.Cryptography.Encoding.dll", + "build/netstandard2.0/ref/System.Security.Cryptography.Primitives.dll", + "build/netstandard2.0/ref/System.Security.Cryptography.X509Certificates.dll", + "build/netstandard2.0/ref/System.Security.Principal.dll", + "build/netstandard2.0/ref/System.Security.SecureString.dll", + "build/netstandard2.0/ref/System.ServiceModel.Web.dll", + "build/netstandard2.0/ref/System.Text.Encoding.Extensions.dll", + "build/netstandard2.0/ref/System.Text.Encoding.dll", + "build/netstandard2.0/ref/System.Text.RegularExpressions.dll", + "build/netstandard2.0/ref/System.Threading.Overlapped.dll", + "build/netstandard2.0/ref/System.Threading.Tasks.Parallel.dll", + "build/netstandard2.0/ref/System.Threading.Tasks.dll", + "build/netstandard2.0/ref/System.Threading.Thread.dll", + "build/netstandard2.0/ref/System.Threading.ThreadPool.dll", + "build/netstandard2.0/ref/System.Threading.Timer.dll", + "build/netstandard2.0/ref/System.Threading.dll", + "build/netstandard2.0/ref/System.Transactions.dll", + "build/netstandard2.0/ref/System.ValueTuple.dll", + "build/netstandard2.0/ref/System.Web.dll", + "build/netstandard2.0/ref/System.Windows.dll", + "build/netstandard2.0/ref/System.Xml.Linq.dll", + "build/netstandard2.0/ref/System.Xml.ReaderWriter.dll", + "build/netstandard2.0/ref/System.Xml.Serialization.dll", + "build/netstandard2.0/ref/System.Xml.XDocument.dll", + "build/netstandard2.0/ref/System.Xml.XPath.XDocument.dll", + "build/netstandard2.0/ref/System.Xml.XPath.dll", + "build/netstandard2.0/ref/System.Xml.XmlDocument.dll", + "build/netstandard2.0/ref/System.Xml.XmlSerializer.dll", + "build/netstandard2.0/ref/System.Xml.dll", + "build/netstandard2.0/ref/System.dll", + "build/netstandard2.0/ref/mscorlib.dll", + "build/netstandard2.0/ref/netstandard.dll", + "build/netstandard2.0/ref/netstandard.xml", + "lib/netstandard1.0/_._", + "netstandard.library.2.0.3.nupkg.sha512", + "netstandard.library.nuspec" + ] + } + }, + "projectFileDependencyGroups": { + ".NETCoreApp,Version=v2.2": [ + "Microsoft.NETCore.App >= 2.2.0" + ] + }, + "packageFolders": { + "/Users/ben/.nuget/packages/": {}, + "/usr/local/share/dotnet/sdk/NuGetFallbackFolder": {} + }, + "project": { + "version": "1.0.0", + "restore": { + "projectUniqueName": "/Users/ben/.vim/bundle/vimspector/support/test/csharp/csharp.csproj", + "projectName": "csharp", + "projectPath": "/Users/ben/.vim/bundle/vimspector/support/test/csharp/csharp.csproj", + "packagesPath": "/Users/ben/.nuget/packages/", + "outputPath": "/Users/ben/.vim/bundle/vimspector/support/test/csharp/obj/", + "projectStyle": "PackageReference", + "fallbackFolders": [ + "/usr/local/share/dotnet/sdk/NuGetFallbackFolder" + ], + "configFilePaths": [ + "/Users/ben/.nuget/NuGet/NuGet.Config" + ], + "originalTargetFrameworks": [ + "netcoreapp2.2" + ], + "sources": { + "https://api.nuget.org/v3/index.json": {} + }, + "frameworks": { + "netcoreapp2.2": { + "projectReferences": {} + } + }, + "warningProperties": { + "warnAsError": [ + "NU1605" + ] + } + }, + "frameworks": { + "netcoreapp2.2": { + "dependencies": { + "Microsoft.NETCore.App": { + "suppressParent": "All", + "target": "Package", + "version": "[2.2.0, )", + "autoReferenced": true + } + }, + "imports": [ + "net461", + "net462", + "net47", + "net471", + "net472", + "net48" + ], + "assetTargetFallback": true, + "warn": true, + "runtimeIdentifierGraphPath": "/usr/local/share/dotnet/sdk/3.1.402/RuntimeIdentifierGraph.json" + } + } + } +} \ No newline at end of file diff --git a/support/test/go/name-starts-with-vowel/.vimspector.json b/support/test/go/name-starts-with-vowel/.vimspector.json deleted file mode 100644 index ffcfc93..0000000 --- a/support/test/go/name-starts-with-vowel/.vimspector.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "configurations": { - "run-cmd": { - "adapter": "vscode-go", - "configuration": { - "request": "launch", - "program": "${workspaceRoot}/cmd/namestartswithvowel/main.go", - "mode": "debug", - "dlvToolPath": "$HOME/go/bin/dlv", - "dlvLoadConfig": { - "maxArrayValues": 1000, - "maxStringLen": 1000 - } - } - }, - "test-current-file": { - "adapter": "vscode-go", - "configuration": { - "request": "launch", - "mode": "test", - "program": "${fileDirname}", - "cwd": "${fileDirname}", - "dlvToolPath": "$GOPATH/bin/dlv", - "env": {}, - "args": [] - } - } - } -} diff --git a/support/test/go/name-starts-with-vowel/README.md b/support/test/go/name-starts-with-vowel/README.md deleted file mode 100644 index fec967e..0000000 --- a/support/test/go/name-starts-with-vowel/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# Purpose - -This example comes with two example vimspector configs for the Go programming language. - -1) `run-cmd` will launch the main programme under `cmd/namestartswithvowel`. -1) `test-current-file` will run the tests in the current file in debug mode. - -## Example use-cases - -### run-cmd - -* Open `cmd/namestartswithvowel/main.go` -* Add a breakpoint somewhere within the programme -* Start the debugger (`:call vimspector#Continue()` or your relevant keymapping) -* Select the first launch configuration (`1: run-cmd`) - -### test-current-file - -* Open `internal/vowels/vowels_test.go` -* Add a breakpoint somewhere within the test -* Start the debugger (`:call vimspector#Continue()` or your relevant keymapping) -* Select the second launch configuration (`2: test-current-file`) - -## Additional Configuration - -There are two additional configuration options specified under `run-cmd`; these parameters configure the maximum string/array size to be shown while debugging. - -``` -"dlvLoadConfig": { - "maxArrayValues": 1000, - "maxStringLen": 1000 -} -``` diff --git a/support/test/go/name-starts-with-vowel/cmd/namestartswithvowel/main.go b/support/test/go/name-starts-with-vowel/cmd/namestartswithvowel/main.go deleted file mode 100644 index c160aea..0000000 --- a/support/test/go/name-starts-with-vowel/cmd/namestartswithvowel/main.go +++ /dev/null @@ -1,20 +0,0 @@ -package main - -import ( - "fmt" - - "example.com/internal/vowels" -) - -func main() { - names := []string{"Simon", "Bob", "Jennifer", "Amy", "Duke", "Elizabeth"} - - for _, n := range names { - if vowels.NameStartsWithVowel(n) { - fmt.Printf("%s starts with a vowel!\n", n) - continue - } - - fmt.Printf("%s does not start with a vowel!\n", n) - } -} diff --git a/support/test/go/name-starts-with-vowel/go.mod b/support/test/go/name-starts-with-vowel/go.mod deleted file mode 100644 index 3070734..0000000 --- a/support/test/go/name-starts-with-vowel/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module example.com - -go 1.16 diff --git a/support/test/go/name-starts-with-vowel/internal/vowels/vowels.go b/support/test/go/name-starts-with-vowel/internal/vowels/vowels.go deleted file mode 100644 index 4e76480..0000000 --- a/support/test/go/name-starts-with-vowel/internal/vowels/vowels.go +++ /dev/null @@ -1,9 +0,0 @@ -package vowels - -import "strings" - -func NameStartsWithVowel(name string) bool { - s := strings.Split(strings.ToLower(name), "") - - return s[0] == "a" || s[0] == "e" || s[0] == "i" || s[0] == "o" || s[0] == "u" -} diff --git a/support/test/go/name-starts-with-vowel/internal/vowels/vowels_test.go b/support/test/go/name-starts-with-vowel/internal/vowels/vowels_test.go deleted file mode 100644 index e0d5773..0000000 --- a/support/test/go/name-starts-with-vowel/internal/vowels/vowels_test.go +++ /dev/null @@ -1,30 +0,0 @@ -package vowels - -import ( - "fmt" - "testing" -) - -func TestNameStartsWithVowel(t *testing.T) { - testCases := []struct { - input string - expectedOutput bool - }{ - { - input: "Simon", - expectedOutput: false, - }, - { - input: "Andy", - expectedOutput: true, - }, - } - for _, tt := range testCases { - t.Run(fmt.Sprintf("%s should product %t", tt.input, tt.expectedOutput), func(t *testing.T) { - out := NameStartsWithVowel(tt.input) - if out != tt.expectedOutput { - t.Errorf("%s produced %t, when %t was expected", tt.input, out, tt.expectedOutput) - } - }) - } -} diff --git a/support/test/python/multiprocessing/.vimspector.json b/support/test/python/multiprocessing/.vimspector.json new file mode 100644 index 0000000..6eee4c7 --- /dev/null +++ b/support/test/python/multiprocessing/.vimspector.json @@ -0,0 +1,43 @@ +{ + "$schema": "https://puremourning.github.io/vimspector/schema/vimspector.schema.json", + "configurations": { + "run": { + "adapter": "debugpy", + "configuration": { + "request": "launch", + "type": "python", + "cwd": "${workspaceRoot}", + "program": "${file}", + "stopOnEntry": true, + "console": "integratedTerminal", + "subProcess": true + }, + "breakpoints": { + "exception": { + "raised": "N", + "uncaught": "Y", + "userUnhandled": "" + } + } + }, + "attach": { + "adapter": "multi-session", + "configuration": { + "request": "attach", + "type": "python", + "cwd": "${workspaceRoot}", + "program": "${file}", + "stopOnEntry": true, + "console": "integratedTerminal", + "subProcess": true + }, + "breakpoints": { + "exception": { + "raised": "N", + "uncaught": "Y", + "userUnhandled": "" + } + } + } + } +} diff --git a/support/test/python/multiprocessing/multiprocessing_test.py b/support/test/python/multiprocessing/multiprocessing_test.py new file mode 100644 index 0000000..c00d86d --- /dev/null +++ b/support/test/python/multiprocessing/multiprocessing_test.py @@ -0,0 +1,18 @@ +import time +import multiprocessing as mp + + +def First(): + for i in range( 10 ): + print( f"in first x {i}" ) + time.sleep( 0.1 ) + + +if __name__ == '__main__': + print( "main" ) + p1 = mp.Process( target=First ) + + p1.start() + p1.join() + + print( "Done" ) diff --git a/support/test/python/simple_python/print_env.py b/support/test/python/simple_python/print_env.py index 4b88f2d..17b6861 100644 --- a/support/test/python/simple_python/print_env.py +++ b/support/test/python/simple_python/print_env.py @@ -6,8 +6,9 @@ import os def Main(): print( os.environ.get( 'Something', 'ERROR' ) ) print( os.environ.get( 'SomethingElse', 'ERROR' ) ) + print( os.environ.get( 'PATH', 'ERROR' ) ) - for k, v in os.environ: + for k, v in os.environ.items(): print( f'{ k } = "{ v }"' ) diff --git a/tests/ci/image/Dockerfile b/tests/ci/image/Dockerfile index 164a5a7..a25febc 100644 --- a/tests/ci/image/Dockerfile +++ b/tests/ci/image/Dockerfile @@ -70,12 +70,6 @@ RUN mkdir -p /home/linuxbrew/.linuxbrew &&\ RUN /home/linuxbrew/.linuxbrew/bin/brew install golang -# dotnet -RUN curl -sSL https://dot.net/v1/dotnet-install.sh \ - | bash /dev/stdin --channel LTS --install-dir /usr/share/dotnet && \ - update-alternatives --install /usr/bin/dotnet dotnet \ - /usr/share/dotnet/dotnet 1 - # clean up RUN /home/linuxbrew/.linuxbrew/bin/brew cleanup && \ rm -rf ~/.cache && \ diff --git a/tests/get_configurations.test.vim b/tests/get_configurations.test.vim index 33e6577..4a37d01 100644 --- a/tests/get_configurations.test.vim +++ b/tests/get_configurations.test.vim @@ -12,7 +12,6 @@ function Test_Get_Configurations() let configs = vimspector#GetConfigurations() call assert_equal([ \ 'launch - netcoredbg', - \ 'launch - netcoredbg - with debug log', \ 'launch - mono', \ ], configs) diff --git a/tests/language_csharp.test.vim b/tests/language_csharp.test.vim deleted file mode 100644 index 64cf954..0000000 --- a/tests/language_csharp.test.vim +++ /dev/null @@ -1,65 +0,0 @@ -function! SetUp() - call vimspector#test#setup#SetUpWithMappings( v:none ) -endfunction - -function! ClearDown() - call vimspector#test#setup#ClearDown() -endfunction - -function! SetUp_Test_Go_Simple() - let g:vimspector_enable_mappings = 'HUMAN' -endfunction - -function! Test_CSharp_Simple() - let fn='Program.cs' - lcd ../support/test/csharp - exe 'edit ' . fn - - call vimspector#SetLineBreakpoint( fn, 31 ) - call vimspector#LaunchWithSettings( { - \ 'configuration': 'launch - netcoredbg' - \ } ) - call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 31, 7 ) - call WaitForAssert( {-> - \ vimspector#test#signs#AssertPCIsAtLineInBuffer( fn, 31 ) - \ } ) - - call vimspector#StepOver() - call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 32, 12 ) - call WaitForAssert( {-> - \ vimspector#test#signs#AssertPCIsAtLineInBuffer( fn, 32 ) - \ } ) - - call vimspector#test#setup#Reset() - - lcd - - %bwipeout! -endfunction - - -function! Test_Run_To_Cursor() - let fn='Program.cs' - lcd ../support/test/csharp - exe 'edit ' . fn - - call vimspector#SetLineBreakpoint( fn, 31 ) - call vimspector#LaunchWithSettings( { - \ 'configuration': 'launch - netcoredbg' - \ } ) - call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 31, 7 ) - call WaitForAssert( {-> - \ vimspector#test#signs#AssertPCIsAtLineInBuffer( fn, 31 ) - \ } ) - - call cursor( 33, 1 ) - call vimspector#RunToCursor() - call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 33, 1 ) - call WaitForAssert( {-> - \ vimspector#test#signs#AssertPCIsAtLineInBuffer( fn, 33 ) - \ } ) - - call vimspector#test#setup#Reset() - lcd - - %bwipeout! -endfunction - diff --git a/tests/language_python.test.vim b/tests/language_python.test.vim index cc49adb..37dcc16 100644 --- a/tests/language_python.test.vim +++ b/tests/language_python.test.vim @@ -107,3 +107,46 @@ function! Test_Python_Remote_Attach() lcd - %bwipeout! endfunction + +function! SetUp_Test_Python_Remote_Attach_With_Run() + let g:vimspector_enable_mappings = 'HUMAN' +endfunction + +function! Test_Python_Remote_Attach_With_Run() + lcd ../support/test/python/simple_python + let fn='main.py' + exe 'edit ' . fn + + call setpos( '.', [ 0, 6, 1 ] ) + + call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 6, 1 ) + call vimspector#test#signs#AssertSignGroupEmptyAtLine( 'VimspectorBP', 6 ) + + " Add the breakpoint + call feedkeys( "\", 'xt' ) + call vimspector#test#signs#AssertSignGroupSingletonAtLine( 'VimspectorBP', + \ 6, + \ 'vimspectorBP', + \ 9 ) + + call setpos( '.', [ 0, 1, 1 ] ) + + " Here we go. Start Debugging (note will wait up to 10s for the script to do + " its virtualenv thing) + call vimspector#LaunchWithSettings( { + \ 'configuration': 'attach-run', + \ } ) + call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 6, 1 ) + + " Step + call feedkeys( "\", 'xt' ) + + call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 7, 1 ) + call WaitForAssert( {-> + \ vimspector#test#signs#AssertPCIsAtLineInBuffer( fn, 7 ) + \ } ) + + call vimspector#test#setup#Reset() + lcd - + %bwipeout! +endfunction diff --git a/tests/lib/plugin/shared.vim b/tests/lib/plugin/shared.vim index f98b8e9..70e297e 100644 --- a/tests/lib/plugin/shared.vim +++ b/tests/lib/plugin/shared.vim @@ -99,7 +99,7 @@ function! ThisTestIsFlaky() let g:test_is_flaky = v:true endfunction -function! AssertMatchList( expected, actual ) abort +function! AssertMatchist( expected, actual ) abort let ret = assert_equal( len( a:expected ), len( a:actual ) ) let len = min( [ len( a:expected ), len( a:actual ) ] ) let idx = 0 diff --git a/tests/stack_trace.test.vim b/tests/stack_trace.test.vim index b5ed795..a65ea5e 100644 --- a/tests/stack_trace.test.vim +++ b/tests/stack_trace.test.vim @@ -30,7 +30,7 @@ function! Test_Multiple_Threads_Continue() call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_l, 1 ) call cursor( 1, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '- Thread [0-9]\+: .* (paused)', \ ' .*: .*@threads.cpp:' . string( thread_l ) @@ -45,7 +45,7 @@ function! Test_Multiple_Threads_Continue() call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_l, 1 ) call cursor( 1, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '- Thread [0-9]\+: .* (paused)', \ ' .*: .*@threads.cpp:' . string( thread_l ) @@ -56,7 +56,7 @@ function! Test_Multiple_Threads_Continue() \ ) \ } ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '+ Thread [0-9]\+: .* (paused)', \ ], @@ -70,7 +70,7 @@ function! Test_Multiple_Threads_Continue() call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_l, 1 ) call cursor( 1, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '- Thread [0-9]\+: .* (paused)', \ ' .*: .*@threads.cpp:' . string( thread_l ) @@ -81,7 +81,7 @@ function! Test_Multiple_Threads_Continue() \ ) \ } ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '+ Thread [0-9]\+: .* (paused)', \ ], @@ -95,7 +95,7 @@ function! Test_Multiple_Threads_Continue() call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_l, 1 ) call cursor( 1, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '- Thread [0-9]\+: .* (paused)', \ ' .*: .*@threads.cpp:' . string( thread_l ) @@ -106,7 +106,7 @@ function! Test_Multiple_Threads_Continue() \ ) \ } ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '+ Thread [0-9]\+: .* (paused)', \ ], @@ -121,7 +121,7 @@ function! Test_Multiple_Threads_Continue() call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_l, 1 ) call cursor( 1, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '- Thread [0-9]\+: .* (paused)', \ ' .*: .*@threads.cpp:' . string( thread_l ) @@ -132,7 +132,7 @@ function! Test_Multiple_Threads_Continue() \ ) \ } ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '+ Thread [0-9]\+: .* (paused)', \ ], @@ -146,7 +146,7 @@ function! Test_Multiple_Threads_Continue() " So we break out of the loop call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, notify_l, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '- Thread [0-9]\+: .* (paused)', \ ' .*: .*@threads.cpp:' . string( notify_l ) @@ -157,7 +157,7 @@ function! Test_Multiple_Threads_Continue() \ ) \ } ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '+ Thread [0-9]\+: .* (paused)', \ ], @@ -192,7 +192,7 @@ function! Test_Multiple_Threads_Step() call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_l, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '- Thread [0-9]\+: .* (paused)', \ ' .*: .*@threads.cpp:' . string( thread_l ) @@ -205,7 +205,7 @@ function! Test_Multiple_Threads_Step() call vimspector#StepOver() call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_n, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '+ Thread [0-9]\+: .* (paused)', \ ], @@ -218,7 +218,7 @@ function! Test_Multiple_Threads_Step() call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_l, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '+ Thread [0-9]\+: .* (paused)', \ ], @@ -230,7 +230,7 @@ function! Test_Multiple_Threads_Step() call vimspector#StepOver() call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_n, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '+ Thread [0-9]\+: .* (paused)', \ '+ Thread [0-9]\+: .* (paused)', @@ -244,7 +244,7 @@ function! Test_Multiple_Threads_Step() call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_l, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '+ Thread [0-9]\+: .* (paused)', \ '+ Thread [0-9]\+: .* (paused)', @@ -257,7 +257,7 @@ function! Test_Multiple_Threads_Step() call vimspector#StepOver() call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_n, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '+ Thread [0-9]\+: .* (paused)', \ '+ Thread [0-9]\+: .* (paused)', @@ -273,7 +273,7 @@ function! Test_Multiple_Threads_Step() call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_l, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '+ Thread [0-9]\+: .* (paused)', \ '+ Thread [0-9]\+: .* (paused)', @@ -287,7 +287,7 @@ function! Test_Multiple_Threads_Step() call vimspector#StepOver() call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_n, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '+ Thread [0-9]\+: .* (paused)', \ '+ Thread [0-9]\+: .* (paused)', @@ -304,7 +304,7 @@ function! Test_Multiple_Threads_Step() call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_l, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '+ Thread [0-9]\+: .* (paused)', \ '+ Thread [0-9]\+: .* (paused)', @@ -319,7 +319,7 @@ function! Test_Multiple_Threads_Step() call vimspector#StepOver() call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, thread_n, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '+ Thread [0-9]\+: .* (paused)', \ '+ Thread [0-9]\+: .* (paused)', @@ -338,7 +338,7 @@ function! Test_Multiple_Threads_Step() " So we break out of the loop call vimspector#test#signs#AssertCursorIsAtLineInBuffer( s:fn, notify_l, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '+ Thread [0-9]\+: .* (paused)', \ '+ Thread [0-9]\+: .* (paused)', @@ -366,7 +366,7 @@ function! Test_UpDownStack() call vimspector#LaunchWithSettings( { 'configuration': 'run' } ) call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 15, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '- Thread 1: MainThread (paused)', \ ' 2: DoSomething@main.py:15', @@ -379,25 +379,11 @@ function! Test_UpDownStack() \ '$' ) \ ) \ } ) - call win_gotoid( g:vimspector_session_windows.stack_trace ) - call WaitForAssert( { -> - \ vimspector#test#signs#AssertSignGroupSingletonAtLine( - \ 'VimspectorStackTrace', - \ 1, - \ 'vimspectorCurrentThread', - \ 200 ) } ) - call WaitForAssert( { -> - \ vimspector#test#signs#AssertSignGroupSingletonAtLine( - \ 'VimspectorStackTrace', - \ 2, - \ 'vimspectorCurrentFrame', - \ 200 ) } ) - wincmd w call vimspector#DownFrame() call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 15, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '- Thread 1: MainThread (paused)', \ ' 2: DoSomething@main.py:15', @@ -410,26 +396,11 @@ function! Test_UpDownStack() \ '$' ) \ ) \ } ) - call win_gotoid( g:vimspector_session_windows.stack_trace ) - call WaitForAssert( { -> - \ vimspector#test#signs#AssertSignGroupSingletonAtLine( - \ 'VimspectorStackTrace', - \ 1, - \ 'vimspectorCurrentThread', - \ 200 ) } ) - call WaitForAssert( { -> - \ vimspector#test#signs#AssertSignGroupSingletonAtLine( - \ 'VimspectorStackTrace', - \ 2, - \ 'vimspectorCurrentFrame', - \ 200 ) } ) - wincmd w - call vimspector#UpFrame() call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 8, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '- Thread 1: MainThread (paused)', \ ' 2: DoSomething@main.py:15', @@ -442,26 +413,11 @@ function! Test_UpDownStack() \ '$' ) \ ) \ } ) - call win_gotoid( g:vimspector_session_windows.stack_trace ) - call WaitForAssert( { -> - \ vimspector#test#signs#AssertSignGroupSingletonAtLine( - \ 'VimspectorStackTrace', - \ 1, - \ 'vimspectorCurrentThread', - \ 200 ) } ) - call WaitForAssert( { -> - \ vimspector#test#signs#AssertSignGroupSingletonAtLine( - \ 'VimspectorStackTrace', - \ 3, - \ 'vimspectorCurrentFrame', - \ 200 ) } ) - wincmd w - call feedkeys( "\VimspectorUpFrame", 'x' ) call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 23, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '- Thread 1: MainThread (paused)', \ ' 2: DoSomething@main.py:15', @@ -474,26 +430,11 @@ function! Test_UpDownStack() \ '$' ) \ ) \ } ) - call win_gotoid( g:vimspector_session_windows.stack_trace ) - call WaitForAssert( { -> - \ vimspector#test#signs#AssertSignGroupSingletonAtLine( - \ 'VimspectorStackTrace', - \ 1, - \ 'vimspectorCurrentThread', - \ 200 ) } ) - call WaitForAssert( { -> - \ vimspector#test#signs#AssertSignGroupSingletonAtLine( - \ 'VimspectorStackTrace', - \ 4, - \ 'vimspectorCurrentFrame', - \ 200 ) } ) - wincmd w - call feedkeys( "\VimspectorDownFrame", 'x' ) call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 8, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '- Thread 1: MainThread (paused)', \ ' 2: DoSomething@main.py:15', @@ -506,26 +447,11 @@ function! Test_UpDownStack() \ '$' ) \ ) \ } ) - call win_gotoid( g:vimspector_session_windows.stack_trace ) - call WaitForAssert( { -> - \ vimspector#test#signs#AssertSignGroupSingletonAtLine( - \ 'VimspectorStackTrace', - \ 1, - \ 'vimspectorCurrentThread', - \ 200 ) } ) - call WaitForAssert( { -> - \ vimspector#test#signs#AssertSignGroupSingletonAtLine( - \ 'VimspectorStackTrace', - \ 3, - \ 'vimspectorCurrentFrame', - \ 200 ) } ) - wincmd w - call vimspector#DownFrame() call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 15, 1 ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '- Thread 1: MainThread (paused)', \ ' 2: DoSomething@main.py:15', @@ -538,21 +464,6 @@ function! Test_UpDownStack() \ '$' ) \ ) \ } ) - call win_gotoid( g:vimspector_session_windows.stack_trace ) - call WaitForAssert( { -> - \ vimspector#test#signs#AssertSignGroupSingletonAtLine( - \ 'VimspectorStackTrace', - \ 1, - \ 'vimspectorCurrentThread', - \ 200 ) } ) - call WaitForAssert( { -> - \ vimspector#test#signs#AssertSignGroupSingletonAtLine( - \ 'VimspectorStackTrace', - \ 2, - \ 'vimspectorCurrentFrame', - \ 200 ) } ) - wincmd w - call vimspector#ClearBreakpoints() diff --git a/tests/testdata/cpp/simple/.vimspector.json b/tests/testdata/cpp/simple/.vimspector.json index 48ce801..0dca061 100644 --- a/tests/testdata/cpp/simple/.vimspector.json +++ b/tests/testdata/cpp/simple/.vimspector.json @@ -12,7 +12,7 @@ "externalConsole": false, "stopAtEntry": true, "stopOnEntry": true, - "MIMode": "${VIMSPECTOR_MIMODE}" + "MImode": "${VIMSPECTOR_MIMODE}" }, "breakpoints": { "exception": { @@ -33,7 +33,7 @@ "externalConsole": false, "stopAtEntry": false, "stopOnEntry": false, - "MIMode": "${VIMSPECTOR_MIMODE}" + "MImode": "${VIMSPECTOR_MIMODE}" }, "breakpoints": { "exception": { @@ -55,7 +55,7 @@ "externalConsole": false, "stopAtEntry": false, "stopOnEntry": false, - "MIMode": "${VIMSPECTOR_MIMODE}" + "MImode": "${VIMSPECTOR_MIMODE}" }, "breakpoints": { "exception": { @@ -82,7 +82,7 @@ "configuration": { "request": "launch", "program": "${workspaceRoot}/${fileBasenameNoExtension}", - "MIMode": "${VIMSPECTOR_MIMODE}", + "MImode": "${VIMSPECTOR_MIMODE}", "externalConsole": false, "args": [ "CALCULATED_LIST", "${CALCULATED_LIST}", diff --git a/tests/variables.test.vim b/tests/variables.test.vim index c00fb7f..c7d373b 100644 --- a/tests/variables.test.vim +++ b/tests/variables.test.vim @@ -194,7 +194,6 @@ function! Test_ExpandVariables() \ [ \ '- Scope: Locals', \ ' *+ t (Test): {...}', - \ '+ Scope: Registers', \ ], \ getbufline( winbufnr( g:vimspector_session_windows.variables ), \ 1, @@ -212,7 +211,7 @@ function! Test_ExpandVariables() call feedkeys( "\", 'xt' ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '- Scope: Locals', \ ' \*- t (Test): {...}', @@ -220,7 +219,6 @@ function! Test_ExpandVariables() \ ' \*- c (char): 0 ''\\0\{1,3}''', \ ' \*- fffff (float): 0', \ ' \*+ another_test (AnotherTest):\( {...}\)\?', - \ '+ Scope: Registers', \ ], \ getbufline( winbufnr( g:vimspector_session_windows.variables ), \ 1, @@ -231,7 +229,7 @@ function! Test_ExpandVariables() " Step - stays expanded call vimspector#StepOver() call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '- Scope: Locals', \ ' - t (Test): {...}', @@ -239,7 +237,6 @@ function! Test_ExpandVariables() \ ' - c (char): 0 ''\\0\{1,3}''', \ ' - fffff (float): 0', \ ' + another_test (AnotherTest):\( {...}\)\?', - \ '+ Scope: Registers', \ ], \ getbufline( winbufnr( g:vimspector_session_windows.variables ), \ 1, @@ -256,7 +253,6 @@ function! Test_ExpandVariables() \ [ \ '- Scope: Locals', \ ' + t (Test): {...}', - \ '+ Scope: Registers', \ ], \ getbufline( winbufnr( g:vimspector_session_windows.variables ), \ 1, @@ -271,7 +267,6 @@ function! Test_ExpandVariables() \ [ \ '- Scope: Locals', \ ' + t (Test): {...}', - \ '+ Scope: Registers', \ ], \ getbufline( winbufnr( g:vimspector_session_windows.variables ), \ 1, @@ -283,7 +278,7 @@ function! Test_ExpandVariables() call setpos( '.', [ 0, 2, 1 ] ) call feedkeys( "\", 'xt' ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '- Scope: Locals', \ ' - t (Test): {...}', @@ -291,7 +286,6 @@ function! Test_ExpandVariables() \ ' \*- c (char): 99 ''c''', \ ' \*- fffff (float): 0', \ ' \*+ another_test (AnotherTest):\( {...}\)\?', - \ '+ Scope: Registers', \ ], \ getbufline( winbufnr( g:vimspector_session_windows.variables ), \ 1, @@ -308,7 +302,6 @@ function! Test_ExpandVariables() \ assert_equal( \ [ \ '+ Scope: Locals', - \ '+ Scope: Registers', \ ], \ getbufline( winbufnr( g:vimspector_session_windows.variables ), \ 1, @@ -323,7 +316,6 @@ function! Test_ExpandVariables() \ assert_equal( \ [ \ '+ Scope: Locals', - \ '+ Scope: Registers', \ ], \ getbufline( winbufnr( g:vimspector_session_windows.variables ), \ 1, @@ -339,7 +331,6 @@ function! Test_ExpandVariables() \ assert_equal( \ [ \ '+ Scope: Locals', - \ '+ Scope: Registers', \ ], \ getbufline( winbufnr( g:vimspector_session_windows.variables ), \ 1, @@ -387,7 +378,7 @@ function! Test_ExpandWatch() call feedkeys( "\", 'xt' ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ 'Watches: ----', \ 'Expression: t', @@ -406,7 +397,7 @@ function! Test_ExpandWatch() " Step - stays expanded call vimspector#StepOver() call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ 'Watches: ----', \ 'Expression: t', @@ -458,7 +449,7 @@ function! Test_ExpandWatch() call setpos( '.', [ 0, 3, 1 ] ) call feedkeys( "\", 'xt' ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ 'Watches: ----', \ 'Expression: t', @@ -616,7 +607,7 @@ function! Test_EvaluateFailure() " Add a wtch call vimspector#AddWatch( 'test' ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ 'Watches: ----', \ 'Expression: test', @@ -667,7 +658,7 @@ function! Test_VariableEval() \ } ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '{...}', \ ' - i: 0', @@ -699,7 +690,7 @@ function! Test_VariableEval() \ } ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '{...}', \ ' - i: 0', @@ -733,7 +724,7 @@ function! Test_VariableEval() \ } ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ 'Evaluation error', \ ], @@ -777,7 +768,7 @@ function! Test_VariableEvalExpand() \ } ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '{...}', \ ' - i: 0', @@ -795,7 +786,7 @@ function! Test_VariableEvalExpand() call feedkeys( "jjjj\", 'xt' ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '{...}', \ ' - i: 0', @@ -815,7 +806,7 @@ function! Test_VariableEvalExpand() call feedkeys( "\", 'xt' ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '{...}', \ ' - i: 0', @@ -855,7 +846,6 @@ function! Test_SetVariableValue_Local() \ [ \ '- Scope: Locals', \ ' *+ t (Test): {...}', - \ '+ Scope: Registers', \ ], \ getbufline( winbufnr( g:vimspector_session_windows.variables ), \ 1, @@ -873,7 +863,7 @@ function! Test_SetVariableValue_Local() call feedkeys( "\", 'xt' ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '- Scope: Locals', \ ' \*- t (Test): {...}', @@ -881,7 +871,6 @@ function! Test_SetVariableValue_Local() \ ' \*- c (char): 0 ''\\0\{1,3}''', \ ' \*- fffff (float): 0', \ ' \*+ another_test (AnotherTest):\( {...}\)\?', - \ '+ Scope: Registers', \ ], \ getbufline( winbufnr( g:vimspector_session_windows.variables ), \ 1, @@ -900,7 +889,7 @@ with mock.patch( 'vimspector.utils.InputSave' ): EOF call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '- Scope: Locals', \ ' \*- t (Test): {...}', @@ -908,7 +897,6 @@ EOF \ ' \*- c (char): 0 ''\\0\{1,3}''', \ ' \*- fffff (float): 0', \ ' \*+ another_test (AnotherTest):\( {...}\)\?', - \ '+ Scope: Registers', \ ], \ getbufline( winbufnr( g:vimspector_session_windows.variables ), \ 1, @@ -920,7 +908,7 @@ EOF call vimspector#SetVariableValue( '1234' ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '- Scope: Locals', \ ' \*- t (Test): {...}', @@ -928,7 +916,6 @@ EOF \ ' \*- c (char): 0 ''\\0\{1,3}''', \ ' \*- fffff (float): 0', \ ' \*+ another_test (AnotherTest):\( {...}\)\?', - \ '+ Scope: Registers', \ ], \ getbufline( winbufnr( g:vimspector_session_windows.variables ), \ 1, @@ -940,7 +927,7 @@ EOF call vimspector#SetVariableValue( 'this is invalid' ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '- Scope: Locals', \ ' \*- t (Test): {...}', @@ -948,7 +935,6 @@ EOF \ ' \*- c (char): 0 ''\\0\{1,3}''', \ ' \*- fffff (float): 0', \ ' \*+ another_test (AnotherTest):\( {...}\)\?', - \ '+ Scope: Registers', \ ], \ getbufline( winbufnr( g:vimspector_session_windows.variables ), \ 1, @@ -997,7 +983,7 @@ function! Test_SetVariableValue_Watch() call feedkeys( "\", 'xt' ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ 'Watches: ----', \ 'Expression: t', @@ -1026,7 +1012,7 @@ EOF call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ 'Watches: ----', \ 'Expression: t', @@ -1046,7 +1032,7 @@ EOF call vimspector#SetVariableValue( '1234' ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ 'Watches: ----', \ 'Expression: t', @@ -1089,7 +1075,7 @@ function! Test_SetVariableValue_Balloon() \ } ) call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '{...}', \ ' - i: 0', @@ -1116,7 +1102,7 @@ with mock.patch( 'vimspector.utils.InputSave' ): EOF call WaitForAssert( {-> - \ AssertMatchList( + \ AssertMatchist( \ [ \ '{...}', \ ' - i: 0',