private INode findNode(
     EObject source, boolean sourceFound, INode root, Keyword keyword, int[] index) {
   if (sourceFound && root.getSemanticElement() != source) {
     return null;
   }
   if (root.getSemanticElement() == source) {
     sourceFound = true;
   }
   EObject grammarElement = root.getGrammarElement();
   // .equals or == does not work because sub grammars use their own
   // Modules with custom
   // grammarAccess instance and .equals is not overwritten.
   if (grammarElement instanceof Keyword
       && keyword.getValue().equals(((Keyword) grammarElement).getValue())) {
     if (index[0] != INSIGNIFICANT_INDEX) {
       index[0]--;
     }
     if (index[0] == 0 || index[0] == INSIGNIFICANT_INDEX) {
       return root;
     }
   }
   if (root instanceof ICompositeNode) {
     ICompositeNode node = (ICompositeNode) root;
     for (INode child : node.getChildren()) {
       INode result = findNode(source, sourceFound, child, keyword, index);
       if (result != null) {
         return result;
       }
     }
   }
   return null;
 }
 @Override
 protected List<INode> getLocationNodes(EObject obj) {
   if (obj instanceof XMemberFeatureCall
       || obj instanceof XAssignment
       || obj instanceof XFeatureCall) {
     List<INode> resultNodes = Lists.newArrayList();
     final ICompositeNode startNode = findNodeFor(obj);
     boolean crossRefConsumed = false;
     for (INode child : startNode.getChildren()) {
       if (crossRefConsumed) {
         resultNodes.add(child);
       } else {
         EObject grammarElement = child.getGrammarElement();
         if (grammarElement instanceof CrossReference) {
           // We don't use the grammar access to be more robust against
           // overwriting grammars
           Assignment assignment = GrammarUtil.containingAssignment(grammarElement);
           if (XbasePackage.Literals.XABSTRACT_FEATURE_CALL__FEATURE
               .getName()
               .equals(assignment.getFeature())) {
             crossRefConsumed = true;
             resultNodes.add(child);
           }
         }
       }
     }
     if (!resultNodes.isEmpty()) return resultNodes;
   }
   return super.getLocationNodes(obj);
 }