Skip to content

Commit d7de9ea

Browse files
committed
Inline non-lodash stdlib functions, add all bitwise operators to stdlib
1 parent 7bb2d19 commit d7de9ea

8 files changed

Lines changed: 158 additions & 32 deletions

File tree

src/index.js

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -574,9 +574,43 @@ export default function (babel) {
574574
}
575575
}
576576

577+
function makeInlineStdlibFn(inlineFnName) {
578+
const fnId = t.identifier(inlineFnName);
579+
const aParam = t.identifier("a");
580+
const bParam = t.identifier("b");
581+
const op = {
582+
"looseEq": "==",
583+
"looseNotEq": "!=",
584+
"bitwiseNot": "~",
585+
"bitwiseAnd": "&",
586+
"bitwiseOr": "|",
587+
"bitwiseXor": "^",
588+
"bitwiseLeftShift": "<<",
589+
"bitwiseRightShift": ">>",
590+
"bitwiseZeroFillRightShift": ">>>",
591+
}[inlineFnName];
592+
593+
// bitwiseNot is the only unary fn; rest are binary.
594+
if (inlineFnName === "bitwiseNot") {
595+
return t.functionDeclaration(fnId, [aParam], t.blockStatement([
596+
t.returnStatement(t.unaryExpression(op, aParam)),
597+
]));
598+
}
599+
600+
return t.functionDeclaration(fnId, [aParam, bParam], t.blockStatement([
601+
t.returnStatement(t.binaryExpression(op, aParam, bParam)),
602+
]));
603+
}
604+
577605
function insertStdlibImports(path, imports: Imports, useRequire) {
578606
const declarations = [];
607+
const inlines = [];
579608
for (const importPath in imports) {
609+
if (importPath === "inline") {
610+
inlines.push(...imports[importPath]);
611+
continue;
612+
}
613+
580614
const specifierNames = imports[importPath];
581615
const specifiers = [];
582616

@@ -605,6 +639,20 @@ export default function (babel) {
605639
}
606640
}
607641
path.unshiftContainer("body", declarations);
642+
643+
if (inlines.length) {
644+
const inlineDeclarations = [];
645+
for (const inlineFnName of inlines) {
646+
inlineDeclarations.push(makeInlineStdlibFn(inlineFnName));
647+
}
648+
// insert inline fns before the first statement which isn't an import statement
649+
for (const p of path.get("body")) {
650+
if (!p.isImportDeclaration()) {
651+
p.insertBefore(inlineDeclarations);
652+
break;
653+
}
654+
}
655+
}
608656
}
609657

