Skip to content

Commit 9dcc12d

Browse files
committed
Use filter in during the iteration whenever the iterator implements the
Filterable interface.
1 parent 38bdb3f commit 9dcc12d

File tree

2 files changed

+28
-8
lines changed

2 files changed

+28
-8
lines changed

com.avaloq.tools.ddk.xtext/src/com/avaloq/tools/ddk/xtext/resource/persistence/ProxyAwareSerializationConversionContext.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import org.eclipse.emf.ecore.EObject;
2020
import org.eclipse.emf.ecore.resource.Resource;
2121
import org.eclipse.emf.ecore.util.EContentsEList.FeatureIterator;
22+
import org.eclipse.emf.ecore.util.EContentsEList.Filterable;
2223
import org.eclipse.xtext.nodemodel.serialization.SerializationConversionContext;
2324
import org.eclipse.xtext.resource.XtextResource;
2425

@@ -80,10 +81,19 @@ static void fillIdToEObjectMap(final Resource resource, final List<EObject> map)
8081
static void fillIdToEObjectMap(final EObject eObject, final List<EObject> map) {
8182
map.add(eObject);
8283

83-
for (FeatureIterator<EObject> it = (FeatureIterator<EObject>) eObject.eContents().iterator(); it.hasNext();) {
84-
EObject child = it.next();
85-
if (!it.feature().isTransient()) {
86-
fillIdToEObjectMap(child, map);
84+
FeatureIterator<EObject> iterator = (FeatureIterator<EObject>) eObject.eContents().iterator();
85+
if (iterator instanceof Filterable filterable) {
86+
filterable.filter(f -> !f.isTransient());
87+
for (FeatureIterator<EObject> it = iterator; it.hasNext();) {
88+
fillIdToEObjectMap(it.next(), map);
89+
}
90+
} else {
91+
// post-filter the iterator, which is extra work
92+
for (FeatureIterator<EObject> it = iterator; it.hasNext();) {
93+
EObject child = it.next();
94+
if (!it.feature().isTransient()) {
95+
fillIdToEObjectMap(child, map);
96+
}
8797
}
8898
}
8999
}

com.avaloq.tools.ddk.xtext/src/com/avaloq/tools/ddk/xtext/resource/persistence/ProxyCompositeNode.java

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.eclipse.emf.ecore.EObject;
2424
import org.eclipse.emf.ecore.resource.Resource;
2525
import org.eclipse.emf.ecore.util.EContentsEList.FeatureIterator;
26+
import org.eclipse.emf.ecore.util.EContentsEList.Filterable;
2627
import org.eclipse.xtext.nodemodel.BidiIterable;
2728
import org.eclipse.xtext.nodemodel.BidiTreeIterable;
2829
import org.eclipse.xtext.nodemodel.BidiTreeIterator;
@@ -91,10 +92,19 @@ private static ProxyCompositeNode installProxyNodeModel(final EObject eObject, f
9192
eObject.eAdapters().add(result);
9293
map.add(eObject);
9394

94-
for (FeatureIterator<EObject> it = (FeatureIterator<EObject>) eObject.eContents().iterator(); it.hasNext();) {
95-
EObject child = it.next();
96-
if (!it.feature().isTransient()) {
97-
installProxyNodeModel(child, map);
95+
FeatureIterator<EObject> iterator = (FeatureIterator<EObject>) eObject.eContents().iterator();
96+
if (iterator instanceof Filterable filterable) {
97+
filterable.filter(f -> !f.isTransient());
98+
for (FeatureIterator<EObject> it = iterator; it.hasNext();) {
99+
installProxyNodeModel(it.next(), map);
100+
}
101+
} else {
102+
// post-filter the iterator, which is extra work
103+
for (FeatureIterator<EObject> it = iterator; it.hasNext();) {
104+
EObject child = it.next();
105+
if (!it.feature().isTransient()) {
106+
installProxyNodeModel(child, map);
107+
}
98108
}
99109
}
100110
return result;

0 commit comments

Comments
 (0)