45 lines
1.3 KiB
JavaScript
45 lines
1.3 KiB
JavaScript
import { group, indent, softline } from "../../document/index.js";
|
|
import {
|
|
isCallExpression,
|
|
isMemberExpression,
|
|
} from "../utilities/node-types.js";
|
|
import { startsWithNoLookaheadToken } from "../utilities/starts-with-no-lookahead-token.js";
|
|
|
|
/**
|
|
* @import AstPath from "../../common/ast-path.js"
|
|
* @import {Doc} from "../../document/index.js"
|
|
*/
|
|
|
|
function printAwaitExpression(path, options, print) {
|
|
const { node } = path;
|
|
/** @type{Doc[]} */
|
|
let parts = ["await"];
|
|
if (node.argument) {
|
|
parts.push(" ", print("argument"));
|
|
const { parent } = path;
|
|
if (
|
|
(isCallExpression(parent) && parent.callee === node) ||
|
|
(isMemberExpression(parent) && parent.object === node)
|
|
) {
|
|
parts = [indent([softline, ...parts]), softline];
|
|
// avoid printing `await (await` on one line
|
|
const parentAwaitOrBlock = path.findAncestor(
|
|
(node) =>
|
|
node.type === "AwaitExpression" || node.type === "BlockStatement",
|
|
);
|
|
if (
|
|
parentAwaitOrBlock?.type !== "AwaitExpression" ||
|
|
!startsWithNoLookaheadToken(
|
|
parentAwaitOrBlock.argument,
|
|
(leftmostNode) => leftmostNode === node,
|
|
)
|
|
) {
|
|
return group(parts);
|
|
}
|
|
}
|
|
}
|
|
return parts;
|
|
}
|
|
|
|
export { printAwaitExpression };
|