function report(node) {
			const memberNode = node.parent;
			const callNode =
				memberNode.parent.type === "ChainExpression"
					? memberNode.parent.parent
					: memberNode.parent;

			context.report({
				node: callNode,
				messageId: "unexpected",
				loc: memberNode.property.loc,

				fix(fixer) {
					if (!isSideEffectFree(callNode.arguments[0])) {
						return null;
					}

					/*
					 * The list of the first/last token pair of a removal range.
					 * This is two parts because closing parentheses may exist between the method name and arguments.
					 * E.g. `(function(){}.bind ) (obj)`
					 *                    ^^^^^   ^^^^^ < removal ranges
					 * E.g. `(function(){}?.['bind'] ) ?.(obj)`
					 *                    ^^^^^^^^^^   ^^^^^^^ < removal ranges
					 */
					const tokenPairs = [
						[
							// `.`, `?.`, or `[` token.
							sourceCode.getTokenAfter(
								memberNode.object,
								astUtils.isNotClosingParenToken,
							),

							// property name or `]` token.
							sourceCode.getLastToken(memberNode),
						],
						[
							// `?.` or `(` token of arguments.
							sourceCode.getTokenAfter(
								memberNode,
								astUtils.isNotClosingParenToken,
							),

							// `)` token of arguments.
							sourceCode.getLastToken(callNode),
						],
					];
					const firstTokenToRemove = tokenPairs[0][0];
					const lastTokenToRemove = tokenPairs[1][1];

					if (
						sourceCode.commentsExistBetween(
							firstTokenToRemove,
							lastTokenToRemove,
						)
					) {
						return null;
					}

					return tokenPairs.map(([start, end]) =>
						fixer.removeRange([start.range[0], end.range[1]]),
					);
				},
			});
		}
Reports a given function node.
@param {ASTNode} node A node to report. This is a FunctionExpression or
     an ArrowFunctionExpression.
@returns {void}