forked from babel/babel
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Inludes support for optimizing single-parameter arrow functions
- Loading branch information
1 parent
f34dc8a
commit bbb8a14
Showing
24 changed files
with
293 additions
and
1 deletion.
There are no files selected for viewing
55 changes: 55 additions & 0 deletions
55
packages/babel-plugin-proposal-pipeline-operator/src/fsharpVisitor.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,55 @@ | ||
import { types as t } from "@babel/core"; | ||
|
||
const fsharpVisitor = { | ||
BinaryExpression(path) { | ||
const { scope } = path; | ||
const { node } = path; | ||
const { operator, left } = node; | ||
let { right } = node; | ||
if (operator !== "|>") return; | ||
|
||
let optimizeArrow = | ||
t.isArrowFunctionExpression(right) && | ||
t.isExpression(right.body) && | ||
!right.async && | ||
!right.generator; | ||
let param; | ||
|
||
if (optimizeArrow) { | ||
const { params } = right; | ||
if (params.length === 1 && t.isIdentifier(params[0])) { | ||
param = params[0]; | ||
} else if (params.length > 0) { | ||
optimizeArrow = false; | ||
} | ||
} else if (t.isIdentifier(right, { name: "eval" })) { | ||
right = t.sequenceExpression([t.numericLiteral(0), right]); | ||
} | ||
|
||
if (optimizeArrow && !param) { | ||
// Arrow function with 0 arguments | ||
path.replaceWith(t.sequenceExpression([left, right.body])); | ||
return; | ||
} | ||
|
||
const placeholder = scope.generateUidIdentifierBasedOnNode(param || left); | ||
scope.push({ id: placeholder }); | ||
if (param) { | ||
path.get("right").scope.rename(param.name, placeholder.name); | ||
} | ||
|
||
const applied = | ||
right.type === "AwaitExpression" | ||
? t.awaitExpression(t.cloneNode(placeholder)) | ||
: t.callExpression(right, [t.cloneNode(placeholder)]); | ||
const call = optimizeArrow ? right.body : applied; | ||
path.replaceWith( | ||
t.sequenceExpression([ | ||
t.assignmentExpression("=", t.cloneNode(placeholder), left), | ||
call, | ||
]), | ||
); | ||
}, | ||
}; | ||
|
||
export default fsharpVisitor; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
34 changes: 34 additions & 0 deletions
34
...-plugin-proposal-pipeline-operator/test/fixtures/fsharp/arrow-functions-parenless/exec.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
const y = 2; | ||
|
||
const f = (x) => (x | ||
|> (y) => y + 1) | ||
|> (z) => z * y | ||
|
||
const _f = (x) => x | ||
|> (y) => y + 1 | ||
|> (z) => z * y | ||
|
||
const g = (x) => x | ||
|> (y) => ( | ||
y + 1 | ||
|> (z) => z * y | ||
) | ||
|
||
const _g = (x) => x | ||
|> (y => ( | ||
y + 1 | ||
|> (z) => z * y) | ||
) | ||
|
||
const __g = (x) => x | ||
|> (y => { return ( | ||
y + 1 | ||
|> (z) => z * y); | ||
} | ||
) | ||
|
||
expect( f(1)).toBe(4); | ||
expect( _f(1)).toBe(4); | ||
expect( g(1)).toBe(2); | ||
expect( _g(1)).toBe(2); | ||
expect(__g(1)).toBe(2); |
14 changes: 14 additions & 0 deletions
14
...ages/babel-plugin-proposal-pipeline-operator/test/fixtures/fsharp/arrow-functions/exec.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
var result = [5,10] | ||
|> (_ => _.map(x => x * 2)) | ||
|> (_ => _.reduce( (a,b) => a + b )) | ||
|> (sum => sum + 1) | ||
|
||
expect(result).toBe(31); | ||
|
||
|
||
var inc = (x) => x + 1; | ||
var double = (x) => x * 2; | ||
|
||
var result2 = [4, 9].map( x => x |> inc |> double ) | ||
|
||
expect(result2).toEqual([10, 20]); |
14 changes: 14 additions & 0 deletions
14
...ges/babel-plugin-proposal-pipeline-operator/test/fixtures/fsharp/arrow-functions/input.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
var result = [5,10] | ||
|> (_ => _.map(x => x * 2)) | ||
|> (_ => _.reduce( (a,b) => a + b )) | ||
|> (sum => sum + 1) | ||
|
||
expect(result).toBe(31); | ||
|
||
|
||
var inc = (x) => x + 1; | ||
var double = (x) => x * 2; | ||
|
||
var result2 = [4, 9].map( x => x |> inc |> double ) | ||
|
||
expect(result2).toEqual([10, 20]); |
15 changes: 15 additions & 0 deletions
15
...es/babel-plugin-proposal-pipeline-operator/test/fixtures/fsharp/arrow-functions/output.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
var _sum, _ref, _ref2; | ||
|
||
var result = (_sum = (_ref = (_ref2 = [5, 10], _ref2.map(x => x * 2)), _ref.reduce((a, b) => a + b)), _sum + 1); | ||
expect(result).toBe(31); | ||
|
||
var inc = x => x + 1; | ||
|
||
var double = x => x * 2; | ||
|
||
var result2 = [4, 9].map(x => { | ||
var _ref3, _x; | ||
|
||
return _ref3 = (_x = x, inc(_x)), double(_ref3); | ||
}); | ||
expect(result2).toEqual([10, 20]); |
13 changes: 13 additions & 0 deletions
13
packages/babel-plugin-proposal-pipeline-operator/test/fixtures/fsharp/await/exec.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
const triple = (x) => x * 3; | ||
|
||
async function myFunction(n) { | ||
return n | ||
|> Math.abs | ||
|> Promise.resolve | ||
|> await | ||
|> triple; | ||
} | ||
|
||
return myFunction(-7).then(result => { | ||
expect(result).toBe(21); | ||
}); |
6 changes: 6 additions & 0 deletions
6
packages/babel-plugin-proposal-pipeline-operator/test/fixtures/fsharp/await/input.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
async function myFunction(n) { | ||
return n | ||
|> Math.abs | ||
|> Promise.resolve | ||
|> await; | ||
} |
9 changes: 9 additions & 0 deletions
9
packages/babel-plugin-proposal-pipeline-operator/test/fixtures/fsharp/await/options.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
{ | ||
"plugins": [ | ||
["proposal-pipeline-operator", { "proposal": "fsharp" }] | ||
], | ||
"parserOpts": { | ||
"allowReturnOutsideFunction": true | ||
}, | ||
"minNodeVersion": "8.0.0" | ||
} |
5 changes: 5 additions & 0 deletions
5
packages/babel-plugin-proposal-pipeline-operator/test/fixtures/fsharp/await/output.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
async function myFunction(n) { | ||
var _ref, _ref2, _n; | ||
|
||
return _ref = (_ref2 = (_n = n, Math.abs(_n)), Promise.resolve(_ref2)), await _ref; | ||
} |
3 changes: 3 additions & 0 deletions
3
packages/babel-plugin-proposal-pipeline-operator/test/fixtures/fsharp/basic/exec.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
var inc = (x) => x + 1 | ||
|
||
expect(10 |> inc).toBe(11); |
3 changes: 3 additions & 0 deletions
3
packages/babel-plugin-proposal-pipeline-operator/test/fixtures/fsharp/basic/input.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
var inc = (x) => x + 1 | ||
|
||
expect(10 |> inc).toBe(11); |
5 changes: 5 additions & 0 deletions
5
packages/babel-plugin-proposal-pipeline-operator/test/fixtures/fsharp/basic/output.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
var _; | ||
|
||
var inc = x => x + 1; | ||
|
||
expect((_ = 10, inc(_))).toBe(11); |
7 changes: 7 additions & 0 deletions
7
packages/babel-plugin-proposal-pipeline-operator/test/fixtures/fsharp/indirect-eval/exec.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
(function() { | ||
'use strict'; | ||
var result = '(function() { return this; })()' | ||
|> eval; | ||
|
||
expect(result).not.toBeUndefined(); | ||
})(); |
7 changes: 7 additions & 0 deletions
7
packages/babel-plugin-proposal-pipeline-operator/test/fixtures/fsharp/indirect-eval/input.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
(function() { | ||
'use strict'; | ||
var result = '(function() { return this; })()' | ||
|> eval; | ||
|
||
expect(result).not.toBeUndefined(); | ||
})(); |
8 changes: 8 additions & 0 deletions
8
...ages/babel-plugin-proposal-pipeline-operator/test/fixtures/fsharp/indirect-eval/output.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
(function () { | ||
'use strict'; | ||
|
||
var _functionReturn; | ||
|
||
var result = (_functionReturn = '(function() { return this; })()', (0, eval)(_functionReturn)); | ||
expect(result).not.toBeUndefined(); | ||
})(); |
8 changes: 8 additions & 0 deletions
8
...bel-plugin-proposal-pipeline-operator/test/fixtures/fsharp/optimize-0-param-arrow/exec.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
var a = 1, | ||
b = 2, | ||
c = 3; | ||
var result = a | ||
|> (() => b) | ||
|> (() => c); | ||
|
||
expect(result).toBe(c); |
8 changes: 8 additions & 0 deletions
8
...el-plugin-proposal-pipeline-operator/test/fixtures/fsharp/optimize-0-param-arrow/input.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
var a = 1, | ||
b = 2, | ||
c = 3; | ||
var result = a | ||
|> (() => b) | ||
|> (() => c); | ||
|
||
expect(result).toBe(c); |
5 changes: 5 additions & 0 deletions
5
...l-plugin-proposal-pipeline-operator/test/fixtures/fsharp/optimize-0-param-arrow/output.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
var a = 1, | ||
b = 2, | ||
c = 3; | ||
var result = ((a, b), c); | ||
expect(result).toBe(c); |
8 changes: 8 additions & 0 deletions
8
packages/babel-plugin-proposal-pipeline-operator/test/fixtures/fsharp/options.json
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
{ | ||
"plugins": [ | ||
["proposal-pipeline-operator", { "proposal": "fsharp" }] | ||
], | ||
"parserOpts": { | ||
"allowReturnOutsideFunction": true | ||
} | ||
} |
20 changes: 20 additions & 0 deletions
20
...plugin-proposal-pipeline-operator/test/fixtures/minimal/arrow-functions-parenless/exec.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
const y = 2; | ||
const f = (x) => x | ||
|> (y => y + 1) | ||
|> (z => z * y) | ||
|
||
const g = (x) => x | ||
|> (y => | ||
y + 1 | ||
|> (z => z * y) | ||
) | ||
|
||
const h = (x) => x | ||
|> (y => ( | ||
y + 1 | ||
|> (z => z * y) | ||
)) | ||
|
||
expect(f(1)).toBe(4); | ||
expect(g(1)).toBe(2); | ||
expect(h(1)).toBe(2); |
20 changes: 20 additions & 0 deletions
20
...lugin-proposal-pipeline-operator/test/fixtures/minimal/arrow-functions-parenless/input.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
const y = 2; | ||
const f = (x) => x | ||
|> (y => y + 1) | ||
|> (z => z * y) | ||
|
||
const g = (x) => x | ||
|> (y => | ||
y + 1 | ||
|> (z => z * y) | ||
) | ||
|
||
const h = (x) => x | ||
|> (y => ( | ||
y + 1 | ||
|> (z => z * y) | ||
)) | ||
|
||
expect(f(1)).toBe(4); | ||
expect(g(1)).toBe(2); | ||
expect(h(1)).toBe(2); |
23 changes: 23 additions & 0 deletions
23
...ugin-proposal-pipeline-operator/test/fixtures/minimal/arrow-functions-parenless/output.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
const y = 2; | ||
|
||
const f = x => { | ||
var _z, _y; | ||
|
||
return _z = (_y = x, _y + 1), _z * y; | ||
}; | ||
|
||
const g = x => { | ||
var _y2, _z2; | ||
|
||
return _y2 = x, (_z2 = _y2 + 1, _z2 * _y2); | ||
}; | ||
|
||
const h = x => { | ||
var _y3, _z3; | ||
|
||
return _y3 = x, (_z3 = _y3 + 1, _z3 * _y3); | ||
}; | ||
|
||
expect(f(1)).toBe(4); | ||
expect(g(1)).toBe(2); | ||
expect(h(1)).toBe(2); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters