3737import org .eclipse .xtext .nodemodel .util .NodeModelUtils ;
3838import org .eclipse .xtext .nodemodel .util .NodeTreeIterator ;
3939import org .eclipse .xtext .nodemodel .util .ReversedBidiTreeIterable ;
40+ import org .eclipse .xtext .parser .IParseResult ;
4041import org .eclipse .xtext .parser .ParseResult ;
4142import org .eclipse .xtext .resource .XtextResource ;
4243import org .eclipse .xtext .resource .persistence .IResourceStorageFacade ;
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
0 commit comments