610658
function generateForInIterator (path, type: "array" | "object") {

src/stdlib.js

Lines changed: 11 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11

2-
export function looseEq(a, b) {
3-
return a == b;
4-
}
5-
6-
export function looseNotEq(a, b) {
7-
return a != b;
8-
}
9-
10-
export function bitwiseNot(a) {
11-
return ~a;
12-
}
2+
export const lightscriptImports = {
3+
"looseEq": "inline",
4+
"looseNotEq": "inline",
5+
"bitwiseNot": "inline",
6+
"bitwiseAnd": "inline",
7+
"bitwiseOr": "inline",
8+
"bitwiseXor": "inline",
9+
"bitwiseLeftShift": "inline",
10+
"bitwiseRightShift": "inline",
11+
"bitwiseZeroFillRightShift": "inline",
12+
};
1313

1414
export const everyLodashMethod = [
1515
"add",
@@ -320,12 +320,6 @@ export const everyLodashMethod = [
320320
"zipWith",
321321
];
322322

323-
export const lightscriptImports = {
324-
"looseEq": "babel-plugin-lightscript/stdlib",
325-
"looseNotEq": "babel-plugin-lightscript/stdlib",
326-
"bitwiseNot": "babel-plugin-lightscript/stdlib",
327-
};
328-
329323
export const lodashImports = everyLodashMethod.reduce((obj, methodName) => {
330324
obj[methodName] = "lodash";
331325
return obj;
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
bitwiseNot(1)
2+
bitwiseAnd(0, 1)
3+
bitwiseOr(0, 1)
4+
bitwiseXor(0, 1)
5+
bitwiseLeftShift(0, 1)
6+
bitwiseRightShift(0, 1)
7+
bitwiseZeroFillRightShift(0, 1)
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
assert.equal(bitwiseNot(1), -2)
2+
3+
assert.equal(bitwiseAnd(0, 0), 0)
4+
assert.equal(bitwiseAnd(0, 1), 0)
5+
assert.equal(bitwiseAnd(1, 1), 1)
6+
assert.equal(bitwiseAnd(1, 2), 0)
7+
assert.equal(bitwiseAnd(2, 2), 2)
8+
9+
assert.equal(bitwiseOr(0, 0), 0)
10+
assert.equal(bitwiseOr(0, 1), 1)
11+
assert.equal(bitwiseOr(1, 1), 1)
12+
assert.equal(bitwiseOr(1, 2), 3)
13+
assert.equal(bitwiseOr(2, 2), 2)
14+
15+
assert.equal(bitwiseXor(0, 0), 0)
16+
assert.equal(bitwiseXor(0, 1), 1)
17+
assert.equal(bitwiseXor(1, 1), 0)
18+
assert.equal(bitwiseXor(1, 2), 3)
19+
assert.equal(bitwiseXor(2, 2), 0)
20+
21+
assert.equal(bitwiseLeftShift(0, 0), 0)
22+
assert.equal(bitwiseLeftShift(0, 1), 0)
23+
assert.equal(bitwiseLeftShift(1, 1), 2)
24+
assert.equal(bitwiseLeftShift(1, 2), 4)
25+
assert.equal(bitwiseLeftShift(2, 2), 8)
26+
27+
assert.equal(bitwiseRightShift(0, 0), 0)
28+
assert.equal(bitwiseRightShift(0, 1), 0)
29+
assert.equal(bitwiseRightShift(1, 1), 0)
30+
assert.equal(bitwiseRightShift(1, 2), 0)
31+
assert.equal(bitwiseRightShift(2, 1), 1)
32+
assert.equal(bitwiseRightShift(2, 0), 2)
33+
assert.equal(bitwiseRightShift(-1, 2), -1)
34+
35+
assert.equal(bitwiseZeroFillRightShift(0, 0), 0)
36+
assert.equal(bitwiseZeroFillRightShift(0, 1), 0)
37+
assert.equal(bitwiseZeroFillRightShift(1, 1), 0)
38+
assert.equal(bitwiseZeroFillRightShift(1, 2), 0)
39+
assert.equal(bitwiseZeroFillRightShift(2, 1), 1)
40+
assert.equal(bitwiseZeroFillRightShift(2, 0), 2)
41+
assert.equal(bitwiseZeroFillRightShift(-1, 2), 1073741823)
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
function bitwiseNot(a) {
2+
return ~a;
3+
}
4+
5+
function bitwiseAnd(a, b) {
6+
return a & b;
7+
}
8+
9+
function bitwiseOr(a, b) {
10+
return a | b;
11+
}
12+
13+
function bitwiseXor(a, b) {
14+
return a ^ b;
15+
}
16+
17+
function bitwiseLeftShift(a, b) {
18+
return a << b;
19+
}
20+
21+
function bitwiseRightShift(a, b) {
22+
return a >> b;
23+
}
24+
25+
function bitwiseZeroFillRightShift(a, b) {
26+
return a >>> b;
27+
}
28+
29+
bitwiseNot(1);
30+
bitwiseAnd(0, 1);
31+
bitwiseOr(0, 1);
32+
bitwiseXor(0, 1);
33+
bitwiseLeftShift(0, 1);
34+
bitwiseRightShift(0, 1);
35+
bitwiseZeroFillRightShift(0, 1);

test/fixtures/stdlib/kitchen-sink/expected.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,13 @@
1-
import { looseEq, looseNotEq } from 'babel-plugin-lightscript/stdlib';
21
import { map, round } from 'lodash';
2+
3+
function looseEq(a, b) {
4+
return a == b;
5+
}
6+
7+
function looseNotEq(a, b) {
8+
return a != b;
9+
}
10+
311
looseEq(1, '1');
412
looseNotEq(1, '1');
513
foo(1, '1');

test/fixtures/stdlib/kitchen-sink/options.json

Lines changed: 0 additions & 10 deletions
This file was deleted.

test/fixtures/stdlib/require-true/expected.js

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
const {
2-
looseEq,
3-
looseNotEq
4-
} = require('babel-plugin-lightscript/stdlib');
1+
function looseEq(a, b) {
2+
return a == b;
3+
}
4+
5+
function looseNotEq(a, b) {
6+
return a != b;
7+
}
58

69
const {
710
map,

0 commit comments

Comments
 (0)