Optimize 0 param arrow

This commit is contained in:
Justin Ridgewell 2017-09-29 03:43:45 -04:00 committed by Justin Ridgewell
parent 60335ce1ad
commit 4b440110a1
7 changed files with 70 additions and 16 deletions

View File

@ -6,28 +6,34 @@ export default function({ types: t }) {
visitor: {
BinaryExpression(path) {
const { scope, parentPath } = path;
const { node } = path;
const { operator, left, right } = node;
const { scope } = path;
const { operator, left, right } = path.node;
if (operator !== "|>") return;
// Why do I have to fix this here?!
if (parentPath.isArrowFunctionExpression({ body: node })) {
path.replaceWith(t.blockStatement([t.returnStatement(node)]));
let optimizeArrow =
t.isArrowFunctionExpression(right) && t.isExpression(right.body);
let param;
if (optimizeArrow) {
const { params } = right;
if (params.length === 1) {
param = params[0];
} else if (params.length > 1) {
optimizeArrow = false;
}
}
if (optimizeArrow && !param) {
// Arrow function with 0 arguments
path.replaceWith(t.sequenceExpression([left, right.body]));
return;
}
const optimizeArrow =
t.isArrowFunctionExpression(right) &&
right.params.length === 1 &&
t.isIdentifier(right.params[0]) &&
t.isExpression(right.body);
const param = optimizeArrow ? right.params[0] : left;
const placeholder = scope.generateUidIdentifierBasedOnNode(param);
const placeholder = scope.generateUidIdentifierBasedOnNode(
param || left,
);
scope.push({ id: placeholder });
if (optimizeArrow) {
if (param) {
path.get("right").scope.rename(param.name, placeholder.name);
}

View File

@ -0,0 +1,8 @@
var a = 1,
b = 2,
c = 3;
var result = a
|> (a, b) => b
|> (a, b) => c;
assert.equal(result, c)

View File

@ -0,0 +1,8 @@
var a = 1,
b = 2,
c = 3;
var result = a
|> (a, b) => b
|> (a, b) => c;
assert.equal(result, c)

View File

@ -0,0 +1,11 @@
var _a;
var a = 1,
b = 2,
c = 3;
var result = (_a = a, ((a, b) => {
var _b;
return _b = b, ((a, b) => c)(_b);
})(_a));
assert.equal(result, c);

View File

@ -0,0 +1,8 @@
var a = 1,
b = 2,
c = 3;
var result = a
|> () => b
|> () => c;
assert.equal(result, c)

View File

@ -0,0 +1,8 @@
var a = 1,
b = 2,
c = 3;
var result = a
|> () => b
|> () => c;
assert.equal(result, c)

View File

@ -0,0 +1,5 @@
var a = 1,
b = 2,
c = 3;
var result = (a, (b, c));
assert.equal(result, c);