Home Reference Source Repository

src/util.js

import {ArrowFunctionExpression, Declaration, ExpressionStatement, FunctionExpression,
	Identifier, Literal, MemberExpression, Statement} from './ast'
import mangleIdentifier, {propertyNameOk} from './mangle-identifier'

/**
Mangles name and makes an {@link Identifier}.
@param {string} name
@return {Identifier}
*/
export function identifier(name) {
	return new Identifier(mangleIdentifier(name))
}

/**
Assigns `loc` to `ast` and returns it.
@param {Node} ast
@param {Loc} loc
*/
export function loc(ast, loc) {
	ast.loc = loc
	return ast
}

/**
Creates a member expression for `propertyName` in `object`,
using dot syntax (`a.b`) if possible, and falling back to `a['b']`.
@param {Node} object
@param {string} propertyName
@return {MemberExpression}
*/
export function member(object, propertyName) {
	return new MemberExpression(object, propertyIdOrLiteral(propertyName))
}

/**
An Identifier if propertyName is a valid JavaScript property name;
otherwise a Literal string.
@param {string} propertyName
@return {Identifier|Literal}
*/
export function propertyIdOrLiteral(propertyName) {
	return propertyNameOk(propertyName) ?
		new Identifier(propertyName) :
		new Literal(propertyName)
}

export function functionExpressionThunk(body, generator) {
	return generator ?
		new FunctionExpression(null, [], body, true) :
		new ArrowFunctionExpression([], body)
}

/**
Convert any {@link Node} into one that can be used as the content of a line.
(esast requires all expression lines to be wrapped with {@link ExpressionStatement}.)
*/
export function toStatement(ast) {
	return ast instanceof Statement || ast instanceof Declaration ?
		ast :
		new ExpressionStatement(ast)
}