Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'tests/org.eclipse.emf.test.ecore.xcore/src/org/eclipse/emf/test/ecore/xcore/legacy_xpect_runner/Offset.java')
-rw-r--r--tests/org.eclipse.emf.test.ecore.xcore/src/org/eclipse/emf/test/ecore/xcore/legacy_xpect_runner/Offset.java138
1 files changed, 138 insertions, 0 deletions
diff --git a/tests/org.eclipse.emf.test.ecore.xcore/src/org/eclipse/emf/test/ecore/xcore/legacy_xpect_runner/Offset.java b/tests/org.eclipse.emf.test.ecore.xcore/src/org/eclipse/emf/test/ecore/xcore/legacy_xpect_runner/Offset.java
new file mode 100644
index 000000000..abc92d493
--- /dev/null
+++ b/tests/org.eclipse.emf.test.ecore.xcore/src/org/eclipse/emf/test/ecore/xcore/legacy_xpect_runner/Offset.java
@@ -0,0 +1,138 @@
+package org.eclipse.emf.test.ecore.xcore.legacy_xpect_runner;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EStructuralFeature;
+import org.eclipse.xtext.Assignment;
+import org.eclipse.xtext.GrammarUtil;
+import org.eclipse.xtext.nodemodel.ILeafNode;
+import org.eclipse.xtext.nodemodel.INode;
+import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
+import org.eclipse.xtext.parsetree.reconstr.impl.NodeIterator;
+import org.eclipse.xtext.resource.XtextResource;
+import org.eclipse.xtext.util.Pair;
+import org.eclipse.xtext.util.Tuples;
+import org.junit.Assert;
+
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+
+/**
+ * use org.xpect.xtext.lib.setup.ThisOffset or
+ * org.xpect.parameter.ParameterParser with token rule OFFSET from
+ * www.xpect-tests.org instead. ThisOffset is an annotation that can be used for
+ * method parameters. ParameterParser is a an annotation to define syntax for
+ * test-parameters that can be specified in the DSL file (example: XPECT
+ * myTestMethod myparam1 myparam2). The method parameter type can be any of the
+ * following types int, INode, EObject, ICrossEReferenceAndEObject,
+ * IEAttributeAndEObject, IEReferenceAndEObject, IEStructuralFeatureAndEObject,
+ * etc.
+ *
+ * This class will be removed in the next release after 2.4.2
+ *
+ * @author Moritz Eysholdt - Initial contribution and API
+ */
+@Deprecated
+public class Offset {
+ protected int offset;
+ protected XtextResource resource;
+
+ public Offset(XtextResource resource, int offset) {
+ super();
+ this.resource = resource;
+ this.offset = offset;
+ }
+
+ public EObject getEObject() {
+ EObject object = NodeModelUtils
+ .findActualSemanticObjectFor(getLeafNodeAtOffset());
+ Assert.assertNotNull("No EObject found at offset " + offset, object);
+ return object;
+ }
+
+ public Pair<EObject, EStructuralFeature> getEStructuralFeatureByOffset() {
+ return getEStructuralFeatureByOffset(Predicates
+ .<EStructuralFeature> alwaysTrue());
+ }
+
+ public Pair<EObject, EStructuralFeature> getEStructuralFeatureByOffset(
+ Predicate<EStructuralFeature> matches) {
+ INode leaf = getLeafNodeAtOffset();
+ NodeIterator ni = null;
+ while (ni == null || ni.hasNext()) {
+ INode next = ni == null ? leaf : ni.next();
+ if (ni == null)
+ ni = new NodeIterator(leaf);
+ Assignment ass = GrammarUtil.containingAssignment(next
+ .getGrammarElement());
+ if (ass != null) {
+ EObject object = NodeModelUtils
+ .findActualSemanticObjectFor(next);
+ EStructuralFeature feat = object.eClass()
+ .getEStructuralFeature(ass.getFeature());
+ if (feat != null && matches.apply(feat))
+ return Tuples.create(object, feat);
+ }
+ }
+ Assert.fail("No EStructuralFeature found at offset " + offset);
+ return null;
+ }
+
+ public Pair<EObject, EStructuralFeature> getEStructuralFeatureByParent() {
+ INode leaf = getLeafNodeAtOffset();
+ EObject object = NodeModelUtils.findActualSemanticObjectFor(leaf);
+ Assert.assertNotNull("No EObject found at offset " + offset, object);
+ Assignment ass = GrammarUtil.containingAssignment(leaf
+ .getGrammarElement());
+ while (ass == null && leaf.getParent() != null) {
+ leaf = leaf.getParent();
+ ass = GrammarUtil.containingAssignment(leaf.getGrammarElement());
+ }
+ Assert.assertNotNull("No Assignment found at offset " + offset, ass);
+ EStructuralFeature feature = object.eClass().getEStructuralFeature(
+ ass.getFeature());
+ return Tuples.create(object, feature);
+ }
+
+ public ILeafNode getLeafNodeAtOffset() {
+ ILeafNode node = NodeModelUtils.findLeafNodeAtOffset(resource
+ .getParseResult().getRootNode(), offset);
+ Assert.assertNotNull("No Leaf Node found at offset " + offset, node);
+ return node;
+ }
+
+ @Override
+ public int hashCode() {
+ return offset * (resource != null ? resource.hashCode() : 1);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null || obj.getClass() != getClass())
+ return false;
+ Offset off = (Offset) obj;
+ return resource == off.resource && offset == off.offset;
+ }
+
+ public int getOffset() {
+ return offset;
+ }
+
+ public XtextResource getResource() {
+ return resource;
+ }
+
+ @Override
+ public String toString() {
+ if (resource == null)
+ return "(resource is null)";
+ if (resource.getParseResult() == null
+ || resource.getParseResult().getRootNode() == null)
+ return "(resource hs no parse result)";
+ String text = resource.getParseResult().getRootNode().getText();
+ if (offset < 0 || offset > text.length())
+ return "(offset out of range)";
+ int from = Math.max(0, offset - 5);
+ int to = Math.min(text.length(), offset + 5);
+ return text.substring(from, offset) + "!" + text.substring(offset, to);
+ }
+}

Back to the top