package com.redhat.ceylon.eclipse.core.debug; import org.eclipse.core.resources.IMarker; import org.eclipse.core.runtime.CoreException; import org.eclipse.debug.core.DebugException; import org.eclipse.debug.core.model.IStackFrame; import org.eclipse.jdt.core.dom.Message; import org.eclipse.jdt.debug.core.IJavaBreakpoint; import org.eclipse.jdt.debug.core.IJavaDebugTarget; import org.eclipse.jdt.debug.core.IJavaInterfaceType; import org.eclipse.jdt.debug.core.IJavaLineBreakpoint; import org.eclipse.jdt.debug.core.IJavaStackFrame; import org.eclipse.jdt.debug.core.IJavaThread; import org.eclipse.jdt.debug.core.IJavaType; import org.eclipse.jdt.internal.debug.core.model.JDIStackFrame; import com.redhat.ceylon.eclipse.code.editor.ToggleBreakpointAdapter; import com.redhat.ceylon.eclipse.core.debug.model.CeylonJDIThread; import com.redhat.ceylon.eclipse.ui.CeylonPlugin; import com.sun.jdi.Method; public class BreakpointMethodFilter implements org.eclipse.jdt.debug.core.IJavaBreakpointListener { @Override public void addingBreakpoint(IJavaDebugTarget target, IJavaBreakpoint breakpoint) { } @Override public int installingBreakpoint(IJavaDebugTarget target, IJavaBreakpoint breakpoint, IJavaType type) { IMarker marker = breakpoint.getMarker(); if (marker != null) { try { if (CeylonPlugin.PLUGIN_ID.equals(marker.getAttribute(ToggleBreakpointAdapter.ORIGIN))) { if (type instanceof IJavaInterfaceType) { return DONT_INSTALL; } return INSTALL; } } catch (CoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return DONT_CARE; } @Override public void breakpointInstalled(IJavaDebugTarget target, IJavaBreakpoint breakpoint) { } @Override public int breakpointHit(IJavaThread thread, IJavaBreakpoint breakpoint) { if (thread instanceof CeylonJDIThread) { IStackFrame frame = null; try { frame = thread.getTopStackFrame(); } catch (DebugException e) { // TODO Auto-generated catch block e.printStackTrace(); } if (frame instanceof JDIStackFrame && DebugUtils.isCeylonFrame((IJavaStackFrame) frame)) { JDIStackFrame jdiFrame = (JDIStackFrame) frame; Method method = jdiFrame.getUnderlyingMethod(); if (method != null && DebugUtils.isInternalCeylonMethod(method)) { return DONT_SUSPEND; } } } return DONT_CARE; } @Override public void breakpointRemoved(IJavaDebugTarget target, IJavaBreakpoint breakpoint) { } @Override public void breakpointHasRuntimeException(IJavaLineBreakpoint breakpoint, DebugException exception) { } @Override public void breakpointHasCompilationErrors(IJavaLineBreakpoint breakpoint, Message[] errors) { } }