Skip to content
This repository has been archived by the owner on Dec 27, 2021. It is now read-only.

Commit

Permalink
[#29] Improve quality over ill defined constructor.
Browse files Browse the repository at this point in the history
  • Loading branch information
peransin-obeo committed Oct 19, 2021
1 parent 7d1d273 commit a49f372
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 36 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,10 @@
*******************************************************************************/
package org.eclipse.poosl.rotalumisclient.breakpoint;

import java.text.MessageFormat;

import org.eclipse.core.resources.IMarker;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IWorkspaceRunnable;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.model.IBreakpoint;
import org.eclipse.debug.core.model.LineBreakpoint;
Expand All @@ -31,24 +30,31 @@
*/
public class PooslLineBreakpoint extends LineBreakpoint {

public PooslLineBreakpoint() {
// Add empty constructor for reflection purposes
}
private static final String MARKER_ID = "org.eclipse.poosl.rotalumisclient.pooslLineBreakpointMarker"; //$NON-NLS-1$

private static final String MESSAGE_PATTERN = "Poosl Line Breakpoint: {0} [line: {1}]";

public PooslLineBreakpoint(final IResource resource, final int lineNumber) throws DebugException {
super();
IWorkspaceRunnable runnable = new IWorkspaceRunnable() {
public void run(IProgressMonitor monitor) throws CoreException {
IMarker marker = resource.createMarker("org.eclipse.poosl.rotalumisclient.pooslLineBreakpointMarker"); //$NON-NLS-1$
setMarker(marker);
marker.setAttribute(IBreakpoint.ENABLED, true);
marker.setAttribute(IBreakpoint.PERSISTED, true);
marker.setAttribute(IMarker.LINE_NUMBER, lineNumber);
marker.setAttribute(IBreakpoint.ID, getModelIdentifier());
marker.setAttribute(IMarker.MESSAGE, "Poosl Line Breakpoint: " + resource.getName() + " [line: " + lineNumber + "]");
}
};
run(getMarkerRule(resource), runnable);
/**
* Sets the resource and the line of this breakpoint into marker.
*
* @param resource
* to breakpoint
* @param lineNumber
* of breakpoint
* @throws DebugException
* if fails to mark
*/
public void markLine(final IResource resource, final int lineNumber) throws DebugException {
run(getMarkerRule(resource), monitor -> {
IMarker marker = resource.createMarker(MARKER_ID);
setMarker(marker);
marker.setAttribute(IBreakpoint.ENABLED, true);
marker.setAttribute(IBreakpoint.PERSISTED, true);
marker.setAttribute(IMarker.LINE_NUMBER, lineNumber);
marker.setAttribute(IBreakpoint.ID, getModelIdentifier());
marker.setAttribute(IMarker.MESSAGE,
MessageFormat.format(MESSAGE_PATTERN, resource.getName(), lineNumber));
});
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,16 +54,20 @@
* @author <a href="mailto:[email protected]">Arjan Mooij</a>
*
*/
public class PooslLineBreakpointTarget implements IToggleBreakpointsTarget, IToggleBreakpointsTargetExtension {
private static final Logger LOGGER = Logger.getLogger(PooslLineBreakpointTarget.class.getName());
public class PooslLineBreakpointTarget implements
IToggleBreakpointsTarget,
IToggleBreakpointsTargetExtension {
private static final Logger LOGGER = Logger
.getLogger(PooslLineBreakpointTarget.class.getName());

@Override
public boolean canToggleLineBreakpoints(IWorkbenchPart part, ISelection selection) {
return true;
}

@Override
public void toggleLineBreakpoints(IWorkbenchPart part, ISelection selection) throws CoreException {
public void toggleLineBreakpoints(IWorkbenchPart part, ISelection selection)
throws CoreException {
XtextEditor xtextEditor = getEditor(part);
IXtextDocument document = getDocument(xtextEditor);
if (xtextEditor != null && document != null) {
Expand All @@ -79,33 +83,42 @@ public void toggleLineBreakpoints(IWorkbenchPart part, ISelection selection) thr
return;
}

Statement actualSemanticObject = getSemanticStatement(resource, document, selectedLineNumber);
Statement actualSemanticObject = getSemanticStatement(resource, document,
selectedLineNumber);
if (actualSemanticObject == null) {
PooslDebugHelper.showInfoMessage(Messages.DIALOG_BREAKPOINT_TITLE, Messages.DIALOG_BREAKPOINT_NO_STATEMENT);
PooslDebugHelper.showInfoMessage(Messages.DIALOG_BREAKPOINT_TITLE,
Messages.DIALOG_BREAKPOINT_NO_STATEMENT);
return;
}
if (actualSemanticObject instanceof ProcessMethodCall && actualSemanticObject.eContainer() instanceof ProcessClass) {
if (actualSemanticObject instanceof ProcessMethodCall
&& actualSemanticObject.eContainer() instanceof ProcessClass) {
// Initial method call
PooslDebugHelper.showInfoMessage(Messages.DIALOG_BREAKPOINT_TITLE, Messages.DIALOG_BREAKPOINT_INIT_METHOD);
PooslDebugHelper.showInfoMessage(Messages.DIALOG_BREAKPOINT_TITLE,
Messages.DIALOG_BREAKPOINT_INIT_METHOD);
return;
}

int statementLineNumber = NodeModelUtils.getNode(actualSemanticObject).getStartLine() - 1;
int statementLineNumber = NodeModelUtils.getNode(actualSemanticObject).getStartLine()
- 1;

// Check if there is an existing breakpoint on this line number
if (!deleteBreakpointAtLine(resource, statementLineNumber)) {
// create line breakpoint (doc line numbers start at 0)
PooslLineBreakpoint lineBreakpoint = new PooslLineBreakpoint(resource, statementLineNumber + 1);
PooslLineBreakpoint lineBreakpoint = new PooslLineBreakpoint();
lineBreakpoint.markLine(resource, statementLineNumber + 1);
DebugPlugin.getDefault().getBreakpointManager().addBreakpoint(lineBreakpoint);
}
}
}

private boolean deleteBreakpointAtLine(IResource resource, int lineNumber) throws CoreException {
IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager().getBreakpoints(PooslConstants.DEBUG_MODEL_ID);
private boolean deleteBreakpointAtLine(IResource resource, int lineNumber)
throws CoreException {
IBreakpoint[] breakpoints = DebugPlugin.getDefault().getBreakpointManager()
.getBreakpoints(PooslConstants.DEBUG_MODEL_ID);
for (int i = 0; i < breakpoints.length; i++) {
IBreakpoint breakpoint = breakpoints[i];
if (resource.equals(breakpoint.getMarker().getResource()) && ((ILineBreakpoint) breakpoint).getLineNumber() == (lineNumber + 1)) {
if (resource.equals(breakpoint.getMarker().getResource())
&& ((ILineBreakpoint) breakpoint).getLineNumber() == (lineNumber + 1)) {
// existing breakpoint; delete
breakpoint.delete();
return true;
Expand All @@ -114,7 +127,8 @@ private boolean deleteBreakpointAtLine(IResource resource, int lineNumber) throw
return false;
}

private Statement getSemanticStatement(IResource resource, IXtextDocument document, int lineNumber) {
private Statement getSemanticStatement(
IResource resource, IXtextDocument document, int lineNumber) {
int lineOffset = -1;
try {
lineOffset = document.getLineInformation(lineNumber).getOffset();
Expand Down Expand Up @@ -144,10 +158,12 @@ private Statement getSemanticStatement(IResource resource, IXtextDocument docume

private EObject getSemanticObject(IResource resource, int lineOffset) {
XtextResourceSet resourceSet = new XtextResourceSet();
resourceSet.getPackageRegistry().put(org.eclipse.poosl.PooslPackage.eINSTANCE.getNsURI(), org.eclipse.poosl.PooslPackage.eINSTANCE);
resourceSet.getPackageRegistry().put(org.eclipse.poosl.PooslPackage.eINSTANCE.getNsURI(),
org.eclipse.poosl.PooslPackage.eINSTANCE);
URI uri = URI.createFileURI(resource.getLocation().toOSString());
XtextResource xtextResource = (XtextResource) resourceSet.getResource(uri, true);
ILeafNode leafNode = NodeModelUtils.findLeafNodeAtOffset(xtextResource.getParseResult().getRootNode(), lineOffset);
ILeafNode leafNode = NodeModelUtils
.findLeafNodeAtOffset(xtextResource.getParseResult().getRootNode(), lineOffset);
return NodeModelUtils.findActualSemanticObjectFor(leafNode);
}

Expand Down Expand Up @@ -184,7 +200,8 @@ private IXtextDocument getDocument(XtextEditor xtextEditor) {
}

@Override
public void toggleMethodBreakpoints(IWorkbenchPart part, ISelection selection) throws CoreException {
public void toggleMethodBreakpoints(IWorkbenchPart part, ISelection selection)
throws CoreException {
throw new UnsupportedOperationException("toggleMethodBreakpoints() not supported");
}

Expand Down

0 comments on commit a49f372

Please sign in to comment.