Merge pull request #72 from puremourning/breakpoints-move
Fix issues with breakpoints not being in the correct location
This commit is contained in:
commit
c02e308d4f
7 changed files with 101 additions and 19 deletions
|
|
@ -24,7 +24,6 @@ things like:
|
||||||
|
|
||||||
Along with optional additional configuration for things like:
|
Along with optional additional configuration for things like:
|
||||||
|
|
||||||
- Function breakpoints
|
|
||||||
- Exception breakpoints
|
- Exception breakpoints
|
||||||
|
|
||||||
### Debug adapter configuration
|
### Debug adapter configuration
|
||||||
|
|
@ -109,6 +108,12 @@ But for now, consider the following example snippet:
|
||||||
"--test-identifier", "${TestIdentifier}",
|
"--test-identifier", "${TestIdentifier}",
|
||||||
"--secret-token", "${SecretToken}"
|
"--secret-token", "${SecretToken}"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
"breakpoints": {
|
||||||
|
"exception": {
|
||||||
|
"caught": "",
|
||||||
|
"uncaught": "Y"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -87,6 +87,7 @@ class ProjectBreakpoints( object ):
|
||||||
else:
|
else:
|
||||||
for file_name, breakpoints in self._line_breakpoints.items():
|
for file_name, breakpoints in self._line_breakpoints.items():
|
||||||
for bp in breakpoints:
|
for bp in breakpoints:
|
||||||
|
self._SignToLine( file_name, bp )
|
||||||
qf.append( {
|
qf.append( {
|
||||||
'filename': file_name,
|
'filename': file_name,
|
||||||
'lnum': bp[ 'line' ],
|
'lnum': bp[ 'line' ],
|
||||||
|
|
@ -113,6 +114,7 @@ class ProjectBreakpoints( object ):
|
||||||
# These are the user-entered breakpoints.
|
# These are the user-entered breakpoints.
|
||||||
for file_name, breakpoints in self._line_breakpoints.items():
|
for file_name, breakpoints in self._line_breakpoints.items():
|
||||||
for bp in breakpoints:
|
for bp in breakpoints:
|
||||||
|
self._SignToLine( file_name, bp )
|
||||||
if 'sign_id' in bp:
|
if 'sign_id' in bp:
|
||||||
vim.command( 'sign unplace {0} group=VimspectorBP'.format(
|
vim.command( 'sign unplace {0} group=VimspectorBP'.format(
|
||||||
bp[ 'sign_id' ] ) )
|
bp[ 'sign_id' ] ) )
|
||||||
|
|
@ -132,6 +134,7 @@ class ProjectBreakpoints( object ):
|
||||||
found_bp = False
|
found_bp = False
|
||||||
action = 'New'
|
action = 'New'
|
||||||
for index, bp in enumerate( self._line_breakpoints[ file_name ] ):
|
for index, bp in enumerate( self._line_breakpoints[ file_name ] ):
|
||||||
|
self._SignToLine( file_name, bp )
|
||||||
if bp[ 'line' ] == line:
|
if bp[ 'line' ] == line:
|
||||||
found_bp = True
|
found_bp = True
|
||||||
if bp[ 'state' ] == 'ENABLED' and not self._connection:
|
if bp[ 'state' ] == 'ENABLED' and not self._connection:
|
||||||
|
|
@ -215,6 +218,7 @@ class ProjectBreakpoints( object ):
|
||||||
for file_name, line_breakpoints in self._line_breakpoints.items():
|
for file_name, line_breakpoints in self._line_breakpoints.items():
|
||||||
breakpoints = []
|
breakpoints = []
|
||||||
for bp in line_breakpoints:
|
for bp in line_breakpoints:
|
||||||
|
self._SignToLine( file_name, bp )
|
||||||
if 'sign_id' in bp:
|
if 'sign_id' in bp:
|
||||||
vim.command( 'sign unplace {0} group=VimspectorBP'.format(
|
vim.command( 'sign unplace {0} group=VimspectorBP'.format(
|
||||||
bp[ 'sign_id' ] ) )
|
bp[ 'sign_id' ] ) )
|
||||||
|
|
@ -301,7 +305,7 @@ class ProjectBreakpoints( object ):
|
||||||
if isinstance( result, bool ):
|
if isinstance( result, bool ):
|
||||||
result = 'Y' if result else 'N'
|
result = 'Y' if result else 'N'
|
||||||
|
|
||||||
if not isinstance( result, str) or result not in ( 'Y', 'N', '' ):
|
if not isinstance( result, str ) or result not in ( 'Y', 'N', '' ):
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"Invalid value for exception breakpoint filter '{f}': "
|
f"Invalid value for exception breakpoint filter '{f}': "
|
||||||
f"'{result}'. Must be boolean, 'Y', 'N' or '' (default)" )
|
f"'{result}'. Must be boolean, 'Y', 'N' or '' (default)" )
|
||||||
|
|
@ -330,6 +334,7 @@ class ProjectBreakpoints( object ):
|
||||||
def _ShowBreakpoints( self ):
|
def _ShowBreakpoints( self ):
|
||||||
for file_name, line_breakpoints in self._line_breakpoints.items():
|
for file_name, line_breakpoints in self._line_breakpoints.items():
|
||||||
for bp in line_breakpoints:
|
for bp in line_breakpoints:
|
||||||
|
self._SignToLine( file_name, bp )
|
||||||
if 'sign_id' in bp:
|
if 'sign_id' in bp:
|
||||||
vim.command( 'sign unplace {0} group=VimspectorBP '.format(
|
vim.command( 'sign unplace {0} group=VimspectorBP '.format(
|
||||||
bp[ 'sign_id' ] ) )
|
bp[ 'sign_id' ] ) )
|
||||||
|
|
@ -344,3 +349,17 @@ class ProjectBreakpoints( object ):
|
||||||
'vimspectorBP' if bp[ 'state' ] == 'ENABLED'
|
'vimspectorBP' if bp[ 'state' ] == 'ENABLED'
|
||||||
else 'vimspectorBPDisabled',
|
else 'vimspectorBPDisabled',
|
||||||
file_name ) )
|
file_name ) )
|
||||||
|
|
||||||
|
|
||||||
|
def _SignToLine( self, file_name, bp ):
|
||||||
|
if 'sign_id' not in bp:
|
||||||
|
return bp[ 'line' ]
|
||||||
|
|
||||||
|
signs = vim.eval( "sign_getplaced( '{}', {} )".format(
|
||||||
|
utils.Escape( file_name ),
|
||||||
|
json.dumps( { 'id': file_name, 'group': 'VimspectorBP', } ) ) )
|
||||||
|
|
||||||
|
if len( signs ) == 1 and len( signs[ 0 ][ 'signs' ] ) == 1:
|
||||||
|
bp[ 'line' ] = int( signs[ 0 ][ 'signs' ][ 0 ][ 'lnum' ] )
|
||||||
|
|
||||||
|
return bp[ 'line' ]
|
||||||
|
|
|
||||||
|
|
@ -4,9 +4,9 @@ RUN_VIM="vim --clean --not-a-term"
|
||||||
RUN_TEST="${RUN_VIM} -S lib/run_test.vim"
|
RUN_TEST="${RUN_VIM} -S lib/run_test.vim"
|
||||||
|
|
||||||
if [ -z "$VIMSPECTOR_MIMODE" ]; then
|
if [ -z "$VIMSPECTOR_MIMODE" ]; then
|
||||||
if which -s lldb; then
|
if which lldb >/dev/null 2>&1; then
|
||||||
export VIMSPECTOR_MIMODE=lldb
|
export VIMSPECTOR_MIMODE=lldb
|
||||||
elif which -s gdb; then
|
elif which gdb >/dev/null 2>&1; then
|
||||||
export VIMSPECTOR_MIMODE=gdb
|
export VIMSPECTOR_MIMODE=gdb
|
||||||
else
|
else
|
||||||
echo "Couldn't guess VIMSPECTOR_MIMODE. Need lldb or gdb in path"
|
echo "Couldn't guess VIMSPECTOR_MIMODE. Need lldb or gdb in path"
|
||||||
|
|
|
||||||
|
|
@ -9,6 +9,12 @@
|
||||||
"program": "${file}",
|
"program": "${file}",
|
||||||
"stopOnEntry": true,
|
"stopOnEntry": true,
|
||||||
"console": "integratedTerminal"
|
"console": "integratedTerminal"
|
||||||
|
},
|
||||||
|
"breakpoints": {
|
||||||
|
"exception": {
|
||||||
|
"raised": "N",
|
||||||
|
"uncaught": ""
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"attach": {
|
"attach": {
|
||||||
|
|
@ -18,6 +24,12 @@
|
||||||
"type": "python",
|
"type": "python",
|
||||||
"host": "localhost",
|
"host": "localhost",
|
||||||
"port": "5678"
|
"port": "5678"
|
||||||
|
},
|
||||||
|
"breakpoints": {
|
||||||
|
"exception": {
|
||||||
|
"raised": "N",
|
||||||
|
"uncaught": ""
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -246,3 +246,52 @@ function Test_DisableBreakpointWhileDebugging()
|
||||||
lcd -
|
lcd -
|
||||||
%bwipeout!
|
%bwipeout!
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
function! SetUp_Test_Insert_Code_Above_Breakpoint()
|
||||||
|
let g:vimspector_enable_mappings = 'HUMAN'
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! Test_Insert_Code_Above_Breakpoint()
|
||||||
|
let fn='main.py'
|
||||||
|
lcd ../support/test/python/simple_python
|
||||||
|
exe 'edit ' . fn
|
||||||
|
call setpos( '.', [ 0, 25, 5 ] )
|
||||||
|
|
||||||
|
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 25, 5 )
|
||||||
|
call vimspector#test#signs#AssertSignGroupEmptyAtLine( 'VimspectorBP', 25 )
|
||||||
|
|
||||||
|
" Add the breakpoint
|
||||||
|
call feedkeys( "\<F9>", 'xt' )
|
||||||
|
call vimspector#test#signs#AssertSignGroupSingletonAtLine( 'VimspectorBP',
|
||||||
|
\ 25,
|
||||||
|
\ 'vimspectorBP' )
|
||||||
|
|
||||||
|
" Insert a line above the breakpoint
|
||||||
|
call append( 22, ' # Test' )
|
||||||
|
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 26, 5 )
|
||||||
|
call vimspector#test#signs#AssertSignGroupSingletonAtLine( 'VimspectorBP',
|
||||||
|
\ 26,
|
||||||
|
\ 'vimspectorBP' )
|
||||||
|
|
||||||
|
" CHeck that we break at the right point
|
||||||
|
call setpos( '.', [ 0, 1, 1 ] )
|
||||||
|
call vimspector#LaunchWithSettings( { "configuration": "run" } )
|
||||||
|
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 26, 1 )
|
||||||
|
call vimspector#Reset()
|
||||||
|
call vimspector#test#setup#WaitForReset()
|
||||||
|
|
||||||
|
" Toggle the breakpoint
|
||||||
|
call setpos( '.', [ 0, 26, 1 ] )
|
||||||
|
call vimspector#test#signs#AssertSignGroupSingletonAtLine( 'VimspectorBP',
|
||||||
|
\ 26,
|
||||||
|
\ 'vimspectorBP' )
|
||||||
|
call feedkeys( "\<F9>", 'xt' )
|
||||||
|
call vimspector#test#signs#AssertSignGroupSingletonAtLine(
|
||||||
|
\ 'VimspectorBP',
|
||||||
|
\ 26,
|
||||||
|
\ 'vimspectorBPDisabled' )
|
||||||
|
" Delete it
|
||||||
|
call feedkeys( "\<F9>", 'xt' )
|
||||||
|
call vimspector#test#signs#AssertSignGroupEmptyAtLine( 'VimspectorBP', 26 )
|
||||||
|
|
||||||
|
endfunction
|
||||||
|
|
|
||||||
|
|
@ -6,11 +6,11 @@ function! ClearDown()
|
||||||
call vimspector#test#setup#ClearDown()
|
call vimspector#test#setup#ClearDown()
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! SetUp_Test_Go_Simple()
|
function! SetUp_Test_Python_Simple()
|
||||||
let g:vimspector_enable_mappings = 'HUMAN'
|
let g:vimspector_enable_mappings = 'HUMAN'
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! Test_Go_Simple()
|
function! Test_Python_Simple()
|
||||||
let fn='main.py'
|
let fn='main.py'
|
||||||
lcd ../support/test/python/simple_python
|
lcd ../support/test/python/simple_python
|
||||||
exe 'edit ' . fn
|
exe 'edit ' . fn
|
||||||
|
|
@ -28,16 +28,8 @@ function! Test_Go_Simple()
|
||||||
call setpos( '.', [ 0, 1, 1 ] )
|
call setpos( '.', [ 0, 1, 1 ] )
|
||||||
|
|
||||||
" Here we go. Start Debugging
|
" Here we go. Start Debugging
|
||||||
pyx << EOF
|
call vimspector#LaunchWithSettings( { "configuration": "run" } )
|
||||||
from unittest.mock import patch
|
call vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 6, 1 )
|
||||||
with patch( 'vimspector.utils.SelectFromList',
|
|
||||||
return_value=None ) as p:
|
|
||||||
with patch( 'vimspector.utils.AskForInput',
|
|
||||||
return_value=None ) as p:
|
|
||||||
vim.eval( 'vimspector#LaunchWithSettings( { "configuration": "run" } )' )
|
|
||||||
vim.eval( 'vimspector#test#signs#AssertCursorIsAtLineInBuffer( fn, 6, 1 )' )
|
|
||||||
p.assert_called()
|
|
||||||
EOF
|
|
||||||
|
|
||||||
" Step
|
" Step
|
||||||
call feedkeys( "\<F10>", 'xt' )
|
call feedkeys( "\<F10>", 'xt' )
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,7 @@ endfunction
|
||||||
function! vimspector#test#setup#ClearDown() abort
|
function! vimspector#test#setup#ClearDown() abort
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! vimspector#test#setup#Reset() abort
|
function! vimspector#test#setup#WaitForReset() abort
|
||||||
call vimspector#Reset()
|
|
||||||
call WaitForAssert( {->
|
call WaitForAssert( {->
|
||||||
\ assert_true( pyxeval( '_vimspector_session._connection is None' ) )
|
\ assert_true( pyxeval( '_vimspector_session._connection is None' ) )
|
||||||
\ } )
|
\ } )
|
||||||
|
|
@ -26,6 +25,12 @@ function! vimspector#test#setup#Reset() abort
|
||||||
\ }, 10000 )
|
\ }, 10000 )
|
||||||
|
|
||||||
call vimspector#test#signs#AssertSignGroupEmpty( 'VimspectorCode' )
|
call vimspector#test#signs#AssertSignGroupEmpty( 'VimspectorCode' )
|
||||||
|
endfunction
|
||||||
|
|
||||||
|
function! vimspector#test#setup#Reset() abort
|
||||||
|
call vimspector#Reset()
|
||||||
|
call vimspector#test#setup#WaitForReset()
|
||||||
|
|
||||||
call vimspector#ClearBreakpoints()
|
call vimspector#ClearBreakpoints()
|
||||||
call vimspector#test#signs#AssertSignGroupEmpty( 'VimspectorBP' )
|
call vimspector#test#signs#AssertSignGroupEmpty( 'VimspectorBP' )
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue