/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at . */
import * as t from "@babel/types";
export function isFunction(node) {
return (
t.isFunction(node) ||
t.isArrowFunctionExpression(node) ||
t.isObjectMethod(node) ||
t.isClassMethod(node)
);
}
export function isAwaitExpression(path) {
const { node, parent } = path;
return (
t.isAwaitExpression(node) ||
t.isAwaitExpression(parent.init) ||
t.isAwaitExpression(parent)
);
}
export function isYieldExpression(path) {
const { node, parent } = path;
return (
t.isYieldExpression(node) ||
t.isYieldExpression(parent.init) ||
t.isYieldExpression(parent)
);
}
export function getMemberExpression(root) {
function _getMemberExpression(node, expr) {
if (t.isMemberExpression(node)) {
expr = [node.property.name].concat(expr);
return _getMemberExpression(node.object, expr);
}
if (t.isCallExpression(node)) {
return [];
}
if (t.isThisExpression(node)) {
return ["this"].concat(expr);
}
return [node.name].concat(expr);
}
const expr = _getMemberExpression(root, []);
return expr.join(".");
}
export function getVariables(dec) {
if (!dec.id) {
return [];
}
if (t.isArrayPattern(dec.id)) {
if (!dec.id.elements) {
return [];
}
// NOTE: it's possible that an element is empty or has several variables
// e.g. const [, a] = arr
// e.g. const [{a, b }] = 2
return dec.id.elements
.filter(Boolean)
.map(element => ({
name: t.isAssignmentPattern(element)
? element.left.name
: element.name || element.argument?.name,
location: element.loc,
}))
.filter(({ name }) => name);
}
return [
{
name: dec.id.name,
location: dec.loc,
},
];
}
/**
* Add the identifiers for a given object pattern.
*
* @param {Array.