diff --git a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/EcoreUtil2.java b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/EcoreUtil2.java
index f28e74cf8..fabf7efff 100644
--- a/plugins/org.eclipse.xtext/src/org/eclipse/xtext/EcoreUtil2.java
+++ b/plugins/org.eclipse.xtext/src/org/eclipse/xtext/EcoreUtil2.java
@@ -55,6 +55,7 @@ import org.eclipse.xtext.resource.DerivedStateAwareResource;
import org.eclipse.xtext.util.CancelIndicator;
import org.eclipse.xtext.util.Strings;
+import com.google.common.collect.AbstractIterator;
import com.google.common.collect.MapMaker;
/**
@@ -776,4 +777,31 @@ public class EcoreUtil2 extends EcoreUtil {
}
}).iterator();
}
+
+
+ /**
+ * Returns an Iterable that iterates over all containers of this EObject, from leaf to root. The obj
+ * itself is not included.
+ *
+ * @since 2.9
+ */
+ public static Iterable getAllContainers(final EObject obj) {
+ return new Iterable() {
+ @Override
+ public Iterator iterator() {
+ return new AbstractIterator() {
+
+ private EObject current = obj;
+
+ @Override
+ protected EObject computeNext() {
+ current = current.eContainer();
+ if (current == null)
+ return endOfData();
+ return current;
+ }
+ };
+ }
+ };
+ }
}