187 lines
4.5 KiB
JavaScript
187 lines
4.5 KiB
JavaScript
/* */
|
|
"format cjs";
|
|
"use strict";
|
|
|
|
var _toolsProtectJs2 = require("./../../tools/protect.js");
|
|
|
|
var _toolsProtectJs3 = _interopRequireDefault(_toolsProtectJs2);
|
|
|
|
exports.__esModule = true;
|
|
|
|
function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj["default"] = obj; return newObj; } }
|
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
var _whitespace = require("./whitespace");
|
|
|
|
var _whitespace2 = _interopRequireDefault(_whitespace);
|
|
|
|
var _parentheses = require("./parentheses");
|
|
|
|
var parens = _interopRequireWildcard(_parentheses);
|
|
|
|
var _lodashCollectionEach = require("lodash/collection/each");
|
|
|
|
var _lodashCollectionEach2 = _interopRequireDefault(_lodashCollectionEach);
|
|
|
|
var _lodashCollectionSome = require("lodash/collection/some");
|
|
|
|
var _lodashCollectionSome2 = _interopRequireDefault(_lodashCollectionSome);
|
|
|
|
var _types = require("../../types");
|
|
|
|
var t = _interopRequireWildcard(_types);
|
|
|
|
_toolsProtectJs3["default"](module);
|
|
|
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
|
|
|
|
/**
|
|
* Test if node matches a set of type-matcher pairs.
|
|
* @example
|
|
* find({
|
|
* VariableDeclaration(node, parent) {
|
|
* return true;
|
|
* }
|
|
* }, node, parent);
|
|
*/
|
|
|
|
var find = function find(obj, node, parent) {
|
|
if (!obj) return;
|
|
var result;
|
|
|
|
var types = Object.keys(obj);
|
|
for (var i = 0; i < types.length; i++) {
|
|
var type = types[i];
|
|
|
|
if (t.is(type, node)) {
|
|
var fn = obj[type];
|
|
result = fn(node, parent);
|
|
if (result != null) break;
|
|
}
|
|
}
|
|
|
|
return result;
|
|
};
|
|
|
|
/**
|
|
* Whitespace and Parenthesis related methods for nodes.
|
|
*/
|
|
|
|
var Node = (function () {
|
|
function Node(node, parent) {
|
|
_classCallCheck(this, Node);
|
|
|
|
this.parent = parent;
|
|
this.node = node;
|
|
}
|
|
|
|
/**
|
|
* Test if `node` can have whitespace set by the user.
|
|
*/
|
|
|
|
Node.isUserWhitespacable = function isUserWhitespacable(node) {
|
|
return t.isUserWhitespacable(node);
|
|
};
|
|
|
|
/**
|
|
* Test if a `node` requires whitespace.
|
|
*/
|
|
|
|
Node.needsWhitespace = function needsWhitespace(node, parent, type) {
|
|
if (!node) return 0;
|
|
|
|
if (t.isExpressionStatement(node)) {
|
|
node = node.expression;
|
|
}
|
|
|
|
var linesInfo = find(_whitespace2["default"].nodes, node, parent);
|
|
|
|
if (!linesInfo) {
|
|
var items = find(_whitespace2["default"].list, node, parent);
|
|
if (items) {
|
|
for (var i = 0; i < items.length; i++) {
|
|
linesInfo = Node.needsWhitespace(items[i], node, type);
|
|
if (linesInfo) break;
|
|
}
|
|
}
|
|
}
|
|
|
|
return linesInfo && linesInfo[type] || 0;
|
|
};
|
|
|
|
/**
|
|
* Test if a `node` requires whitespace before it.
|
|
*/
|
|
|
|
Node.needsWhitespaceBefore = function needsWhitespaceBefore(node, parent) {
|
|
return Node.needsWhitespace(node, parent, "before");
|
|
};
|
|
|
|
/**
|
|
* Test if a `note` requires whitespace after it.
|
|
*/
|
|
|
|
Node.needsWhitespaceAfter = function needsWhitespaceAfter(node, parent) {
|
|
return Node.needsWhitespace(node, parent, "after");
|
|
};
|
|
|
|
/**
|
|
* Test if a `node` needs parentheses around it.
|
|
*/
|
|
|
|
Node.needsParens = function needsParens(node, parent) {
|
|
if (!parent) return false;
|
|
|
|
if (t.isNewExpression(parent) && parent.callee === node) {
|
|
if (t.isCallExpression(node)) return true;
|
|
|
|
var hasCall = _lodashCollectionSome2["default"](node, function (val) {
|
|
return t.isCallExpression(val);
|
|
});
|
|
if (hasCall) return true;
|
|
}
|
|
|
|
return find(parens, node, parent);
|
|
};
|
|
|
|
/**
|
|
* [Please add a description.]
|
|
*/
|
|
|
|
Node.needsParensNoLineTerminator = function needsParensNoLineTerminator(node, parent) {
|
|
if (!parent) return false;
|
|
|
|
// no comments
|
|
if (!node.leadingComments || !node.leadingComments.length) {
|
|
return false;
|
|
}
|
|
|
|
return t.isTerminatorless(parent);
|
|
};
|
|
|
|
return Node;
|
|
})();
|
|
|
|
exports["default"] = Node;
|
|
|
|
/**
|
|
* Add all static methods from `Node` to `Node.prototype`.
|
|
*/
|
|
|
|
_lodashCollectionEach2["default"](Node, function (fn, key) {
|
|
Node.prototype[key] = function () {
|
|
// Avoid leaking arguments to prevent deoptimization
|
|
var args = new Array(arguments.length + 2);
|
|
|
|
args[0] = this.node;
|
|
args[1] = this.parent;
|
|
|
|
for (var i = 0; i < args.length; i++) {
|
|
args[i + 2] = arguments[i];
|
|
}
|
|
|
|
return Node[key].apply(null, args);
|
|
};
|
|
});
|
|
module.exports = exports["default"]; |