blob: a88dd0a652d6ac39b9136cba075e4d2efe257119 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2014, 2018 Willink Transformations and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* R.Dvorak and others - QVTo debugger framework
* E.D.Willink - revised API for OCL debugger framework
*******************************************************************************/
package org.eclipse.ocl.examples.debug.vm.evaluator;
import java.util.HashSet;
import java.util.Set;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.emf.common.util.URI;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.ocl.examples.debug.vm.UnitLocation;
import org.eclipse.ocl.examples.debug.vm.VMBreakpoint;
import org.eclipse.ocl.examples.debug.vm.VMBreakpointManager;
import org.eclipse.ocl.pivot.Element;
import org.eclipse.ocl.pivot.LoopExp;
public class IterateBreakpointHelper {
private final Set<VMBreakpoint> fBreakpoints;
private final @NonNull VMBreakpointManager fBPM;
public IterateBreakpointHelper(@NonNull VMBreakpointManager breakpointManager) {
fBPM = breakpointManager;
fBreakpoints = new HashSet<VMBreakpoint>();
}
public VMBreakpoint stepIterateElement(LoopExp element, UnitLocation currentLocation) {
/* Root currentModule = currentLocation.getModule();
LineNumberProvider lineNumProvider = getLineNumberProvider(currentModule);
if(lineNumProvider == null) {
return null;
}
OCLExpression<EClassifier> body = element.getBody();
if (body == null) {
return null;
}
int bodyLine = lineNumProvider.getLineNumber(body.getStartPosition());
int elementLine = lineNumProvider.getLineNumber(element.getStartPosition());
ASTNode iterateBreakpointedElement = body;
// ensure we can suspend after stepping within iterator if it's body
// is spread across multiple lines
if (body instanceof BlockExp) {
BlockExp blockExp = (BlockExp) body;
int bodyEndLine = lineNumProvider.getLineNumber(blockExp.getEndPosition());
if ((bodyEndLine == elementLine) || blockExp.getBody().isEmpty()) {
return null;
}
iterateBreakpointedElement = blockExp.getBody().get(0);
} else if (bodyLine == elementLine) {
return null;
}
URI unitURI = currentLocation.getURI();
VMBreakpoint breakpoint = createIterateBreakpoint(unitURI, iterateBreakpointedElement, elementLine);
return breakpoint; */
return null;
}
public boolean isIterateBreakpoint(VMBreakpoint breakpoint) {
return fBreakpoints.contains(breakpoint);
}
public VMBreakpoint createIterateBreakpoint(URI unitURI, @NonNull Element breakpointedElement, int line) {
VMBreakpoint breakpoint = null;
try {
breakpoint = fBPM.createVMPrivateBreakpoint(unitURI, breakpointedElement, line, false);
fBreakpoints.add(breakpoint);
} catch (CoreException e) {
fBPM.getDebugCore().log(e.getStatus());
}
return breakpoint;
}
public void removeIterateBreakpoint(@NonNull VMBreakpoint breakpoint) {
fBPM.removeBreakpoint(breakpoint);
fBreakpoints.remove(breakpoint);
}
public void removeAllIterateBreakpoints() {
for (@SuppressWarnings("null")@NonNull VMBreakpoint brk : fBreakpoints) {
fBPM.removeBreakpoint(brk);
}
fBreakpoints.clear();
}
// private LineNumberProvider getLineNumberProvider(Element module) {
// return ASTBindingHelper.getModuleSourceBinding(module).getLineNumberProvider();
// }
}