Skip to content

Commit e66ea6b

Browse files
committed
feat: do not eagerly populate the idToEObjectMap
1 parent 8e5f548 commit e66ea6b

File tree

2 files changed

+22
-24
lines changed

2 files changed

+22
-24
lines changed

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

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -65,16 +65,10 @@ public class DirectLinkingResourceStorageLoadable extends ResourceStorageLoadabl
6565
* - count the number of EObjects added to the Resource
6666
*/
6767
private final class EObjectInputStreamExtension extends BinaryResourceImpl.EObjectInputStream {
68-
private int objectCount;
69-
7068
private EObjectInputStreamExtension(final InputStream inputStream, final Map<?, ?> options) throws IOException {
7169
super(inputStream, options);
7270
}
7371

74-
public int eObjectCount() {
75-
return objectCount;
76-
}
77-
7872
@Override
7973
public int readCompressedInt() throws IOException {
8074
// HACK! null resource set, to avoid usage of resourceSet's package registry
@@ -86,7 +80,6 @@ public int readCompressedInt() throws IOException {
8680
public InternalEObject loadEObject() throws IOException {
8781
final InternalEObject result = super.loadEObject();
8882
handleLoadEObject(result, this);
89-
objectCount++;
9083
return result;
9184
}
9285

@@ -146,8 +139,6 @@ public void loadResource(final Resource resource) throws IOException {
146139

147140
private ResourceLoadMode mode;
148141

149-
private int eObjectCount;
150-
151142
public DirectLinkingResourceStorageLoadable(final InputStream in, final boolean loadNodeModel, final boolean splitContents, final ITraceSet traceSet) {
152143
super(in, loadNodeModel);
153144
this.loadNodeModel = loadNodeModel;
@@ -271,7 +262,7 @@ protected void loadEntries(final StorageAwareResource resource, final ZipInputSt
271262
case SKIP:
272263
break;
273264
case PROXY:
274-
ProxyCompositeNode.installProxyNodeModel(resource, eObjectCount);
265+
ProxyCompositeNode.installProxyNodeModel(resource);
275266
break;
276267
case LOAD:
277268
readNodeModel(resource, new NonLockingBufferInputStream(zipIn), content);
@@ -379,7 +370,6 @@ private Deque<EObject> readMappedEObjects(final DirectLinkingEObjectInputStream
379370
protected void readContents(final StorageAwareResource resource, final InputStream inputStream) throws IOException {
380371
final EObjectInputStreamExtension in = new EObjectInputStreamExtension(inputStream, Collections.emptyMap());
381372
in.loadResource(resource);
382-
eObjectCount = in.eObjectCount();
383373
}
384374

385375
}

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

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.eclipse.xtext.nodemodel.util.NodeModelUtils;
3838
import org.eclipse.xtext.nodemodel.util.NodeTreeIterator;
3939
import org.eclipse.xtext.nodemodel.util.ReversedBidiTreeIterable;
40+
import org.eclipse.xtext.parser.IParseResult;
4041
import org.eclipse.xtext.parser.ParseResult;
4142
import org.eclipse.xtext.resource.XtextResource;
4243
import org.eclipse.xtext.resource.persistence.IResourceStorageFacade;
@@ -53,7 +54,7 @@
5354
* To conserve memory this class implements the primary interfaces rather than extending an implementation like
5455
* {@link org.eclipse.xtext.nodemodel.impl.CompositeNodeWithSemanticElement}.
5556
*/
56-
class ProxyCompositeNode implements ICompositeNode, BidiTreeIterable<INode>, Adapter {
57+
public class ProxyCompositeNode implements ICompositeNode, BidiTreeIterable<INode>, Adapter {
5758

5859
/** The root node proxy stores the original EObject ID map so that it can be used when installing the real node model. */
5960
private List<EObject> idToEObjectMap;
@@ -69,31 +70,37 @@ class ProxyCompositeNode implements ICompositeNode, BidiTreeIterable<INode>, Ada
6970
*
7071
* @param resource
7172
* resource, must not be {@code null}
72-
* @param expectedEObjectCount
73-
* the expected EObject count of the resource
7473
*/
75-
static void installProxyNodeModel(final Resource resource, final int expectedEObjectCount) {
74+
static void installProxyNodeModel(final Resource resource) {
7675
if (resource.getContents().isEmpty()) {
7776
return;
7877
}
7978

80-
EObject root = resource.getContents().get(0);
81-
82-
ProxyCompositeNode rootNode = installProxyNodeModel(root);
83-
rootNode.idToEObjectMap = new ArrayList<>(expectedEObjectCount);
84-
fillIdToEObjectMap(root, rootNode.idToEObjectMap);
85-
86-
if (resource instanceof XtextResource) {
87-
((XtextResource) resource).setParseResult(new ParseResult(root, rootNode, false));
79+
if (resource instanceof XtextResource xtextResource) {
80+
EObject root = resource.getContents().get(0);
81+
xtextResource.setParseResult(new ParseResult(root, createRootNode(root), false));
8882
}
8983
}
9084

91-
private static ProxyCompositeNode installProxyNodeModel(final EObject eObject) {
85+
private static ProxyCompositeNode createRootNode(final EObject eObject) {
9286
ProxyCompositeNode result = new ProxyCompositeNode();
9387
eObject.eAdapters().add(result);
9488
return result;
9589
}
9690

91+
/**
92+
* Fill id to EOject map.
93+
*
94+
* @param parseResult
95+
* the {@link IParseResult}
96+
*/
97+
public static void fillIdToEObjectMap(final IParseResult parseResult) {
98+
if (parseResult.getRootNode() instanceof ProxyCompositeNode rootNode && rootNode.idToEObjectMap == null) {
99+
rootNode.idToEObjectMap = new ArrayList<>();
100+
fillIdToEObjectMap(parseResult.getRootASTElement(), rootNode.idToEObjectMap);
101+
}
102+
}
103+
97104
private static void fillIdToEObjectMap(final EObject eObject, final List<EObject> map) {
98105
map.add(eObject);
99106

@@ -422,6 +429,7 @@ public void setTarget(final Notifier newTarget) {
422429
public NodeModelUtils.Implementation utils() {
423430
return delegate().utils();
424431
}
432+
425433
}
426434

427435
/* Copyright (c) Avaloq Licence AG */

0 commit comments

Comments
 (0)