@Override
 public int getChildRole(ASTNode child) {
   LOG.assertTrue(child.getTreeParent() == this);
   if (ElementType.EXPRESSION_BIT_SET.contains(child.getElementType())) {
     if (child == getFirstChildNode()) return ChildRole.LOPERAND;
     if (child == getLastChildNode()) return ChildRole.ROPERAND;
     return ChildRoleBase.NONE;
   }
   if (OUR_OPERATIONS_BIT_SET.contains(child.getElementType())) {
     return ChildRole.OPERATION_SIGN;
   }
   return ChildRoleBase.NONE;
 }
 @Override
 public int getChildRole(ASTNode child) {
   LOG.assertTrue(child.getTreeParent() == this);
   IElementType i = child.getElementType();
   if (i == JavaElementType.EXPRESSION_LIST) {
     return ChildRole.ARGUMENT_LIST;
   } else {
     if (ElementType.EXPRESSION_BIT_SET.contains(child.getElementType())) {
       return ChildRole.METHOD_EXPRESSION;
     }
     return ChildRoleBase.NONE;
   }
 }
  @Override
  public ASTNode findChildByRole(int role) {
    LOG.assertTrue(ChildRole.isUnique(role));
    switch (role) {
      default:
        return null;

      case ChildRole.LOPERAND:
        return getFirstChildNode();

      case ChildRole.ROPERAND:
        return ElementType.EXPRESSION_BIT_SET.contains(getLastChildNode().getElementType())
            ? getLastChildNode()
            : null;

      case ChildRole.OPERATION_SIGN:
        return findChildByType(OUR_OPERATIONS_BIT_SET);
    }
  }