UNPKG

@effectful/transducers-loose

Version:

@effectful/transducers built with faster generators

372 lines (370 loc) 11.8 kB
"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(); });