package org.rubypeople.rdt.internal.debug.core; import org.eclipse.core.runtime.CoreException; import org.rubypeople.rdt.debug.core.model.IRubyExceptionBreakpoint; import org.rubypeople.rdt.debug.core.model.IRubyStackFrame; import org.rubypeople.rdt.internal.debug.core.model.RubyStackFrame; import org.rubypeople.rdt.internal.debug.core.model.RubyThread; import org.rubypeople.rdt.internal.debug.core.model.RubyVariable; public class ClassicDebuggerCommandFactory implements ICommandFactory { public String createReadFrames(RubyThread thread) { return "th " + thread.getId() + " ; w" ; } public String createReadLocalVariables(RubyStackFrame frame) { return "th " + ((RubyThread) frame.getThread()).getId() + " ; frame " + frame.getIndex() + " ; v l " ; } public String createReadInstanceVariable(RubyVariable variable) { return "th " + ((RubyThread) variable.getStackFrame().getThread()).getId() + " ; v i " + variable.getStackFrame().getIndex() + " " + variable.getObjectId(); } public String createStepOver(RubyStackFrame stackFrame) { return "th " + ((RubyThread) stackFrame.getThread()).getId() + " ; next"; } public String createForcedStepOver(RubyStackFrame stackFrame) { // not supported by Classic Debugger return createStepOver(stackFrame); } public String createStepReturn(RubyStackFrame stackFrame) { return "th " + ((RubyThread) stackFrame.getThread()).getId() + " ; next " + (stackFrame.getLineNumber() + 1); } public String createStepInto(RubyStackFrame stackFrame) { return "th " + ((RubyThread) stackFrame.getThread()).getId() + " ; step"; } public String createForcedStepInto(RubyStackFrame stackFrame) { // not supported by Classic Debugger return createStepInto(stackFrame); } public String createReadThreads() { return "th l"; } public String createLoad(String filename) { return "load " + filename; } public String createInspect(IRubyStackFrame frame, String expression) { return "th " + ((RubyThread) frame.getThread()).getId() + " ; v inspect " + frame.getIndex() + " " + expression; } public String createResume(RubyThread thread) { return "th " + thread.getId() + ";cont"; } public String createAddBreakpoint(String file, int line) { StringBuffer setBreakPointCommand = new StringBuffer(); setBreakPointCommand.append("b ") ; setBreakPointCommand.append(file); setBreakPointCommand.append(":"); setBreakPointCommand.append(line); return setBreakPointCommand.toString(); } public String createRemoveBreakpoint(int index) { return "delete " + index ; } public String createCatchOff(IRubyExceptionBreakpoint breakpoint) { // Only allows a single catchpoint return "catch off"; } public String createCatchOn(IRubyExceptionBreakpoint breakpoint) throws CoreException { return "catch " + breakpoint.getTypeName(); } public String createThreadStop(RubyThread thread) { return "th stop " +thread.getId() ; } public String createAddMethodBreakpoint(String file, String typeName, String methodName, int line) { // FIXME Can this support method breakpoints? StringBuffer setBreakPointCommand = new StringBuffer(); setBreakPointCommand.append("b ") ; setBreakPointCommand.append(file); setBreakPointCommand.append(":"); setBreakPointCommand.append(line); return setBreakPointCommand.toString(); } }