package org.develnext.jphp.debug.impl.command;
import org.develnext.jphp.debug.impl.DebugTick;
import org.develnext.jphp.debug.impl.Debugger;
import org.develnext.jphp.debug.impl.command.support.CommandArguments;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import php.runtime.env.CallStack;
import php.runtime.env.CallStackItem;
import php.runtime.env.TraceInfo;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class StackGetCommand extends AbstractCommand {
@Override
public String getName() {
return "stack_get";
}
@Override
public boolean afterExecutionContinueNeeded() {
return false;
}
@Override
public void run(Debugger context, CommandArguments args, Document result) {
DebugTick tick = context.getRegisteredTick();
Element response = createResponse(args, result);
CallStack callStack = tick.getCallStack();
List<CallStackItem> list = new ArrayList<>();
Collections.addAll(list, callStack.getSnapshot());
CallStackItem last = list.get(list.size() - 1);
if (list.size() > 1) {
CallStackItem prevLast = list.get(list.size() - 2);
TraceInfo trace = prevLast.getTrace();
prevLast.setTrace(new TraceInfo(
trace.getContext(),
last.getTrace().getStartLine(),
trace.getEndLine(),
last.getTrace().getStartPosition(),
trace.getEndLine()
));
}
last.setTrace(tick.getTrace());
Collections.reverse(list);
int depth = args.containsKey("d") ? Integer.parseInt(args.get("d")) : -1;
if (depth > -1) {
list = list.subList(0, depth + 1);
}
int i = 0;
for (CallStackItem stackItem : list) {
Element stack = result.createElement("stack");
stack.setAttribute("level", String.valueOf(i));
stack.setAttribute("type", "file");
stack.setAttribute("filename", context.getFileName(stackItem.trace.getFileName()));
stack.setAttribute("lineno", String.valueOf(stackItem.trace.getStartLine() + 1));
stack.setAttribute("where", stackItem.getWhere());
response.appendChild(stack);
i++;
}
}
}