recast/test/parens-extra.ts
2022-04-26 08:49:45 -04:00

73 lines
2.1 KiB
TypeScript

import assert from "assert";
// the babel parser denotes decorative parens with extra.parenthesized
import * as babylon from "@babel/parser";
import { parse as recastParse } from "../lib/parser";
import { Printer } from "../lib/printer";
import * as parser from "../parsers/babel-ts";
import * as types from "ast-types";
const printer = new Printer();
const { namedTypes: n } = types;
function parseExpression(expr: any) {
const ast: any = babylon.parseExpression(expr);
return n.ExpressionStatement.check(ast) ? ast.expression : ast;
}
const parse = (expr: string) => recastParse(expr, { parser });
function check(expr: string) {
const ast = parse(expr);
const reprinted = printer.print(ast).code;
assert.strictEqual(expr, reprinted);
const expressionAst = parseExpression(expr);
const generic = printer.printGenerically(expressionAst).code;
types.astNodesAreEquivalent.assert(expressionAst, parseExpression(generic));
}
describe("parens from node.extra.parenthesized", function () {
it("AwaitExpression", function () {
check("async () => ({...(await obj)})");
check("(async function* () { yield await foo })");
});
it("YieldExpression", function () {
check("(function* () { return {...(yield obj)}})");
});
it("decorative parens", function () {
const ast = parse("1");
const expr = ast.program.body[0].expression;
expr.extra.parenthesized = true;
assert.strictEqual(printer.print(ast).code, "(1)");
});
it("decorative parens which are also necessary", function () {
const ast = parse("(1).foo");
const expr = ast.program.body[0].expression;
expr.object.extra.parenthesized = false;
assert.strictEqual(printer.print(ast).code, "(1).foo");
});
it("prints top level parens for an expression ast", function () {
check("(() => {})()");
check("(function () {} ())");
});
describe("reprinter", function () {
it("preserves necessary parens", function () {
const ast = parse("() => ({ prop: true })");
const expr = ast.program.body[0].expression;
expr.body.properties = [];
assert.strictEqual(printer.print(ast).code, "() => ({})");
});
});
});