Skip to content

Commit 12610ba

Browse files
authored
Merge pull request dsldevkit#1067 from rubenporras/proxyNodeModel
perf: do not install proxy node models on the complete AST
2 parents 85a9e23 + 90186d2 commit 12610ba

File tree

2 files changed

+33
-12
lines changed

2 files changed

+33
-12
lines changed

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

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
import org.eclipse.emf.common.notify.Notification;
1919
import org.eclipse.emf.common.notify.Notifier;
2020
import org.eclipse.emf.common.util.EList;
21-
import org.eclipse.emf.common.util.TreeIterator;
2221
import org.eclipse.emf.common.util.URI;
2322
import org.eclipse.emf.common.util.WrappedException;
2423
import org.eclipse.emf.ecore.EObject;
@@ -77,39 +76,42 @@ static void installProxyNodeModel(final Resource resource) {
7776
return;
7877
}
7978

80-
ArrayList<EObject> idToEObjectMap = Lists.newArrayList(); // NOPMD LooseCoupling
8179
EObject root = resource.getContents().get(0);
8280

83-
ProxyCompositeNode rootNode = installProxyNodeModel(root, idToEObjectMap);
84-
idToEObjectMap.trimToSize();
85-
rootNode.idToEObjectMap = idToEObjectMap;
81+
ProxyCompositeNode rootNode = installProxyNodeModel(root);
82+
rootNode.idToEObjectMap = Lists.newArrayList();
83+
fillIdToEObjectMap(root, rootNode.idToEObjectMap);
84+
((ArrayList<?>) rootNode.idToEObjectMap).trimToSize();
8685

8786
if (resource instanceof XtextResource) {
8887
((XtextResource) resource).setParseResult(new ParseResult(root, rootNode, false));
8988
}
9089
}
9190

92-
private static ProxyCompositeNode installProxyNodeModel(final EObject eObject, final List<EObject> map) {
91+
private static ProxyCompositeNode installProxyNodeModel(final EObject eObject) {
9392
ProxyCompositeNode result = new ProxyCompositeNode();
9493
eObject.eAdapters().add(result);
94+
return result;
95+
}
96+
97+
private static void fillIdToEObjectMap(final EObject eObject, final List<EObject> map) {
9598
map.add(eObject);
9699

97100
FeatureIterator<EObject> iterator = (FeatureIterator<EObject>) eObject.eContents().iterator();
98101
if (iterator instanceof Filterable filterable) {
99102
filterable.filter(f -> !f.isTransient());
100103
for (FeatureIterator<EObject> it = iterator; it.hasNext();) {
101-
installProxyNodeModel(it.next(), map);
104+
fillIdToEObjectMap(it.next(), map);
102105
}
103106
} else {
104107
// post-filter the iterator, which is extra work
105108
for (FeatureIterator<EObject> it = iterator; it.hasNext();) {
106109
EObject child = it.next();
107110
if (!it.feature().isTransient()) {
108-
installProxyNodeModel(child, map);
111+
fillIdToEObjectMap(child, map);
109112
}
110113
}
111114
}
112-
return result;
113115
}
114116

115117
/**
@@ -126,9 +128,6 @@ static List<EObject> uninstallProxyNodeModel(final Resource resource) {
126128
ProxyCompositeNode proxyNode = uninstallProxyNode(root);
127129
if (proxyNode != null) {
128130
result = proxyNode.idToEObjectMap;
129-
for (TreeIterator<EObject> it = root.eAllContents(); it.hasNext();) {
130-
uninstallProxyNode(it.next());
131-
}
132131
}
133132
}
134133

com.avaloq.tools.ddk.xtext/src/com/avaloq/tools/ddk/xtext/util/ParseTreeUtil.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import org.eclipse.emf.ecore.EObject;
2020
import org.eclipse.emf.ecore.EStructuralFeature;
21+
import org.eclipse.emf.ecore.resource.Resource;
2122
import org.eclipse.xtext.CrossReference;
2223
import org.eclipse.xtext.Keyword;
2324
import org.eclipse.xtext.RuleCall;
@@ -28,6 +29,7 @@
2829
import org.eclipse.xtext.nodemodel.INode;
2930
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
3031

32+
import com.avaloq.tools.ddk.xtext.linking.LazyLinkingResource2;
3133
import com.google.common.collect.Iterables;
3234

3335

@@ -127,6 +129,21 @@ public static String getParsedString(final EObject object, final String featureN
127129
return getParsedStringUnchecked(object, feature, convert);
128130
}
129131

132+
/**
133+
* Ensure the node model loaded.
134+
*
135+
* @param resource
136+
* the resource
137+
*/
138+
public static void ensureNodeModelLoaded(final Resource resource) {
139+
if (resource instanceof LazyLinkingResource2 lazyLinkinResource && lazyLinkinResource.isLoadedFromStorage()) {
140+
EObject root = resource.getContents().get(0);
141+
if (root != null && NodeModelUtils.getNode(root) instanceof ICompositeNode composite) {
142+
composite.getText(); // side-effect on removing com.avaloq.tools.ddk.xtext.resource.persistence.ProxyCompositeNode
143+
}
144+
}
145+
}
146+
130147
/**
131148
* Returns the source text assigned to the given feature of the given object. Does not work for multi-valued features. Optionally also converts the source
132149
* text using the corresponding value converter. Conversion is only performed for keywords, rule call or cross reference grammar rules.
@@ -143,6 +160,11 @@ public static String getParsedString(final EObject object, final String featureN
143160
*/
144161
public static String getParsedStringUnchecked(final EObject object, final EStructuralFeature feature, final boolean convert) {
145162
INode node = Iterables.getFirst(NodeModelUtils.findNodesForFeature(object, feature), null);
163+
164+
if (node == null) {
165+
ensureNodeModelLoaded(object.eResource());
166+
node = Iterables.getFirst(NodeModelUtils.findNodesForFeature(object, feature), null);
167+
}
146168
if (node != null) {
147169
if (convert) {
148170
final LazyLinkingResource res = (LazyLinkingResource) object.eResource();

0 commit comments

Comments
 (0)