docs: private static EObject findActualSemanticObjectInChildren(/* @NonNull */ INode node, /* @Nullable */ EObject grammarElement) {
  		if (node.hasDirectSemanticElement())
  			return node.getSemanticElement();
  		AbstractRule rule = null;
  		if (grammarElement instanceof RuleCall) {
  			rule = ((RuleCall) grammarElement).getRule();
  		} else if (grammarElement instanceof AbstractRule) {
  			rule = (AbstractRule) grammarElement;
  		}
  		if (rule instanceof ParserRule && !GrammarUtil.isDatatypeRule(rule)) {
  			if (node instanceof ICompositeNode) {
  				for (INode child : ((ICompositeNode) node).getChildren()) {
  					if (child instanceof ICompositeNode) {
  						EObject childGrammarElement = child.getGrammarElement();
  						if (childGrammarElement instanceof Action) {
  							EObject result = findActualSemanticObjectInChildren(child, childGrammarElement);
  							if (result != null)
  								return result;
  						} else if (childGrammarElement instanceof RuleCall) {
  							RuleCall childRuleCall = (RuleCall) childGrammarElement;
  							if (childRuleCall.getRule() instanceof ParserRule
  									&& !GrammarUtil.isDatatypeRule(childRuleCall.getRule())) {
  								EObject result = findActualSemanticObjectInChildren(child, childRuleCall);
  								if (result != null)
  									return result;
  							}
  						}
  					}
  				}
  			}
  		}
  		return null;
  	}