Updates for latest Python debug adapter

They moved the location of the main application.

But also:

- ignore multiple responses for the same request
- ignore protocol violations for variablesReference (assume 0)
- ignore protocol violations for missing 'name' (assume basename of
path)
This commit is contained in:
Ben Jackson 2018-12-20 13:42:58 +00:00
commit 673de95283
8 changed files with 43 additions and 15 deletions

View file

@ -142,6 +142,8 @@ class DebugAdapterConnection( object ):
payload = str( self._buffer[ : content_length ], 'utf-8' )
self._buffer = self._buffer[ content_length : ]
self._logger.debug( 'Message received (raw): %s', payload )
message = json.loads( payload )
self._logger.debug( 'Message received: {0}'.format( message ) )
@ -157,7 +159,16 @@ class DebugAdapterConnection( object ):
return
if message[ 'type' ] == 'response':
request = self._outstanding_requests.pop( message[ 'request_seq' ] )
try:
request = self._outstanding_requests.pop( message[ 'request_seq' ] )
except KeyError:
# Sigh. It looks like the ms python debug adapter sends duplicate
# initialize responses.
utils.UserMessage(
"Protocol error: duplicate response for request {}".format(
message[ 'request_seq' ] ) )
self._logger.exception( 'Duplicate response: {}'.format( message ) )
return
if message[ 'success' ]:
if request.handler:

View file

@ -516,6 +516,19 @@ class DebugSession( object ):
self._connection.DoResponse( message, None, response )
def OnEvent_exited( self, message ):
utils.UserMessage( 'The debugee exited with status code: {}'.format(
message[ 'body' ][ 'exitCode' ] ) )
def OnEvent_process( self, message ):
utils.UserMessage( 'The debugee was started: {}'.format(
message[ 'body' ][ 'name' ] ) )
def OnEvent_module( self, message ):
pass
def OnEvent_continued( self, message ):
pass
def Clear( self ):
self._codeView.Clear()

View file

@ -88,8 +88,12 @@ class OutputView( object ):
def print_result( message ):
utils.AppendToBuffer( console,
'Evaluated: ' + expression )
utils.AppendToBuffer( console,
' Result: ' + message[ 'body' ][ 'result' ] )
result = message[ 'body' ][ 'result' ]
if message[ 'body' ].get( 'result' ) is None:
result = 'null'
utils.AppendToBuffer( console, ' Result: ' + result )
self._connection.DoRequest( print_result, {
'command': 'evaluate',

View file

@ -14,6 +14,7 @@
# limitations under the License.
import vim
import os
from vimspector import utils
@ -196,6 +197,9 @@ class StackTraceView( object ):
else:
source = { 'name': '<unknown>' }
if 'name' not in source:
source[ 'name' ] = os.path.basename( source[ 'path' ] )
line = utils.AppendToBuffer(
self._buf,
' {0}: {1}@{2}:{3}'.format( frame[ 'id' ],

View file

@ -214,10 +214,7 @@ class VariablesView( object ):
view.draw()
return
# Expand. (only if there is anything to expand)
if 'variablesReference' not in variable:
return
if variable[ 'variablesReference' ] <= 0:
if variable.get( 'variablesReference', 0 ) <= 0:
return
variable[ '_expanded' ] = True
@ -236,7 +233,7 @@ class VariablesView( object ):
view.win.buffer,
'{indent}{icon} {name} ({type_}): {value}'.format(
indent = ' ' * indent,
icon = '+' if ( variable[ 'variablesReference' ] > 0 and
icon = '+' if ( variable.get( 'variablesReference', 0 ) > 0 and
'_variables' not in variable ) else '-',
name = variable[ 'name' ],
type_ = variable.get( 'type', '<unknown type>' ),
@ -275,7 +272,7 @@ class VariablesView( object ):
self._DrawWatchResult( 2, watch )
def _DrawScope( self, indent, scope ):
icon = '+' if ( scope[ 'variablesReference' ] > 0 and
icon = '+' if ( scope.get( 'variablesReference', 0 ) > 0 and
'_variables' not in scope ) else '-'
line = utils.AppendToBuffer( self._vars.win.buffer,
@ -294,7 +291,7 @@ class VariablesView( object ):
result = watch[ '_result' ]
icon = '+' if ( result[ 'variablesReference' ] > 0 and
icon = '+' if ( result.get( 'variablesReference', 0 ) > 0 and
'_variables' not in result ) else '-'
line = '{0}{1} Result: {2} '.format( ' ' * indent,
@ -347,7 +344,6 @@ class VariablesView( object ):
# TODO: this result count be expandable, but we have no way to allow the
# user to interact with the balloon to expand it.
body = message[ 'body' ]
ref = body.get( 'variablesReference', 0 )
display = [
'Type: ' + body.get( 'type', '<unknown>' ),
'Value: ' + body[ 'result' ]