aran
Version:
JavaScript instrumenter
117 lines (112 loc) • 3.26 kB
JavaScript
import { mapIndex } from "../../util/index.mjs";
import {
makeArrayExpression,
makeDataDescriptorExpression,
} from "../intrinsic.mjs";
import {
makePrimitiveExpression,
makeEffectStatement,
makeWriteEffect,
makeApplyExpression,
makeIntrinsicExpression,
} from "../node.mjs";
/**
* @type {(
* node: import("estree-sentry").TemplateElement<import("../hash.d.ts").HashProp>,
* options: {
* cooked: boolean,
* },
* ) => import("../atom.d.ts").Expression}
*/
const transQuasi = (node, { cooked }) => {
const { _hash: hash } = node;
if (cooked) {
if (node.value.cooked == null) {
return makeIntrinsicExpression("undefined", hash);
} else {
return makePrimitiveExpression(node.value.cooked, hash);
}
} else {
return makePrimitiveExpression(node.value.raw, hash);
}
};
/**
* @type {(
* template: import("./template.d.ts").Template,
* ) => import("../atom.d.ts").Statement}
*/
export const makePreludeTemplateStatement = ({ variable, value: node }) => {
const { _hash: hash } = node;
return makeEffectStatement(
makeWriteEffect(
variable,
makeApplyExpression(
makeIntrinsicExpression("Object.freeze", hash),
makeIntrinsicExpression("undefined", hash),
[
makeApplyExpression(
makeIntrinsicExpression("Object.defineProperty", hash),
makeIntrinsicExpression("undefined", hash),
[
makeArrayExpression(
mapIndex(node.quasi.quasis.length, (index) =>
transQuasi(node.quasi.quasis[index], { cooked: true }),
),
hash,
),
makePrimitiveExpression("raw", hash),
makeDataDescriptorExpression(
{
value: makeApplyExpression(
makeIntrinsicExpression("Object.freeze", hash),
makeIntrinsicExpression("undefined", hash),
[
makeArrayExpression(
mapIndex(node.quasi.quasis.length, (index) =>
transQuasi(node.quasi.quasis[index], {
cooked: false,
}),
),
hash,
),
],
hash,
),
writable: false,
enumerable: false,
configurable: false,
},
hash,
),
],
hash,
),
],
hash,
),
hash,
),
hash,
);
};
/**
* @type {(
* prelude: import("./index.d.ts").Prelude,
* ) => null | [
* import("../variable.d.ts").MetaVariable,
* import("../../lang/syntax.d.ts").Intrinsic,
* ]}
*/
export const getPreludeTemplateBinding = (prelude) =>
prelude.type === "template"
? [prelude.data.variable, "aran.deadzone_symbol"]
: null;
/**
* @type {(
* prelude: import("./index.d.ts").Prelude,
* ) => null | import("../atom.d.ts").Statement}
*/
export const getPreludeTemplateStatement = (prelude) =>
prelude.type === "template"
? makePreludeTemplateStatement(prelude.data)
: null;