package com.siberika.idea.pascal.debugger; import com.intellij.openapi.ui.MessageType; import com.intellij.xdebugger.breakpoints.XBreakpointHandler; import com.intellij.xdebugger.breakpoints.XLineBreakpoint; import com.siberika.idea.pascal.PascalBundle; import com.siberika.idea.pascal.debugger.gdb.GdbXDebugProcess; import com.siberika.idea.pascal.debugger.gdb.parser.GdbMiResults; import org.jetbrains.annotations.NotNull; import java.util.HashMap; import java.util.Map; /** * Author: George Bakhtadze * Date: 26/03/2017 */ public class PascalLineBreakpointHandler extends XBreakpointHandler<XLineBreakpoint<PascalLineBreakpointProperties>> { private final GdbXDebugProcess debugProcess; final Map<PascalLineBreakpointProperties, Integer> breakIndexMap = new HashMap<PascalLineBreakpointProperties, Integer>(); public PascalLineBreakpointHandler(GdbXDebugProcess debugProcess) { super(PascalLineBreakpointType.class); this.debugProcess = debugProcess; } @Override public void registerBreakpoint(@NotNull XLineBreakpoint<PascalLineBreakpointProperties> breakpoint) { PascalLineBreakpointProperties props = breakpoint.getProperties(); int line = breakpoint.getLine(); String filename = breakpoint.getPresentableFilePath(); if (props != null) { line = props.getLine(); filename = props.getFilename(); } debugProcess.sendCommand(String.format("-break-insert %s -f %s:%d", debugProcess.isInferiorRunning() ? "-h" : "", filename, line)); } @Override public void unregisterBreakpoint(@NotNull XLineBreakpoint<PascalLineBreakpointProperties> breakpoint, boolean temporary) { PascalLineBreakpointProperties props = breakpoint.getProperties(); props = props != null ? props : new PascalLineBreakpointProperties(breakpoint.getPresentableFilePath(), breakpoint.getLine()); Integer ind = breakIndexMap.get(props); if (ind != null) { debugProcess.sendCommand(String.format("-break-delete %d", ind)); } else { debugProcess.getSession().reportMessage(PascalBundle.message("debug.breakpoint.notFound"), MessageType.ERROR); } } public void handleBreakpointResult(GdbMiResults bp) { String fullname = bp.getString("fullname"); Integer line = bp.getInteger("line"); if (fullname != null && line != null) { breakIndexMap.put(new PascalLineBreakpointProperties(fullname, line), bp.getInteger("number")); } } }