function maybeAsiHazard(node) {
			const SAFE_TOKENS_BEFORE = /^[:;{]$/u; // One of :;{
			const UNSAFE_CHARS_AFTER = /^[-[(/+`]/u; // One of [(/+-`

			const tokenBefore = sourceCode.getTokenBefore(node);
			const tokenAfter = sourceCode.getTokenAfter(node);

			return (
				Boolean(tokenAfter) &&
				UNSAFE_CHARS_AFTER.test(tokenAfter.value) &&
				tokenAfter.value !== "++" &&
				tokenAfter.value !== "--" &&
				Boolean(tokenBefore) &&
				!SAFE_TOKENS_BEFORE.test(tokenBefore.value)
			);
		}
Checks if removing the ExpressionStatement node will cause ASI to
break.
eg.
foo()
console.log();
[1, 2, 3].forEach(a => doSomething(a))

Removing the console.log(); statement should leave two statements, but
here the two statements will become one because [ causes continuation after
foo().
@param {ASTNode} node The ExpressionStatement node to check.
@returns {boolean} `true` if ASI will break after removing the ExpressionStatement
     node.