function! vebugger#jdb#start(entryClass,args) let l:debugger=vebugger#std#startDebugger(shellescape(vebugger#util#getToolFullPath('jdb',get(a:args,'version'),'jdb')) \.(has_key(a:args,'classpath') && !has_key(a:args,'attach') ? ' -classpath '.fnameescape(a:args.classpath) : '') \.(has_key(a:args,'attach') ? ' -attach '.shellescape(a:args.attach) : '')) let l:debugger.state.jdb={} if has_key(a:args,'srcpath') let l:debugger.state.jdb.srcpath=a:args.srcpath else let l:debugger.state.jdb.srcpath='.' endif let l:debugger.state.jdb.filesToClassesMap={} if !has_key(a:args,'attach') call l:debugger.writeLine('stop on '.a:entryClass.'.main') call l:debugger.writeLine('run '.a:entryClass.' '.vebugger#util#commandLineArgsForProgram(a:args)) else call l:debugger.writeLine('run') endif call l:debugger.writeLine('monitor where') if !has('win32') && !has_key(a:args,'attach') call vebugger#std#openShellBuffer(l:debugger) endif call l:debugger.addReadHandler(function('vebugger#jdb#_readProgramOutput')) call l:debugger.addReadHandler(function('vebugger#jdb#_readWhere')) call l:debugger.addReadHandler(function('vebugger#jdb#_readException')) call l:debugger.addReadHandler(function('vebugger#jdb#_readEvaluatedExpressions')) call l:debugger.setWriteHandler('std','flow',function('vebugger#jdb#_writeFlow')) call l:debugger.setWriteHandler('std','breakpoints',function('vebugger#jdb#_writeBreakpoints')) call l:debugger.setWriteHandler('std','evaluateExpressions',function('vebugger#jdb#_requestEvaluateExpression')) call l:debugger.setWriteHandler('std','executeStatements',function('vebugger#jdb#_executeStatements')) call l:debugger.generateWriteActionsFromTemplate() call l:debugger.std_addAllBreakpointActions(g:vebugger_breakpoints) return l:debugger endfunction function! vebugger#jdb#attach(address, ...) let l:args = a:0 ? a:{1} : {} let l:args.attach = a:address call vebugger#jdb#start('', l:args) endfunction function! vebugger#jdb#_readProgramOutput(pipeName,line,readResult,debugger) dict if 'out'==a:pipeName if a:line=~'\v^\> \>' \||a:line=='> ' \||a:line=~'\v^Step completed' \||a:line=~'\v^Breakpoint hit' \||a:line=~'\v^\> Deferring breakpoint' \||a:line=='Nothing suspended.' \||a:line=~'\v^\> run ' "Signs that the output finished let self.programOutputMode=0 elseif a:line=~'\v(step|step up|next|cont)$' "Next line should be output let self.programOutputMode=1 elseif a:line=~'\v^\> [^>]' "Start of output let a:readResult.std.programOutput={'line':substitute(a:line,'\v^\> ','','')} let self.programOutputMode=1 elseif get(self,'programOutputMode') let a:readResult.std.programOutput={'line':a:line} endif else let a:readResult.std.programOutput={'line':a:line} endif endfunction function! s:getTagContainingString(tag, str) let l:tags = taglist(a:tag) if (len(l:tags) > 0) for l:tag in l:tags if (filereadable(l:tag.filename) && match(readfile(l:tag.filename), a:str) >= 0) return l:tag endif endfor endif return {} endfunction function! s:findFolderFromStackTrace(src,nameFromStackTrace,frameNumber) " Remove method name. let l:canonicalClassName = strpart(a:nameFromStackTrace, 0, strridx(a:nameFromStackTrace, ".")) " Remove package name. let l:simpleClassName = strridx(l:canonicalClassName, ".") >= 0 ? strpart(l:canonicalClassName, strridx(l:canonicalClassName, ".") + 1) : l:canonicalClassName " Remove class name. let l:package = strridx(l:canonicalClassName, ".") >= 0 ? strpart(l:canonicalClassName, 0, strridx(l:canonicalClassName, ".")) : "" " We don't really use callstack, so we use tags only for the current location. " Otherwise it makes everything too slow. if exists('g:vebugger_use_tags') && g:vebugger_use_tags && a:frameNumber == 1 " Now first try to find a tag for the class from the required package. let l:classTag = s:getTagContainingString(l:simpleClassName, l:package) if (has_key(l:classTag, "filename")) return fnamemodify(l:classTag.filename, ":h") endif endif " If no such tag was found, try to find it using the src path. for l:path in vebugger#util#listify(a:src) for l:dirname in split(a:nameFromStackTrace,'\.') let l:nextPath=l:path.'/'.fnameescape(l:dirname) if empty(glob(l:nextPath)) return l:path endif let l:path=l:nextPath endfor endfor return l:path endfunction function! vebugger#jdb#_readWhere(pipeName,line,readResult,debugger) if 'out'==a:pipeName let l:matches=matchlist(a:line,'\v\s*\[(\d+)]\s*(\S+)\s*\(([^:]*):(\d*)\)') if 4