function isAfterOptional(node) {
	let leftNode;

	if (node.type === "MemberExpression") {
		leftNode = node.object;
	} else if (node.type === "CallExpression") {
		leftNode = node.callee;
	} else {
		return false;
	}
	if (node.optional) {
		return true;
	}
	return isAfterOptional(leftNode);
}
Returns true if the node or any of the objects
to the left of it in the member/call chain is optional.

e.g. `a?.b`, `a?.b.c`, `a?.()`, `a()?.()`
@param {ASTNode} node The expression to check
@returns {boolean} `true` if there is a short-circuiting optional `?.`
in the same option chain to the left of this call or member expression,
or the node itself is an optional call or member `?.`.