blob: a843cac2076c89e126bd81f7f05bc43fc9624f2e [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;
import org.eclipse.emf.common.util.URI;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.ocl.examples.debug.vm.evaluator.VMEvaluationEnvironment;
import org.eclipse.ocl.examples.debug.vm.utils.ASTBindingHelper;
import org.eclipse.ocl.examples.debug.vm.utils.IModuleSourceInfo;
import org.eclipse.ocl.pivot.Element;
import org.eclipse.ocl.pivot.NamedElement;
public class UnitLocation {
private static final int UNDEF_LINE_NUM = -2;
/* private static int calcStackDepth(IDebugEvaluationEnvironment currentEvalEnv) {
// FIXME - move to core OCL into EvaluationEnv
int depth = 0;
IDebugEvaluationEnvironment evalEnv = currentEvalEnv;
while (evalEnv != null) {
depth += evalEnv.getDepth();
evalEnv = null; //EvaluationUtil.getAggregatingContext(evalEnv);
}
return depth;
} */
private int fLineNum = UNDEF_LINE_NUM;
private final int startPosition;
private final int endPosition;
private final int fDepth;
private final Element fElement;
private final @NonNull NamedElement fModule;
private final NamedElement fOperation;
private final @NonNull VMEvaluationEnvironment fEvalEnv;
private IModuleSourceInfo fSrcInfo;
public UnitLocation(int startPosition, int endPosition, @NonNull VMEvaluationEnvironment evalEnv, @NonNull Element element) {
fEvalEnv = evalEnv;
fElement = element;
this.startPosition = startPosition;
this.endPosition = endPosition;
fDepth = evalEnv.getDepth();
fOperation = evalEnv.getOperation();
EObject rootContainer = EcoreUtil.getRootContainer(fEvalEnv.getDebuggableElement());
assert rootContainer instanceof NamedElement;
fModule = (NamedElement) rootContainer;
// if (currentInstance != null) {
// fModule = currentInstance.getInstantiatedType();
// } else if (element instanceof Type) {
// // TODO - debugging before module instance get created & initialized into evaluation
// // environment => for now, derive from the past AST element
// fModule = (Type) element;
// } else {
// throw new IllegalArgumentException("Module-less evaluation environment"); //$NON-NLS-1$
// }
}
public boolean isDeferredExecution() {
return fEvalEnv.isDeferredExecution();
}
public URI getURI() {
return getSourceInfo().getSourceURI();
}
public @NonNull NamedElement getModule() {
return fModule;
}
public NamedElement getOperation() {
return fOperation;
}
public @NonNull VMEvaluationEnvironment getEvalEnv() {
return fEvalEnv;
}
public int getEndPosition() {
return endPosition;
}
public int getLineNum() {
if(fLineNum == UNDEF_LINE_NUM) {
int newLine = -1;
if (startPosition >= 0) {
newLine = getSourceInfo().getLineNumberProvider().getLineNumber(startPosition);
}
return fLineNum = newLine;
}
return fLineNum;
}
public int getStartPosition() {
return startPosition;
}
public int getStackDepth() {
return fDepth;
}
public Element getElement() {
return fElement;
}
public boolean isTheSameLine(@NonNull UnitLocation location) {
return (fEvalEnv == location.fEvalEnv) && (getLineNum() == location.getLineNum());
}
public boolean isTheSameLocation(@NonNull UnitLocation location) {
return (fEvalEnv == location.fEvalEnv) && (getLineNum() == location.getLineNum())
&& (startPosition == location.startPosition) && (endPosition == location.endPosition);
}
@Override
public boolean equals(Object another) {
if(another instanceof UnitLocation == false) {
return false;
}
UnitLocation location = (UnitLocation) another;
return this == location ||
(startPosition == location.startPosition
&& fDepth == location.fDepth
&& fEvalEnv == location.fEvalEnv
&& fElement.equals(location.fElement));
}
@Override
public int hashCode() {
int hash = 17;
hash = 37 * hash + startPosition;
hash = 37 * hash + endPosition;
hash = 37 * hash + fDepth;
hash = 37 * hash + fElement.hashCode();
return hash;
}
@Override
public String toString() {
return fModule.getName() + ":" + getLineNum() + ":" + startPosition + ":" + (endPosition-startPosition) + ":" + fDepth; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
}
private IModuleSourceInfo getSourceInfo() {
if(fSrcInfo == null) {
fSrcInfo = ASTBindingHelper.getModuleSourceBinding(getModule());
}
return fSrcInfo;
}
}