SyntaxNodeDescriptor () { if (myTargetNode == null) { Set<SyntaxNodeDescriptor> visitedNodes = new HashSet<>(); visitedNodes.add(this); SyntaxNodeDescriptor targetNode = computeTargetNode(); while (targetNode instanceof SyntaxProxyDescriptor) { if (!visitedNodes.add(targetNode)) { targetNode = EMPTY_NODE; break; } targetNode = ((SyntaxProxyDescriptor)targetNode).computeTargetNode(); } myTargetNode = targetNode; } return myTargetNode; }