From 3ea1c8c71f906adedc950d309e2f8406d185ef25 Mon Sep 17 00:00:00 2001 From: U003649 <38555688+andrewL-avlq@users.noreply.github.com> Date: Fri, 19 Dec 2025 14:28:43 +0000 Subject: [PATCH] fix: keep parse result set while loading node model. Removes the window where the parse result is not set on a resource while loading the node model. This prevents NPEs occurring if concurrent reads try to use the node model. --- .../persistence/DirectLinkingResourceStorageLoadable.java | 4 +++- .../ddk/xtext/resource/persistence/ProxyCompositeNode.java | 4 ---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/com.avaloq.tools.ddk.xtext/src/com/avaloq/tools/ddk/xtext/resource/persistence/DirectLinkingResourceStorageLoadable.java b/com.avaloq.tools.ddk.xtext/src/com/avaloq/tools/ddk/xtext/resource/persistence/DirectLinkingResourceStorageLoadable.java index 04efeaf6e3..5c95737318 100644 --- a/com.avaloq.tools.ddk.xtext/src/com/avaloq/tools/ddk/xtext/resource/persistence/DirectLinkingResourceStorageLoadable.java +++ b/com.avaloq.tools.ddk.xtext/src/com/avaloq/tools/ddk/xtext/resource/persistence/DirectLinkingResourceStorageLoadable.java @@ -37,6 +37,7 @@ import org.eclipse.xtext.nodemodel.impl.SerializableNodeModel; import org.eclipse.xtext.nodemodel.serialization.DeserializationConversionContext; import org.eclipse.xtext.parser.ParseResult; +import org.eclipse.xtext.resource.XtextResource; import org.eclipse.xtext.resource.persistence.ResourceStorageLoadable; import org.eclipse.xtext.resource.persistence.StorageAwareResource; @@ -322,7 +323,8 @@ private void addFakeModel(final StorageAwareResource resource) { protected void readNodeModel(final StorageAwareResource resource, final InputStream inputStream, final String content) throws IOException { DeserializationConversionContext deserializationContext = new ProxyAwareDeserializationConversionContext(resource, content); DataInputStream dataIn = new DataInputStream(inputStream); - SerializableNodeModel serializableNodeModel = new SerializableNodeModel(resource); + // use empty resource here so that we can leave the proxy node in place right up until the loaded model is set below. + SerializableNodeModel serializableNodeModel = new SerializableNodeModel(new XtextResource()); serializableNodeModel.readObjectData(dataIn, deserializationContext); resource.setParseResult(new ParseResult(resource.getContents().get(0), serializableNodeModel.root, deserializationContext.hasErrors())); } diff --git a/com.avaloq.tools.ddk.xtext/src/com/avaloq/tools/ddk/xtext/resource/persistence/ProxyCompositeNode.java b/com.avaloq.tools.ddk.xtext/src/com/avaloq/tools/ddk/xtext/resource/persistence/ProxyCompositeNode.java index 92428e94d9..d1d0b56992 100644 --- a/com.avaloq.tools.ddk.xtext/src/com/avaloq/tools/ddk/xtext/resource/persistence/ProxyCompositeNode.java +++ b/com.avaloq.tools.ddk.xtext/src/com/avaloq/tools/ddk/xtext/resource/persistence/ProxyCompositeNode.java @@ -118,10 +118,6 @@ static List uninstallProxyNodeModel(final Resource resource) { result = proxyNode.idToEObjectMap; } } - - if (resource instanceof XtextResource) { - ((XtextResource) resource).setParseResult(null); - } return result; }