diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/EObjectAtOffsetHelper.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/EObjectAtOffsetHelper.java index 07bd52c2a..bcb9d38d1 100644 --- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/EObjectAtOffsetHelper.java +++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/resource/EObjectAtOffsetHelper.java @@ -29,12 +29,20 @@ import org.eclipse.xtext.util.TextRegion; public class EObjectAtOffsetHelper { /** - * @return the contained element next to the offset + * @return the declared or the referenced element next to the offset */ public EObject resolveElementAt(XtextResource resource, int offset) { - return internalResolveElementAt(resource, offset, true); + return internalResolveElementAt(resource, offset, false); } + /** + * @return the declared element next to the offset + * @since 2.3 + */ + public EObject resolveContainedElementAt(XtextResource resource, int offset) { + return internalResolveElementAt(resource, offset, true); + } + /** * @return the cross referenced EObject under, right or left to the cursor (in that order) or * null if there is no cross referenced object next to the offset. @@ -107,11 +115,11 @@ public class EObjectAtOffsetHelper { } protected EObject internalResolveElementAt(XtextResource resource, int offset, boolean containment) { - if(!containment){ + if(!containment) { EObject crossRef = resolveCrossReferencedElementAt(resource, offset); if (crossRef != null) return crossRef; - } + } IParseResult parseResult = resource.getParseResult(); if (parseResult != null && parseResult.getRootNode() != null) { ILeafNode leaf = NodeModelUtils.findLeafNodeAtOffset(parseResult.getRootNode(), offset); diff --git a/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/resource/EObjectAtOffsetTest.java b/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/resource/EObjectAtOffsetTest.java index 4ee9d9071..800a9210e 100644 --- a/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/resource/EObjectAtOffsetTest.java +++ b/tests/org.eclipse.xtext.tests/src/org/eclipse/xtext/resource/EObjectAtOffsetTest.java @@ -46,9 +46,9 @@ public class EObjectAtOffsetTest extends AbstractXtextTests { String modelAsString = "foo foo0 bar bar0 foo0 bar bar1 foo0"; XtextResource resource = getResourceFromString(modelAsString); Model model = (Model) resource.getContents().get(0); - checkContainedElementAt(resource, modelAsString, "foo foo0 ", model.getFoos().get(0)); - checkContainedElementAt(resource, modelAsString, "bar bar0 ", model.getBars().get(0)); - checkContainedElementAt(resource, modelAsString, "bar bar1 ", model.getBars().get(1)); + checkContainedOrReferencedElementAt(resource, modelAsString, "foo foo0 ", model.getFoos().get(0)); + checkContainedOrReferencedElementAt(resource, modelAsString, "bar bar0 ", model.getBars().get(0)); + checkContainedOrReferencedElementAt(resource, modelAsString, "bar bar1 ", model.getBars().get(1)); } @Test public void testCrossRefs_01() throws Exception { @@ -107,20 +107,20 @@ public class EObjectAtOffsetTest extends AbstractXtextTests { String modelAsString = "bar bar0 foo0 foobar foo1 foo foo0 foo foo1"; XtextResource resource = getResourceFromString(modelAsString); Model model = (Model) resource.getContents().get(0); - checkContainedElementAt(resource, modelAsString, "foobar ", model.getBars().get(0)); + checkContainedOrReferencedElementAt(resource, modelAsString, "foobar ", model.getBars().get(0)); checkCrossReferencedElementAt(resource, modelAsString, "foo0 ", model.getFoos().get(0)); checkCrossReferencedElementAt(resource, modelAsString, "foo1 ", model.getFoos().get(1)); - checkContainedElementAt(resource, modelAsString, "bar bar0 ", ((FooBar) model.getBars().get(0)).getBar()); + checkContainedOrReferencedElementAt(resource, modelAsString, "bar bar0 ", ((FooBar) model.getBars().get(0)).getBar()); } @Test public void testAction_02() throws Exception { String modelAsString = "zonk 1 bar bar0 foo0 foobar foo1 foo foo0 foo foo1"; XtextResource resource = getResourceFromString(modelAsString); Model model = (Model) resource.getContents().get(0); - checkContainedElementAt(resource, modelAsString, "foobar ", model.getBars().get(0)); + checkContainedOrReferencedElementAt(resource, modelAsString, "foobar ", model.getBars().get(0)); checkCrossReferencedElementAt(resource, modelAsString, "foo0 ", model.getFoos().get(0)); checkCrossReferencedElementAt(resource, modelAsString, "foo1 ", model.getFoos().get(1)); - checkContainedElementAt(resource, modelAsString, "bar bar0 ", ((FooBar) model.getBars().get(0)).getBar()); + checkContainedOrReferencedElementAt(resource, modelAsString, "bar bar0 ", ((FooBar) model.getBars().get(0)).getBar()); } @Test public void testFindCrossReferencedElementAt() throws Exception { @@ -169,20 +169,23 @@ public class EObjectAtOffsetTest extends AbstractXtextTests { assertNull(eObjectAtOffsetHelper.getCrossReferenceNode(resource, new TextRegion(firstPart.length()+1, 9))); } - private void checkContainedElementAt(XtextResource resource, String model, String substring, EObject expectedElement) { + private void checkContainedOrReferencedElementAt(XtextResource resource, String model, String substring, EObject expectedElement) { int index = model.indexOf(substring); for (int i = index; i < index + substring.length(); ++i) { EObject foundElement = eObjectAtOffsetHelper.resolveElementAt(resource, i); assertEquals(expectedElement, foundElement); + foundElement = eObjectAtOffsetHelper.resolveCrossReferencedElementAt(resource, i); + assertNotSame(expectedElement, foundElement); } } - private void checkCrossReferencedElementAt(XtextResource resource, String model, String substring, - EObject expectedElement) { + private void checkCrossReferencedElementAt(XtextResource resource, String model, String substring, EObject expectedElement) { int index = model.indexOf(substring); for (int i = index; i < index + substring.length(); ++i) { EObject foundElement = eObjectAtOffsetHelper.resolveCrossReferencedElementAt(resource, i); assertEquals(expectedElement, foundElement); + foundElement = eObjectAtOffsetHelper.resolveElementAt(resource, i); + assertEquals(expectedElement, foundElement); } } }