@effectful/transducers-loose
Version:
@effectful/transducers built with faster generators
372 lines (370 loc) • 11.8 kB
JavaScript
"use strict";
exports.__esModule = true;
exports.default = void 0;
var _core = require("../core");
var Kit = require("../kit");
var T = require("@babel/types");
var M = require("@effectful/es-rt/opts/loose");
function collectFuncDecls(s) {
var sa,
sl,
walk = function walk() {
var i;
var loop = M.iterator(sl.sub());
for (; !(loop = loop.step()).done;) {
i = loop.value;
if (i.enter) {
switch (i.type) {
case _core.Tag.FunctionDefinition:
case _core.Tag.FunctionExpression:
case _core.Tag.ArrowFunctionExpression:
}
}
}
};
sa = Kit.toArray(s);
sl = Kit.auto(sa);
walk(new Set());
return sa;
}
function markKeyIds(s) {
var sl,
walk = function walk1(sw) {
var i,
j,
k,
_walk = M.generator(),
loop,
r,
p;
_walk.step = walk_1;
_walk.$step = 3;
return _walk;
function walk_1(p) {
var a, b;
for (;;) {
switch (_walk.$cur = _walk.$step) {
case 3:
loop = M.iterator(sw);
_walk.$step = 4;
_walk.$step = 4;
continue;
case 4:
if (!(loop = loop.step()).done) {
i = loop.value;
_walk.$step = 5;
_walk.value = i;
return _walk;
} else {
_walk.$step = 0;
_walk.value = void 0;
_walk.done = true;
return _walk;
}
case 5:
if (i.enter) {
switch (i.type) {
case _core.Tag.FunctionDeclaration:
case _core.Tag.FunctionExpression:
j = sl.cur();
if (j.pos === _core.Tag.id) {
j.value.key = true;
a = sl.one();
_walk.$step = 4;
return _walk.$delegate(a);
} else {
_walk.$step = 4;
_walk.$step = 4;
continue;
}
case _core.Tag.MemberExpression:
b = walk(sl.one());
_walk.$step = 6;
return _walk.$delegate(b);
default:
_walk.$step = 4;
_walk.$step = 4;
continue;
}
} else {
_walk.$step = 4;
_walk.$step = 4;
continue;
}
case 6:
k = sl.cur();
if (k.type === _core.Tag.Identifier) {
k.value.key = true;
a = sl.one();
_walk.$step = 4;
return _walk.$delegate(a);
} else {
_walk.$step = 4;
_walk.$step = 4;
continue;
}
case 0:
_walk.$step = 0;
_walk.value = p;
_walk.done = true;
return _walk;
case 1:
_walk.$step = 0;
throw p;
case 2:
return _walk.$redir(p);
default:
throw new Error("invalid state");
}
}
}
};
sl = Kit.auto(s);
return walk(sl);
}
/**
* joins not computed MemberExpressions into a single variable
* if its object is const and not used anywhere else
*/
var _default = exports.default = Kit.pipe(markKeyIds, collectFuncDecls, function joinMemExprCollect(s) {
var sa,
sl,
disregard,
walk = function _walk(dir) {
var i, vars, j, k, pack, info, n, _j, _info, c, o, info1, p;
var loop = M.iterator(sl.sub());
for (; !(loop = loop.step()).done;) {
i = loop.value;
if (i.enter) {
switch (i.type) {
case _core.Tag.FunctionDefinition:
case _core.Tag.FunctionExpression:
case _core.Tag.ArrowFunctionExpression:
//TODO:
break;
case _core.Tag.ImportNamespaceSpecifier:
//TODO:
break;
case _core.Tag.VariableDeclaration:
if (i.pos === _core.Tag.push) {
vars = i.value.vars = [];
var _loop = M.iterator(sl.sub());
for (; !(_loop = _loop.step()).done;) {
j = _loop.value;
if (j.enter && j.type === _core.Tag.VariableDeclarator) {
var loop1 = M.iterator(sl.one());
for (; !(loop1 = loop1.step()).done;) {
k = loop1.value;
if (k.enter && k.type === _core.Tag.Identifier) {
switch (i.value.node.kind) {
case "const":
pack = Kit.hasAnnot(i.value.node, "@PACK") || Kit.hasAnnot(j.value.node, "@PACK");
info = {
name: k.value.node.name,
used: new Set(),
enabled: true,
pack
};
vars.push(info);
dir.set(k.value.node.name, info);
break;
case "let":
dir.delete(k.value.node.name);
break;
}
}
}
n = sl.cur();
if (n.type === _core.Tag.AssignmentExpression && n.pos === _core.Tag.init) {
var loop2 = M.iterator(vars);
for (; !(loop2 = loop2.step()).done;) {
_j = loop2.value;
_j.enabled = false;
}
}
walk(dir);
}
}
}
break;
case _core.Tag.Identifier:
if (!i.value.key) {
_info = dir.get(i.value.node.name);
if (_info != null && !_info.pack) {
_info.enabled = false;
}
}
break;
case _core.Tag.CallExpression:
case _core.Tag.AssignmentExpression:
c = sl.cur();
if (c.type === _core.Tag.MemberExpression) {
c.value.discharge = true;
}
break;
case _core.Tag.MemberExpression:
o = sl.cur();
if (o.type === _core.Tag.Identifier && !i.value.node.computed && !disregard[o.value.node.name]) {
info1 = dir.get(o.value.node.name);
if (info1 != null) {
if (i.value.discharge && !info1.pack) {
info1.enabled = false;
break;
}
Kit.skip(sl.one());
p = sl.cur();
if (p.type !== _core.Tag.Identifier && !info1.pack) {
info1.enabled = false;
break;
}
Kit.skip(sl.one());
i.value.path = [o.value.node.name, p.value.node.name];
i.value.varInfo = info1;
info1.used.add(p.value.node.name);
}
}
break;
case _core.Tag.BlockStatement:
walk(new Map(dir));
}
}
}
};
sa = Kit.toArray(s);
sl = Kit.auto(sa);
disregard = sl.opts.disregard || {};
walk(new Map());
return sa;
}, function joinMemExprReplace(s) {
var sl,
walk = function walk1() {
var i,
j,
k,
_walk = M.generator(),
loop,
_loop,
loop1,
r,
p;
_walk.step = walk_1;
_walk.$step = 3;
return _walk;
function walk_1(p) {
var a, b;
for (;;) {
switch (_walk.$cur = _walk.$step) {
case 3:
loop = M.iterator(sl.sub());
_walk.$step = 4;
_walk.$step = 4;
continue;
case 4:
if (!(loop = loop.step()).done) {
i = loop.value;
if (i.enter) {
switch (i.type) {
case _core.Tag.MemberExpression:
if (i.value.varInfo != null && i.value.varInfo.enabled) {
Kit.skip(sl.copy(i));
a = sl.tok(i.pos, T.identifier(i.value.path.join("$")));
_walk.$step = 4;
_walk.value = a;
return _walk;
} else {
_walk.$step = 10;
_walk.$step = 10;
continue;
}
case _core.Tag.VariableDeclaration:
if (i.value.vars != null) {
b = sl.peel(i);
_walk.$step = 5;
_walk.value = b;
return _walk;
} else {
_walk.$step = 10;
_walk.$step = 10;
continue;
}
default:
_walk.$step = 10;
_walk.$step = 10;
continue;
}
} else {
_walk.$step = 10;
_walk.$step = 10;
continue;
}
} else {
_walk.$step = 0;
_walk.value = void 0;
_walk.done = true;
return _walk;
}
case 5:
a = walk();
_walk.$step = 6;
return _walk.$delegate(a);
case 6:
a = sl.leave();
_walk.$step = 7;
return _walk.$delegate(a);
case 7:
_loop = M.iterator(i.value.vars);
_walk.$step = 8;
_walk.$step = 8;
continue;
case 8:
if (!(_loop = _loop.step()).done) {
j = _loop.value;
if (j.enabled) {
loop1 = M.iterator(j.used);
_walk.$step = 9;
_walk.$step = 9;
continue;
} else {
_walk.$step = 8;
_walk.$step = 8;
continue;
}
} else {
_walk.$step = 4;
_walk.$step = 4;
continue;
}
case 9:
if (!(loop1 = loop1.step()).done) {
k = loop1.value;
a = sl.toks(_core.Tag.push, `let ${j.name}$${k} = ${j.name} && ${j.name}.${k}`);
_walk.$step = 9;
return _walk.$delegate(a);
} else {
_walk.$step = 8;
_walk.$step = 8;
continue;
}
case 10:
_walk.$step = 4;
_walk.value = i;
return _walk;
case 0:
_walk.$step = 0;
_walk.value = p;
_walk.done = true;
return _walk;
case 1:
_walk.$step = 0;
throw p;
case 2:
return _walk.$redir(p);
default:
throw new Error("invalid state");
}
}
}
};
sl = Kit.auto(s);
return walk();
});