Merge pull request #84 from puremourning/fid-upstream
A selection of misc fixes and enhancements from ongoing usage
This commit is contained in:
commit
1277ec6347
8 changed files with 128 additions and 81 deletions
|
|
@ -26,6 +26,15 @@ def Settings( **kwargs ):
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
'capabilities': {
|
||||||
|
'textDocument': {
|
||||||
|
'completion': {
|
||||||
|
'completionItem': {
|
||||||
|
'snippetSupport': True
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -107,6 +107,26 @@ GADGETS = {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
'vscode-java-debug': {
|
||||||
|
'language': 'java',
|
||||||
|
'enabled': False,
|
||||||
|
'download': {
|
||||||
|
'url': 'https://github.com/microsoft/vscode-java-debug/releases/download/'
|
||||||
|
'${version}/${file_name}',
|
||||||
|
},
|
||||||
|
'all': {
|
||||||
|
'version': '0.23.0',
|
||||||
|
'file_name': 'vscode-java-debug-0.23.0.vsix',
|
||||||
|
'checksum':
|
||||||
|
'',
|
||||||
|
},
|
||||||
|
'adapters': {
|
||||||
|
"vscode-java": {
|
||||||
|
"name": "vscode-java",
|
||||||
|
"port": "ask",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
'tclpro': {
|
'tclpro': {
|
||||||
'language': 'tcl',
|
'language': 'tcl',
|
||||||
'repo': {
|
'repo': {
|
||||||
|
|
|
||||||
|
|
@ -203,14 +203,18 @@ class ProjectBreakpoints( object ):
|
||||||
|
|
||||||
awaiting = 0
|
awaiting = 0
|
||||||
|
|
||||||
def response_handler( source, msg ):
|
def response_received():
|
||||||
if msg:
|
|
||||||
self._breakpoints_handler.AddBreakpoints( source, msg )
|
|
||||||
nonlocal awaiting
|
nonlocal awaiting
|
||||||
awaiting = awaiting - 1
|
awaiting = awaiting - 1
|
||||||
if awaiting == 0 and doneHandler:
|
if awaiting == 0 and doneHandler:
|
||||||
doneHandler()
|
doneHandler()
|
||||||
|
|
||||||
|
def response_handler( source, msg ):
|
||||||
|
if msg:
|
||||||
|
self._breakpoints_handler.AddBreakpoints( source, msg )
|
||||||
|
response_received()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# TODO: add the _configured_breakpoints to line_breakpoints
|
# TODO: add the _configured_breakpoints to line_breakpoints
|
||||||
# TODO: the line numbers might have changed since pressing the F9 key!
|
# TODO: the line numbers might have changed since pressing the F9 key!
|
||||||
|
|
@ -244,7 +248,8 @@ class ProjectBreakpoints( object ):
|
||||||
'breakpoints': breakpoints,
|
'breakpoints': breakpoints,
|
||||||
},
|
},
|
||||||
'sourceModified': False, # TODO: We can actually check this
|
'sourceModified': False, # TODO: We can actually check this
|
||||||
}
|
},
|
||||||
|
failure_handler = lambda *_: response_received()
|
||||||
)
|
)
|
||||||
|
|
||||||
# TODO: Add the _configured_breakpoints to function breakpoints
|
# TODO: Add the _configured_breakpoints to function breakpoints
|
||||||
|
|
@ -261,7 +266,8 @@ class ProjectBreakpoints( object ):
|
||||||
for bp in self._func_breakpoints if bp[ 'state' ] == 'ENABLED'
|
for bp in self._func_breakpoints if bp[ 'state' ] == 'ENABLED'
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
failure_handler = lambda *_: response_received()
|
||||||
)
|
)
|
||||||
|
|
||||||
if self._exception_breakpoints is None:
|
if self._exception_breakpoints is None:
|
||||||
|
|
@ -274,7 +280,8 @@ class ProjectBreakpoints( object ):
|
||||||
{
|
{
|
||||||
'command': 'setExceptionBreakpoints',
|
'command': 'setExceptionBreakpoints',
|
||||||
'arguments': self._exception_breakpoints
|
'arguments': self._exception_breakpoints
|
||||||
}
|
},
|
||||||
|
failure_handler = lambda *_: response_received()
|
||||||
)
|
)
|
||||||
|
|
||||||
if awaiting == 0 and doneHandler:
|
if awaiting == 0 and doneHandler:
|
||||||
|
|
|
||||||
|
|
@ -473,10 +473,11 @@ class DebugSession( object ):
|
||||||
if 'cwd' not in self._adapter:
|
if 'cwd' not in self._adapter:
|
||||||
self._adapter[ 'cwd' ] = os.getcwd()
|
self._adapter[ 'cwd' ] = os.getcwd()
|
||||||
|
|
||||||
|
vim.vars[ '_vimspector_adapter_spec' ] = self._adapter
|
||||||
channel_send_func = vim.bindeval(
|
channel_send_func = vim.bindeval(
|
||||||
"vimspector#internal#{}#StartDebugSession( {} )".format(
|
"vimspector#internal#{}#StartDebugSession( "
|
||||||
self._connection_type,
|
" g:_vimspector_adapter_spec "
|
||||||
json.dumps( self._adapter ) ) )
|
")".format( self._connection_type ) )
|
||||||
|
|
||||||
if channel_send_func is None:
|
if channel_send_func is None:
|
||||||
self._logger.error( "Unable to start debug server" )
|
self._logger.error( "Unable to start debug server" )
|
||||||
|
|
@ -508,8 +509,8 @@ class DebugSession( object ):
|
||||||
|
|
||||||
# TODO: Use the 'tarminate' request if supportsTerminateRequest set
|
# TODO: Use the 'tarminate' request if supportsTerminateRequest set
|
||||||
|
|
||||||
def _PrepareAttach( self, adapter_config, launch_config ):
|
|
||||||
|
|
||||||
|
def _PrepareAttach( self, adapter_config, launch_config ):
|
||||||
atttach_config = adapter_config.get( 'attach' )
|
atttach_config = adapter_config.get( 'attach' )
|
||||||
|
|
||||||
if not atttach_config:
|
if not atttach_config:
|
||||||
|
|
@ -520,13 +521,9 @@ class DebugSession( object ):
|
||||||
# e.g. expand variables when we use them, not all at once. This would
|
# e.g. expand variables when we use them, not all at once. This would
|
||||||
# remove the whole %PID% hack.
|
# remove the whole %PID% hack.
|
||||||
remote = atttach_config[ 'remote' ]
|
remote = atttach_config[ 'remote' ]
|
||||||
ssh = [ 'ssh' ]
|
ssh = self._GetSSHCommand( remote )
|
||||||
|
|
||||||
if 'account' in remote:
|
|
||||||
ssh.append( remote[ 'account' ] + '@' + remote[ 'host' ] )
|
|
||||||
else:
|
|
||||||
ssh.append( remote[ 'host' ] )
|
|
||||||
|
|
||||||
|
# FIXME: Why does this not use self._GetCommands ?
|
||||||
cmd = ssh + remote[ 'pidCommand' ]
|
cmd = ssh + remote[ 'pidCommand' ]
|
||||||
|
|
||||||
self._logger.debug( 'Getting PID: %s', cmd )
|
self._logger.debug( 'Getting PID: %s', cmd )
|
||||||
|
|
@ -574,12 +571,7 @@ class DebugSession( object ):
|
||||||
|
|
||||||
if 'remote' in run_config:
|
if 'remote' in run_config:
|
||||||
remote = run_config[ 'remote' ]
|
remote = run_config[ 'remote' ]
|
||||||
ssh = [ 'ssh' ]
|
ssh = self._GetSSHCommand( remote )
|
||||||
if 'account' in remote:
|
|
||||||
ssh.append( remote[ 'account' ] + '@' + remote[ 'host' ] )
|
|
||||||
else:
|
|
||||||
ssh.append( remote[ 'host' ] )
|
|
||||||
|
|
||||||
commands = self._GetCommands( remote, 'run' )
|
commands = self._GetCommands( remote, 'run' )
|
||||||
|
|
||||||
for index, command in enumerate( commands ):
|
for index, command in enumerate( commands ):
|
||||||
|
|
@ -599,6 +591,16 @@ class DebugSession( object ):
|
||||||
full_cmd )
|
full_cmd )
|
||||||
|
|
||||||
|
|
||||||
|
def _GetSSHCommand( self, remote ):
|
||||||
|
ssh = [ 'ssh' ] + remote.get( 'ssh', {} ).get( 'args', [] )
|
||||||
|
if 'account' in remote:
|
||||||
|
ssh.append( remote[ 'account' ] + '@' + remote[ 'host' ] )
|
||||||
|
else:
|
||||||
|
ssh.append( remote[ 'host' ] )
|
||||||
|
|
||||||
|
return ssh
|
||||||
|
|
||||||
|
|
||||||
def _GetCommands( self, remote, pfx ):
|
def _GetCommands( self, remote, pfx ):
|
||||||
commands = remote.get( pfx + 'Commands', None )
|
commands = remote.get( pfx + 'Commands', None )
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -115,10 +115,6 @@ class OutputView( object ):
|
||||||
self._ShowOutput( category )
|
self._ShowOutput( category )
|
||||||
|
|
||||||
def Evaluate( self, frame, expression ):
|
def Evaluate( self, frame, expression ):
|
||||||
if not frame:
|
|
||||||
self.Print( 'Console', 'There is no current stack frame' )
|
|
||||||
return
|
|
||||||
|
|
||||||
console = self._buffers[ 'Console' ].buf
|
console = self._buffers[ 'Console' ].buf
|
||||||
utils.AppendToBuffer( console, 'Evaluating: ' + expression )
|
utils.AppendToBuffer( console, 'Evaluating: ' + expression )
|
||||||
|
|
||||||
|
|
@ -132,14 +128,18 @@ class OutputView( object ):
|
||||||
|
|
||||||
utils.AppendToBuffer( console, ' Result: ' + result )
|
utils.AppendToBuffer( console, ' Result: ' + result )
|
||||||
|
|
||||||
self._connection.DoRequest( print_result, {
|
request = {
|
||||||
'command': 'evaluate',
|
'command': 'evaluate',
|
||||||
'arguments': {
|
'arguments': {
|
||||||
'expression': expression,
|
'expression': expression,
|
||||||
'context': 'repl',
|
'context': 'repl',
|
||||||
'frameId': frame[ 'id' ],
|
|
||||||
}
|
}
|
||||||
} )
|
}
|
||||||
|
|
||||||
|
if frame:
|
||||||
|
request[ 'arguments' ][ 'frameId' ] = frame[ 'id' ]
|
||||||
|
|
||||||
|
self._connection.DoRequest( print_result, request )
|
||||||
|
|
||||||
def _ToggleFlag( self, category, flag ):
|
def _ToggleFlag( self, category, flag ):
|
||||||
if self._buffers[ category ].flag != flag:
|
if self._buffers[ category ].flag != flag:
|
||||||
|
|
|
||||||
|
|
@ -172,8 +172,9 @@ class StackTraceView( object ):
|
||||||
if 'line' in frame and frame[ 'line' ] > 0:
|
if 'line' in frame and frame[ 'line' ] > 0:
|
||||||
self._currentFrame = frame
|
self._currentFrame = frame
|
||||||
return self._session.SetCurrentFrame( self._currentFrame )
|
return self._session.SetCurrentFrame( self._currentFrame )
|
||||||
|
return False
|
||||||
|
|
||||||
source = frame.get( 'source', {} )
|
source = frame.get( 'source' ) or {}
|
||||||
if source.get( 'sourceReference', 0 ) > 0:
|
if source.get( 'sourceReference', 0 ) > 0:
|
||||||
def handle_resolved_source( resolved_source ):
|
def handle_resolved_source( resolved_source ):
|
||||||
frame[ 'source' ] = resolved_source
|
frame[ 'source' ] = resolved_source
|
||||||
|
|
|
||||||
|
|
@ -324,10 +324,21 @@ def IsCurrent( window, buf ):
|
||||||
return vim.current.window == window and vim.current.window.buffer == buf
|
return vim.current.window == window and vim.current.window.buffer == buf
|
||||||
|
|
||||||
|
|
||||||
# TODO: Should we just run the substitution on the whole JSON string instead?
|
def ExpandReferencesInObject( obj, mapping, user_choices ):
|
||||||
# That woul dallow expansion in bool and number values, such as ports etc. ?
|
if isinstance( obj, dict ):
|
||||||
def ExpandReferencesInDict( obj, mapping, user_choices ):
|
ExpandReferencesInDict( obj, mapping, user_choices )
|
||||||
def expand_refs_in_string( orig_s ):
|
elif isinstance( obj, list ):
|
||||||
|
for i, _ in enumerate( obj ):
|
||||||
|
# FIXME: We are assuming that it is a list of string, but could be a
|
||||||
|
# list of list of a list of dict, etc.
|
||||||
|
obj[ i ] = ExpandReferencesInObject( obj[ i ], mapping, user_choices )
|
||||||
|
elif isinstance( obj, str ):
|
||||||
|
obj = ExpandReferencesInString( obj, mapping, user_choices )
|
||||||
|
|
||||||
|
return obj
|
||||||
|
|
||||||
|
|
||||||
|
def ExpandReferencesInString( orig_s, mapping, user_choices):
|
||||||
s = os.path.expanduser( orig_s )
|
s = os.path.expanduser( orig_s )
|
||||||
s = os.path.expandvars( s )
|
s = os.path.expandvars( s )
|
||||||
|
|
||||||
|
|
@ -360,21 +371,12 @@ def ExpandReferencesInDict( obj, mapping, user_choices ):
|
||||||
|
|
||||||
return s
|
return s
|
||||||
|
|
||||||
def expand_refs_in_object( obj ):
|
|
||||||
if isinstance( obj, dict ):
|
|
||||||
ExpandReferencesInDict( obj, mapping, user_choices )
|
|
||||||
elif isinstance( obj, list ):
|
|
||||||
for i, _ in enumerate( obj ):
|
|
||||||
# FIXME: We are assuming that it is a list of string, but could be a
|
|
||||||
# list of list of a list of dict, etc.
|
|
||||||
obj[ i ] = expand_refs_in_object( obj[ i ] )
|
|
||||||
elif isinstance( obj, str ):
|
|
||||||
obj = expand_refs_in_string( obj )
|
|
||||||
|
|
||||||
return obj
|
|
||||||
|
|
||||||
|
# TODO: Should we just run the substitution on the whole JSON string instead?
|
||||||
|
# That woul dallow expansion in bool and number values, such as ports etc. ?
|
||||||
|
def ExpandReferencesInDict( obj, mapping, user_choices ):
|
||||||
for k in obj.keys():
|
for k in obj.keys():
|
||||||
obj[ k ] = expand_refs_in_object( obj[ k ] )
|
obj[ k ] = ExpandReferencesInObject( obj[ k ], mapping, user_choices )
|
||||||
|
|
||||||
|
|
||||||
def ParseVariables( variables_list, mapping, user_choices ):
|
def ParseVariables( variables_list, mapping, user_choices ):
|
||||||
|
|
@ -416,7 +418,9 @@ def ParseVariables( variables_list, mapping, user_choices ):
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
"Unsupported variable defn {}: Missing 'shell'".format( n ) )
|
"Unsupported variable defn {}: Missing 'shell'".format( n ) )
|
||||||
else:
|
else:
|
||||||
new_variables[ n ] = v
|
new_variables[ n ] = ExpandReferencesInObject( v,
|
||||||
|
mapping,
|
||||||
|
user_choices )
|
||||||
|
|
||||||
return new_variables
|
return new_variables
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -144,9 +144,11 @@ class VariablesView( object ):
|
||||||
def AddWatch( self, frame, expression ):
|
def AddWatch( self, frame, expression ):
|
||||||
watch = {
|
watch = {
|
||||||
'expression': expression,
|
'expression': expression,
|
||||||
'frameId': frame[ 'id' ],
|
|
||||||
'context': 'watch',
|
'context': 'watch',
|
||||||
}
|
}
|
||||||
|
if frame:
|
||||||
|
watch[ 'frameId' ] = frame[ 'id' ]
|
||||||
|
|
||||||
self._watches.append( watch )
|
self._watches.append( watch )
|
||||||
self.EvaluateWatches()
|
self.EvaluateWatches()
|
||||||
|
|
||||||
|
|
@ -395,3 +397,5 @@ class VariablesView( object ):
|
||||||
|
|
||||||
with utils.LetCurrentWindow( self._watch.win ):
|
with utils.LetCurrentWindow( self._watch.win ):
|
||||||
vim.command( 'set syntax={}'.format( utils.Escape( syntax ) ) )
|
vim.command( 'set syntax={}'.format( utils.Escape( syntax ) ) )
|
||||||
|
|
||||||
|
# vim: sw=2
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue