code: protected ICompositeNode findNodeFor(EObject semanticObject) {
  		ICompositeNode result = NodeModelUtils.getNode(semanticObject);
  		if (result != null) {
  			ICompositeNode node = result;
  			while (GrammarUtil.containingAssignment(node.getGrammarElement()) == null && node.getParent() != null && !node.getParent().hasDirectSemanticElement()) {
  				ICompositeNode parent = node.getParent();
  				if (node.hasSiblings()) {
  					for(INode sibling: parent.getChildren()) {
  						EObject grammarElement = sibling.getGrammarElement();
  						if (grammarElement != null && GrammarUtil.containingAssignment(grammarElement) != null) {
  							result = parent;
  						}
  					}
  				}
  				node = parent;
  			}
  		}
  		return result;
  	}
docs: Returns the smallest node that covers all assigned values of the given object. It handles the semantics of {@link Action
  actions} and {@link RuleCall unassigned rule calls}.
  
  @return the minimal node that covers all assigned values of the given object.
  @since 2.3