From adfce8d30e7e30512ffd0dc5eeca23b105725598 Mon Sep 17 00:00:00 2001 From: Ben Jackson Date: Wed, 31 Jul 2019 17:53:50 +0100 Subject: [PATCH 1/6] First attempt to make vscode-go work --- install_gadget.py | 39 +++++++++++++++----- support/test/go/hello_world/.gitignore | 1 + support/test/go/hello_world/.vimspector.json | 14 +++++++ support/test/go/hello_world/hello-world.go | 6 +++ 4 files changed, 51 insertions(+), 9 deletions(-) create mode 100644 support/test/go/hello_world/.gitignore create mode 100644 support/test/go/hello_world/.vimspector.json create mode 100644 support/test/go/hello_world/hello-world.go diff --git a/install_gadget.py b/install_gadget.py index 4660af4..d3af082 100755 --- a/install_gadget.py +++ b/install_gadget.py @@ -43,8 +43,8 @@ GADGETS = { 'vscode-cpptools': { 'language': 'c', 'download': { - 'url': ( 'https://github.com/Microsoft/vscode-cpptools/releases/download/' - '${version}/${file_name}' ), + 'url': 'https://github.com/Microsoft/vscode-cpptools/releases/download/' + '${version}/${file_name}', }, 'do': lambda name, root: InstallCppTools( name, root ), 'all': { @@ -80,8 +80,8 @@ GADGETS = { 'vscode-python': { 'language': 'python', 'download': { - 'url': ( 'https://github.com/Microsoft/vscode-python/releases/download/' - '${version}/${file_name}' ), + 'url': 'https://github.com/Microsoft/vscode-python/releases/download/' + '${version}/${file_name}', }, 'all': { 'version': '2019.5.17059', @@ -111,8 +111,8 @@ GADGETS = { 'language': 'csharp', 'enabled': False, 'download': { - 'url': ( 'https://github.com/Samsung/netcoredbg/releases/download/latest/' - '${file_name}' ), + 'url': 'https://github.com/Samsung/netcoredbg/releases/download/latest/' + '${file_name}', 'format': 'tar', }, 'all': { @@ -175,15 +175,36 @@ GADGETS = { 'vscode-bash-debug': { 'language': 'bash', 'download': { - 'url': ( 'https://github.com/rogalmic/vscode-bash-debug/releases/' - 'download/${version}/${file_name}' ), + 'url': 'https://github.com/rogalmic/vscode-bash-debug/releases/' + 'download/${version}/${file_name}', }, 'all': { 'file_name': 'bash-debug-0.3.5.vsix', 'version': 'v0.3.5', 'checksum': '', } - } + }, + 'vscode-go': { + 'language': 'go', + 'download': { + 'url': 'https://github.com/microsoft/vscode-go/releases/download/' + '${version}/${file_name}' + }, + 'all': { + 'version': '0.11.4', + 'file_name': 'Go-0.11.4.vsix', + 'checksum': '' + }, + 'adapters': { + 'vscode-go': { + 'name': 'delve', + 'command': [ + 'node', + '${gadgetDir}/vscode-go/out/src/debugAdapter/goDebug.js' + ], + }, + }, + }, } diff --git a/support/test/go/hello_world/.gitignore b/support/test/go/hello_world/.gitignore new file mode 100644 index 0000000..242c034 --- /dev/null +++ b/support/test/go/hello_world/.gitignore @@ -0,0 +1 @@ +hello_world diff --git a/support/test/go/hello_world/.vimspector.json b/support/test/go/hello_world/.vimspector.json new file mode 100644 index 0000000..7934b48 --- /dev/null +++ b/support/test/go/hello_world/.vimspector.json @@ -0,0 +1,14 @@ +{ + "configurations": { + "run": { + "adapter": "vscode-go", + "configuration": { + "request": "launch", + "program": "${workspaceRoot}/hello-world.go", + "mode": "debug", + "dlvToolPath": "$HOME/go/bin/dlv", + "trace": true + } + } + } +} diff --git a/support/test/go/hello_world/hello-world.go b/support/test/go/hello_world/hello-world.go new file mode 100644 index 0000000..673d1b2 --- /dev/null +++ b/support/test/go/hello_world/hello-world.go @@ -0,0 +1,6 @@ +package main +import "fmt" +func main() { + var v = "test" + fmt.Println("hello world: " + v) +} From b6a2e3df9e418ec405ea42ab1b657bfa74849147 Mon Sep 17 00:00:00 2001 From: Ben Jackson Date: Wed, 31 Jul 2019 19:02:09 +0100 Subject: [PATCH 2/6] Delay configurationDone until we have received _responses_ to the breakpoint requests, as go server seems to require this --- python3/vimspector/breakpoints.py | 24 ++++++++++++++++++++---- python3/vimspector/debug_session.py | 23 ++++++++++++----------- 2 files changed, 32 insertions(+), 15 deletions(-) diff --git a/python3/vimspector/breakpoints.py b/python3/vimspector/breakpoints.py index 7973032..56f8170 100644 --- a/python3/vimspector/breakpoints.py +++ b/python3/vimspector/breakpoints.py @@ -187,12 +187,22 @@ class ProjectBreakpoints( object ): self._breakpoints_handler = handler - def SendBreakpoints( self ): + def SendBreakpoints( self, doneHandler = None ): assert self._breakpoints_handler is not None # Clear any existing breakpoints prior to sending new ones self._breakpoints_handler.ClearBreakpoints() + awaiting = 0 + def response_handler( source, msg ): + if msg: + self._breakpoints_handler.AddBreakpoints( source, msg ) + nonlocal awaiting + awaiting = awaiting - 1 + if awaiting == 0 and doneHandler: + doneHandler() + + for file_name, line_breakpoints in self._line_breakpoints.items(): breakpoints = [] for bp in line_breakpoints: @@ -211,8 +221,9 @@ class ProjectBreakpoints( object ): 'path': file_name, } + awaiting = awaiting + 1 self._connection.DoRequest( - lambda msg: self._breakpoints_handler.AddBreakpoints( source, msg ), + lambda msg: response_handler( source, msg ), { 'command': 'setBreakpoints', 'arguments': { @@ -224,8 +235,9 @@ class ProjectBreakpoints( object ): ) if self._server_capabilities.get( 'supportsFunctionBreakpoints' ): + awaiting = awaiting + 1 self._connection.DoRequest( - lambda msg: self._breakpoints_handler.AddBreakpoints( None, msg ), + lambda msg: response_handler( None, msg ), { 'command': 'setFunctionBreakpoints', 'arguments': { @@ -241,14 +253,18 @@ class ProjectBreakpoints( object ): self._SetUpExceptionBreakpoints() if self._exceptionBreakpoints: + awaiting = awaiting + 1 self._connection.DoRequest( - None, # There is nothing on the response to this + lambda msg: response_handler( None, None ), { 'command': 'setExceptionBreakpoints', 'arguments': self._exceptionBreakpoints } ) + if awaiting == 0 and doneHandler: + doneHandler() + def _SetUpExceptionBreakpoints( self ): exceptionBreakpointFilters = self._server_capabilities.get( diff --git a/python3/vimspector/debug_session.py b/python3/vimspector/debug_session.py index a9dee09..64d14df 100644 --- a/python3/vimspector/debug_session.py +++ b/python3/vimspector/debug_session.py @@ -683,18 +683,19 @@ class DebugSession( object ): def OnEvent_initialized( self, message ): - self._codeView.ClearBreakpoints() - self._breakpoints.SendBreakpoints() + def onBreakpointsDone(): + if self._server_capabilities.get( 'supportsConfigurationDoneRequest' ): + self._connection.DoRequest( + lambda msg: self._OnInitializeComplete(), + { + 'command': 'configurationDone', + } + ) + else: + self._OnInitializeComplete() - if self._server_capabilities.get( 'supportsConfigurationDoneRequest' ): - self._connection.DoRequest( - lambda msg: self._OnInitializeComplete(), - { - 'command': 'configurationDone', - } - ) - else: - self._OnInitializeComplete() + self._codeView.ClearBreakpoints() + self._breakpoints.SendBreakpoints( onBreakpointsDone ) def OnEvent_thread( self, message ): self._stackTraceView.OnThreadEvent( message[ 'body' ] ) From 9676228e64b4bf4ff42a3d2ab924d4deedca211f Mon Sep 17 00:00:00 2001 From: Ben Jackson Date: Wed, 31 Jul 2019 19:10:33 +0100 Subject: [PATCH 3/6] Docs --- README.md | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/README.md b/README.md index 3123858..a42160f 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,7 @@ on a best-efforts basis: - Java (see caveats) - C# (c-sharp) using dotnet core +- Go (requires separate installation of [Delve][]) ## Languages known not to work @@ -158,6 +159,7 @@ The debug adapters themselves have certain runtime dependencies: | Bourne Shell | Experimental | `--all` or `--enable-bash` | vscode-bash-debug | Bash v?? | | C# (dotnet core) | Experimental | `--force-enable-csharp` | netcoredbg | DotNet core | | C# (mono) | Experimental | `--force-enable-csharp` | vscode-mono-debug | Mono | +| Go | Experimental | `--enable-go` | vscode-go | Go, [Delve][] | For other languages, you'll need some other way to install the gadget. @@ -579,6 +581,30 @@ Requires `install_gadget.py --force-enable-c-sharp`. } ``` +* Go + +Requires: + +* `install_gadget.py --enable-go` +* [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 + +```json +{ + "configurations": { + "run": { + "adapter": "vscode-go", + "configuration": { + "request": "launch", + "program": "${fileDirname}", + "mode": "debug", + "dlvToolPath": "$HOME/go/bin/dlv" + } + } + } +} +``` + Also the mock debugger, but that isn't actually useful. ## Partially supported @@ -610,3 +636,5 @@ Copyright © 2018 Ben Jackson [gitter]: https://gitter.im/vimspector/Lobby?utm_source=share-link&utm_medium=link&utm_campaign=share-link [java-debug-server]: https://github.com/Microsoft/java-debug [website]: https://puremourning.github.io/vimspector-web/ +[delve]: https://github.com/go-delve/delve +[delve-install]: https://github.com/go-delve/delve/tree/master/Documentation/installation From 7c709c00034b7639118308174583847d5de76fe9 Mon Sep 17 00:00:00 2001 From: Ben Jackson Date: Wed, 31 Jul 2019 19:12:14 +0100 Subject: [PATCH 4/6] Add checksum --- install_gadget.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/install_gadget.py b/install_gadget.py index d3af082..627a47a 100755 --- a/install_gadget.py +++ b/install_gadget.py @@ -193,7 +193,8 @@ GADGETS = { 'all': { 'version': '0.11.4', 'file_name': 'Go-0.11.4.vsix', - 'checksum': '' + 'checksum': + 'ff7d7b944da5448974cb3a0086f4a2fd48e2086742d9c013d6964283d416027e' }, 'adapters': { 'vscode-go': { From 1b665a1e932256ba1e655c883d33cf74ef5e4776 Mon Sep 17 00:00:00 2001 From: Ben Jackson Date: Wed, 31 Jul 2019 19:14:15 +0100 Subject: [PATCH 5/6] README typo --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a42160f..5ff46d0 100644 --- a/README.md +++ b/README.md @@ -587,7 +587,7 @@ Requires: * `install_gadget.py --enable-go` * [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 +* Delve to be in your PATH, or specify the `dlvToolPath` launch option ```json { From 553eb3cc98ec3a0dd8526e7a3aacccd0258ba04b Mon Sep 17 00:00:00 2001 From: Ben Jackson Date: Wed, 31 Jul 2019 19:19:14 +0100 Subject: [PATCH 6/6] Appease flake8 --- python3/vimspector/breakpoints.py | 1 + 1 file changed, 1 insertion(+) diff --git a/python3/vimspector/breakpoints.py b/python3/vimspector/breakpoints.py index 56f8170..b0347c0 100644 --- a/python3/vimspector/breakpoints.py +++ b/python3/vimspector/breakpoints.py @@ -194,6 +194,7 @@ class ProjectBreakpoints( object ): self._breakpoints_handler.ClearBreakpoints() awaiting = 0 + def response_handler( source, msg ): if msg: self._breakpoints_handler.AddBreakpoints( source, msg )