Files
test-repo/src/language-js/print/await-expression.js
T

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 };