diff --git a/debug/org.eclipse.cdt.debug.core/plugin.xml b/debug/org.eclipse.cdt.debug.core/plugin.xml index a13423eadd1..a67ad4ae711 100644 --- a/debug/org.eclipse.cdt.debug.core/plugin.xml +++ b/debug/org.eclipse.cdt.debug.core/plugin.xml @@ -439,4 +439,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/breakpoints/CBreakpointImportParticipant.java b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/breakpoints/CBreakpointImportParticipant.java new file mode 100644 index 00000000000..6d9037fef4d --- /dev/null +++ b/debug/org.eclipse.cdt.debug.core/src/org/eclipse/cdt/debug/internal/core/breakpoints/CBreakpointImportParticipant.java @@ -0,0 +1,164 @@ +/******************************************************************************* + * Copyright (c) 2015 Freescale Semiconductors and others. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Dan Ungureanu (Freescale Semiconductors) - Initial implementation + *******************************************************************************/ +package org.eclipse.cdt.debug.internal.core.breakpoints; + +import java.util.Map; + +import org.eclipse.cdt.debug.core.model.ICBreakpoint; +import org.eclipse.cdt.debug.core.model.ICEventBreakpoint; +import org.eclipse.cdt.debug.core.model.ICLineBreakpoint; +import org.eclipse.core.resources.IMarker; +import org.eclipse.core.runtime.CoreException; +import org.eclipse.debug.core.model.IBreakpoint; +import org.eclipse.debug.core.model.IBreakpointImportParticipant; + +/** + * Initial implementation covering matching breakpoints at import for all platform C/C++ breakpoints + */ +public class CBreakpointImportParticipant implements IBreakpointImportParticipant { + /* + * (non-Javadoc) + * + * @see + * org.eclipse.debug.core.model.IBreakpointImportParticipant#matches(java + * .util.Map, org.eclipse.debug.core.model.IBreakpoint) + */ + public boolean matches(Map attributes, IBreakpoint breakpoint) + throws CoreException { + if (attributes == null || breakpoint == null) { + return false; + } + String type = (String) attributes.get("type"); //$NON-NLS-1$ + if (type == null) { + return false; + } + if (!breakpoint.getMarker().getType().equals(type)) { + return false; + } + if (breakpoint instanceof AbstractLineBreakpoint) { + return matchesLineBreakpoint(attributes, + (AbstractLineBreakpoint) breakpoint); + } + if (breakpoint instanceof AbstractTracepoint) { + return matchesTracepoint(attributes, + (AbstractTracepoint) breakpoint); + } + if (breakpoint instanceof CEventBreakpoint) { + return matchesEventBreakpoint(attributes, (CEventBreakpoint) breakpoint); + } + if (breakpoint instanceof CWatchpoint) { + return matchesWatchpoint(attributes, (CWatchpoint) breakpoint); + } + return false; + } + + /* + * (non-Javadoc) + * @see org.eclipse.debug.core.model.IBreakpointImportParticipant#verify(org.eclipse.debug.core.model.IBreakpoint) + */ + @Override + public void verify(IBreakpoint breakpoint) throws CoreException {} + + + /** + * Compares two attributes in a null safe way + * + * @param attr1 + * the first attribute + * @param attr2 + * the second attribute + * @return true if the attributes are equal, false otherwise. If both + * attributes are null they are considered to be equal + */ + private boolean attributesEqual(Object attr1, Object attr2) { + if (attr1 == null) { + return attr2 == null; + } + return attr1.equals(attr2); + } + + /** + * Returns if the given map of attributes matches the given breakpoint + * Works for any breakpoint class that extends AbstractLineBreakpoint + * + * @param attributes + * @param breakpoint + * @return true if the attributes match the breakpoint's attributes, false + * otherwise + * @throws CoreException + */ + private boolean matchesLineBreakpoint(Map attributes, AbstractLineBreakpoint breakpoint) + throws CoreException { + Integer line = (Integer) attributes.get(IMarker.LINE_NUMBER); + int lineNumber = (line == null ? -1 : line.intValue()); + return breakpoint.getLineNumber() == lineNumber + && attributesEqual(breakpoint.getType(), attributes.get(CBreakpoint.TYPE)) + && attributesEqual(breakpoint.getSourceHandle(), attributes.get(ICBreakpoint.SOURCE_HANDLE)) + && attributesEqual(breakpoint.getMarker().getAttribute(ICLineBreakpoint.ADDRESS), attributes.get(ICLineBreakpoint.ADDRESS)) + && attributesEqual(breakpoint.getMarker().getAttribute(ICLineBreakpoint.FUNCTION), attributes.get(ICLineBreakpoint.FUNCTION)); + } + + /** + * Returns if the given map of attributes matches the given tracepoint + * Works for any breakpoint class that extends AbstractTracepoint + * + * @param attributes + * @param tracepoint + * @return true if the attributes match the tracepoint's attributes, false + * otherwise + * @throws CoreException + */ + private boolean matchesTracepoint(Map attributes, AbstractTracepoint tracepoint) + throws CoreException { + Integer line = (Integer) attributes.get(IMarker.LINE_NUMBER); + int lineNumber = (line == null ? -1 : line.intValue()); + return tracepoint.getLineNumber() == lineNumber + && attributesEqual(tracepoint.getType(), attributes.get(CBreakpoint.TYPE)) + && attributesEqual(tracepoint.getSourceHandle(), attributes.get(ICBreakpoint.SOURCE_HANDLE)) + && attributesEqual(tracepoint.getMarker().getAttribute(ICLineBreakpoint.ADDRESS), attributes.get(ICLineBreakpoint.ADDRESS)) + && attributesEqual(tracepoint.getMarker().getAttribute(ICLineBreakpoint.FUNCTION), attributes.get(ICLineBreakpoint.FUNCTION)); + } + + /** + * Returns if the given map of attributes matches the given event breakpoint + * + * @param attributes + * @param breakpoint + * @return true if the attributes match the event breakpoint's attributes, false + * otherwise + * @throws CoreException + */ + private boolean matchesEventBreakpoint(Map attributes, CEventBreakpoint breakpoint) + throws CoreException { + return breakpoint.getEventArgument().equals( + attributes.get(ICEventBreakpoint.EVENT_ARG)) + && attributesEqual(breakpoint.getEventType(), + attributes.get(ICEventBreakpoint.EVENT_TYPE_ID)); + } + + /** + * Returns if the given map of attributes matches the given watchpoint + * + * @param attributes + * @param breakpoint + * @return true if the attributes match the watchpoint's attributes, false + * otherwise + * @throws CoreException + */ + private boolean matchesWatchpoint(Map attributes, CWatchpoint watchpoint) + throws CoreException { + return watchpoint.getExpression().equals( + attributes.get(CWatchpoint.EXPRESSION)) + && attributesEqual(watchpoint.getType(), + attributes.get(CBreakpoint.TYPE)); + } + +}