wisp
Version:
Homoiconic JS with clojure syntax, s-expressions & macros
133 lines (132 loc) • 15.2 kB
JavaScript
{
var _ns_ = {
id: 'wisp.backend.escodegen.generator',
doc: void 0
};
var wisp_reader = require('./../../reader');
var readString = wisp_reader.readFromString;
var read_ = wisp_reader.read_;
var wisp_ast = require('./../../ast');
var meta = wisp_ast.meta;
var withMeta = wisp_ast.withMeta;
var isSymbol = wisp_ast.isSymbol;
var symbol = wisp_ast.symbol;
var isKeyword = wisp_ast.isKeyword;
var keyword = wisp_ast.keyword;
var namespace = wisp_ast.namespace;
var isUnquote = wisp_ast.isUnquote;
var isUnquoteSplicing = wisp_ast.isUnquoteSplicing;
var isQuote = wisp_ast.isQuote;
var isSyntaxQuote = wisp_ast.isSyntaxQuote;
var name = wisp_ast.name;
var gensym = wisp_ast.gensym;
var prStr = wisp_ast.prStr;
var wisp_sequence = require('./../../sequence');
var isEmpty = wisp_sequence.isEmpty;
var count = wisp_sequence.count;
var isList = wisp_sequence.isList;
var list = wisp_sequence.list;
var first = wisp_sequence.first;
var second = wisp_sequence.second;
var third = wisp_sequence.third;
var rest = wisp_sequence.rest;
var cons = wisp_sequence.cons;
var conj = wisp_sequence.conj;
var butlast = wisp_sequence.butlast;
var reverse = wisp_sequence.reverse;
var reduce = wisp_sequence.reduce;
var vec = wisp_sequence.vec;
var last = wisp_sequence.last;
var map = wisp_sequence.map;
var filter = wisp_sequence.filter;
var take = wisp_sequence.take;
var concat = wisp_sequence.concat;
var partition = wisp_sequence.partition;
var repeat = wisp_sequence.repeat;
var interleave = wisp_sequence.interleave;
var wisp_runtime = require('./../../runtime');
var isOdd = wisp_runtime.isOdd;
var isDictionary = wisp_runtime.isDictionary;
var dictionary = wisp_runtime.dictionary;
var merge = wisp_runtime.merge;
var keys = wisp_runtime.keys;
var vals = wisp_runtime.vals;
var isContainsVector = wisp_runtime.isContainsVector;
var mapDictionary = wisp_runtime.mapDictionary;
var isString = wisp_runtime.isString;
var isNumber = wisp_runtime.isNumber;
var isVector = wisp_runtime.isVector;
var isBoolean = wisp_runtime.isBoolean;
var subs = wisp_runtime.subs;
var reFind = wisp_runtime.reFind;
var isTrue = wisp_runtime.isTrue;
var isFalse = wisp_runtime.isFalse;
var isNil = wisp_runtime.isNil;
var isRePattern = wisp_runtime.isRePattern;
var inc = wisp_runtime.inc;
var dec = wisp_runtime.dec;
var str = wisp_runtime.str;
var char = wisp_runtime.char;
var int = wisp_runtime.int;
var isEqual = wisp_runtime.isEqual;
var isStrictEqual = wisp_runtime.isStrictEqual;
var wisp_string = require('./../../string');
var split = wisp_string.split;
var join = wisp_string.join;
var upperCase = wisp_string.upperCase;
var replace = wisp_string.replace;
var wisp_expander = require('./../../expander');
var installMacro = wisp_expander.installMacro;
var wisp_analyzer = require('./../../analyzer');
var emptyEnv = wisp_analyzer.emptyEnv;
var analyze = wisp_analyzer.analyze;
var analyze_ = wisp_analyzer.analyze_;
var wisp_backend_escodegen_writer = require('./writer');
var write = wisp_backend_escodegen_writer.write;
var compile = wisp_backend_escodegen_writer.compile;
var write_ = wisp_backend_escodegen_writer.write_;
var escodegen = require('escodegen');
var generate_ = escodegen.generate;
var base64Encode = require('base64-encode');
var btoa = base64Encode;
var fs = require('fs');
var readFileSync = fs.readFileSync;
var writeFileSync = fs.writeFileSync;
var path = require('path');
var basename = path.basename;
var dirname = path.dirname;
var joinPath = path.join;
}
var generate = exports.generate = function generate(options) {
var nodes = Array.prototype.slice.call(arguments, 1);
return function () {
var astø1 = write_.apply(void 0, nodes);
var outputø1 = generate_(astø1, {
'file': (options || 0)['output-uri'],
'sourceContent': (options || 0)['source'],
'sourceMap': (options || 0)['source-uri'],
'sourceMapRoot': (options || 0)['source-root'],
'sourceMapWithCode': true
});
(outputø1 || 0)['map'].setSourceContent((options || 0)['source-uri'], (options || 0)['source']);
return {
'code': (options || 0)['no-map'] ? (outputø1 || 0)['code'] : '' + (outputø1 || 0)['code'] + '\n//# sourceMappingURL=' + 'data:application/json;base64,' + btoa('' + (outputø1 || 0)['map']) + '\n',
'source-map': (outputø1 || 0)['map'],
'js-ast': astø1
};
}.call(this);
};
var expandDefmacro = exports.expandDefmacro = function expandDefmacro(_andForm, id) {
var body = Array.prototype.slice.call(arguments, 2);
return function () {
var fnø1 = withMeta(list.apply(void 0, [symbol(void 0, 'defn')].concat([id], vec(body))), meta(_andForm));
var formø1 = list.apply(void 0, [symbol(void 0, 'do')].concat([fnø1], [id]));
var astø1 = analyze(formø1);
var codeø1 = compile(astø1);
var macroø1 = eval(codeø1);
installMacro(id, macroø1);
return void 0;
}.call(this);
};
installMacro(symbol(void 0, 'defmacro'), withMeta(expandDefmacro, { 'implicit': ['&form'] }));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFub255bW91cy53aXNwIl0sIm5hbWVzIjpbIl9uc18iLCJpZCIsImRvYyIsInJlYWRTdHJpbmciLCJyZWFkRnJvbVN0cmluZyIsInJlYWRfIiwibWV0YSIsIndpdGhNZXRhIiwiaXNTeW1ib2wiLCJzeW1ib2wiLCJpc0tleXdvcmQiLCJrZXl3b3JkIiwibmFtZXNwYWNlIiwiaXNVbnF1b3RlIiwiaXNVbnF1b3RlU3BsaWNpbmciLCJpc1F1b3RlIiwiaXNTeW50YXhRdW90ZSIsIm5hbWUiLCJnZW5zeW0iLCJwclN0ciIsImlzRW1wdHkiLCJjb3VudCIsImlzTGlzdCIsImxpc3QiLCJmaXJzdCIsInNlY29uZCIsInRoaXJkIiwicmVzdCIsImNvbnMiLCJjb25qIiwiYnV0bGFzdCIsInJldmVyc2UiLCJyZWR1Y2UiLCJ2ZWMiLCJsYXN0IiwibWFwIiwiZmlsdGVyIiwidGFrZSIsImNvbmNhdCIsInBhcnRpdGlvbiIsInJlcGVhdCIsImludGVybGVhdmUiLCJpc09kZCIsImlzRGljdGlvbmFyeSIsImRpY3Rpb25hcnkiLCJtZXJnZSIsImtleXMiLCJ2YWxzIiwiaXNDb250YWluc1ZlY3RvciIsIm1hcERpY3Rpb25hcnkiLCJpc1N0cmluZyIsImlzTnVtYmVyIiwiaXNWZWN0b3IiLCJpc0Jvb2xlYW4iLCJzdWJzIiwicmVGaW5kIiwiaXNUcnVlIiwiaXNGYWxzZSIsImlzTmlsIiwiaXNSZVBhdHRlcm4iLCJpbmMiLCJkZWMiLCJzdHIiLCJjaGFyIiwiaW50IiwiaXNFcXVhbCIsImlzU3RyaWN0RXF1YWwiLCJzcGxpdCIsImpvaW4iLCJ1cHBlckNhc2UiLCJyZXBsYWNlIiwiaW5zdGFsbE1hY3JvIiwiZW1wdHlFbnYiLCJhbmFseXplIiwiYW5hbHl6ZV8iLCJ3cml0ZSIsImNvbXBpbGUiLCJ3cml0ZV8iLCJnZW5lcmF0ZV8iLCJnZW5lcmF0ZSIsInJlYWRGaWxlU3luYyIsIndyaXRlRmlsZVN5bmMiLCJiYXNlbmFtZSIsImRpcm5hbWUiLCJqb2luUGF0aCIsImV4cG9ydHMiLCJvcHRpb25zIiwibm9kZXMiLCJhc3TDuDEiLCJvdXRwdXTDuDEiLCJzZXRTb3VyY2VDb250ZW50IiwiYnRvYSIsImV4cGFuZERlZm1hY3JvIiwiX2FuZEZvcm0iLCJib2R5IiwiZm7DuDEiLCJmb3Jtw7gxIiwiY29kZcO4MSIsIm1hY3Jvw7gxIiwiZXZhbCJdLCJtYXBwaW5ncyI6IjtJQUFBLElBQUNBLEksR0FBRDtBQUFBLFlBQUFDLEUsRUFBSSxrQ0FBSjtBQUFBLFlBQUFDLEcsRUFBQSxLLENBQUE7QUFBQSxVOztRQUVtREMsVUFBQSxHLFlBRGxCQyxjO1FBQWlCQyxLQUFBLEcsWUFBQUEsSzs7UUFFcEJDLElBQUEsRyxTQUFBQSxJO1FBQUtDLFFBQUEsRyxTQUFBQSxRO1FBQVVDLFFBQUEsRyxTQUFBQSxRO1FBQVFDLE1BQUEsRyxTQUFBQSxNO1FBQU9DLFNBQUEsRyxTQUFBQSxTO1FBQVNDLE9BQUEsRyxTQUFBQSxPO1FBQ3ZDQyxTQUFBLEcsU0FBQUEsUztRQUFVQyxTQUFBLEcsU0FBQUEsUztRQUFTQyxpQkFBQSxHLFNBQUFBLGlCO1FBQWtCQyxPQUFBLEcsU0FBQUEsTztRQUNyQ0MsYUFBQSxHLFNBQUFBLGE7UUFBY0MsSUFBQSxHLFNBQUFBLEk7UUFBS0MsTUFBQSxHLFNBQUFBLE07UUFBT0MsS0FBQSxHLFNBQUFBLEs7O1FBQ3JCQyxPQUFBLEcsY0FBQUEsTztRQUFPQyxLQUFBLEcsY0FBQUEsSztRQUFNQyxNQUFBLEcsY0FBQUEsTTtRQUFNQyxJQUFBLEcsY0FBQUEsSTtRQUFLQyxLQUFBLEcsY0FBQUEsSztRQUFNQyxNQUFBLEcsY0FBQUEsTTtRQUFPQyxLQUFBLEcsY0FBQUEsSztRQUNyQ0MsSUFBQSxHLGNBQUFBLEk7UUFBS0MsSUFBQSxHLGNBQUFBLEk7UUFBS0MsSUFBQSxHLGNBQUFBLEk7UUFBS0MsT0FBQSxHLGNBQUFBLE87UUFBUUMsT0FBQSxHLGNBQUFBLE87UUFBUUMsTUFBQSxHLGNBQUFBLE07UUFBT0MsR0FBQSxHLGNBQUFBLEc7UUFDdENDLElBQUEsRyxj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LElBQU1JLGNBQUEsR0FBQVAsT0FBQSxDQUFBTyxjQUFBLEdBQU4sU0FBTUEsY0FBTixDQUlHQyxRQUpILEVBSVM1RixFQUpULEU7WUFJYzZGLElBQUEsRztRQUNaLE87WUFBTSxJQUFBQyxJLEdBQUl4RixRQUFELEMsVUFBVyxDLE1BQUEsRSxPQUFFLEMsTUFBQSxFLE1BQUEsQyxVQUFNTixFLE9BQUs2RixJLEVBQWIsQ0FBWCxFQUErQnhGLElBQUQsQ0FBTXVGLFFBQU4sQ0FBOUIsQ0FBSCxDO1lBQ0EsSUFBQUcsTSxhQUFLLEMsTUFBQSxFLE9BQUUsQyxNQUFBLEUsSUFBQSxDLFVBQUlELEksSUFBSTlGLEUsRUFBVixDQUFMLEM7WUFDQSxJQUFBdUYsSyxHQUFLZixPQUFELENBQVN1QixNQUFULENBQUosQztZQUNBLElBQUFDLE0sR0FBTXJCLE9BQUQsQ0FBU1ksS0FBVCxDQUFMLEM7WUFDQSxJQUFBVSxPLEdBQU9DLElBQUQsQ0FBTUYsTUFBTixDQUFOLEM7WUFDSDFCLFlBQUQsQ0FBZ0J0RSxFQUFoQixFQUFtQmlHLE9BQW5CLEU7O2NBTEYsQyxJQUFBLEU7S0FMRixDO0FBWUMzQixZQUFELEMsTUFBaUIsQyxNQUFBLEUsVUFBQSxDQUFqQixFQUEyQmhFLFFBQUQsQ0FBV3FGLGNBQVgsRUFBMkIsRSxZQUFXLEMsT0FBQSxDQUFYLEVBQTNCLENBQTFCIiwic291cmNlc0NvbnRlbnQiOlsiKG5zIHdpc3AuYmFja2VuZC5lc2NvZGVnZW4uZ2VuZXJhdG9yXG4gICg6cmVxdWlyZSBbd2lzcC5yZWFkZXIgOnJlZmVyIFtyZWFkLWZyb20tc3RyaW5nIHJlYWQqXVxuICAgICAgICAgICAgICAgICAgICAgICAgIDpyZW5hbWUge3JlYWQtZnJvbS1zdHJpbmcgcmVhZC1zdHJpbmd9XVxuICAgICAgICAgICAgW3dpc3AuYXN0IDpyZWZlciBbbWV0YSB3aXRoLW1ldGEgc3ltYm9sPyBzeW1ib2wga2V5d29yZD8ga2V5d29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlIHVucXVvdGU/IHVucXVvdGUtc3BsaWNpbmc/IHF1b3RlP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4LXF1b3RlPyBuYW1lIGdlbnN5bSBwci1zdHJdXVxuICAgICAgICAgICAgW3dpc3Auc2VxdWVuY2UgOnJlZmVyIFtlbXB0eT8gY291bnQgbGlzdD8gbGlzdCBmaXJzdCBzZWNvbmQgdGhpcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdCBjb25zIGNvbmogYnV0bGFzdCByZXZlcnNlIHJlZHVjZSB2ZWNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCBtYXAgZmlsdGVyIHRha2UgY29uY2F0IHBhcnRpdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXQgaW50ZXJsZWF2ZV1dXG4gICAgICAgICAgICBbd2lzcC5ydW50aW1lIDpyZWZlciBbb2RkPyBkaWN0aW9uYXJ5PyBkaWN0aW9uYXJ5IG1lcmdlIGtleXMgdmFsc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zLXZlY3Rvcj8gbWFwLWRpY3Rpb25hcnkgc3RyaW5nP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcj8gdmVjdG9yPyBib29sZWFuPyBzdWJzIHJlLWZpbmQgdHJ1ZT9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZT8gbmlsPyByZS1wYXR0ZXJuPyBpbmMgZGVjIHN0ciBjaGFyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ID0gPT1dXVxuICAgICAgICAgICAgW3dpc3Auc3RyaW5nIDpyZWZlciBbc3BsaXQgam9pbiB1cHBlci1jYXNlIHJlcGxhY2VdXVxuICAgICAgICAgICAgW3dpc3AuZXhwYW5kZXIgOnJlZmVyIFtpbnN0YWxsLW1hY3JvIV1dXG4gICAgICAgICAgICBbd2lzcC5hbmFseXplciA6cmVmZXIgW2VtcHR5LWVudiBhbmFseXplIGFuYWx5emUqXV1cbiAgICAgICAgICAgIFt3aXNwLmJhY2tlbmQuZXNjb2RlZ2VuLndyaXRlciA6cmVmZXIgW3dyaXRlIGNvbXBpbGUgd3JpdGUqXV1cblxuICAgICAgICAgICAgW2VzY29kZWdlbiA6cmVmZXIgW2dlbmVyYXRlXSA6cmVuYW1lIHtnZW5lcmF0ZSBnZW5lcmF0ZSp9XVxuICAgICAgICAgICAgW2Jhc2U2NC1lbmNvZGUgOmFzIGJ0b2FdXG4gICAgICAgICAgICBbZnMgOnJlZmVyIFtyZWFkLWZpbGUtc3luYyB3cml0ZS1maWxlLXN5bmNdXVxuICAgICAgICAgICAgW3BhdGggOnJlZmVyIFtiYXNlbmFtZSBkaXJuYW1lIGpvaW5dXG4gICAgICAgICAgICAgICAgICA6cmVuYW1lIHtqb2luIGpvaW4tcGF0aH1dKSlcblxuKGRlZm4gZ2VuZXJhdGVcbiAgW29wdGlvbnMgJiBub2Rlc11cbiAgKGxldCBbYXN0IChhcHBseSB3cml0ZSogbm9kZXMpXG5cbiAgICAgICAgb3V0cHV0IChnZW5lcmF0ZSogYXN0IHs6ZmlsZSAoOm91dHB1dC11cmkgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6c291cmNlQ29udGVudCAoOnNvdXJjZSBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpzb3VyY2VNYXAgKDpzb3VyY2UtdXJpIG9wdGlvbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnNvdXJjZU1hcFJvb3QgKDpzb3VyY2Utcm9vdCBvcHRpb25zKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpzb3VyY2VNYXBXaXRoQ29kZSB0cnVlfSldXG5cbiAgICA7OyBXb3JrYXJvdW5kIHRoZSBmYWN0IHRoYXQgZXNjb2RlZ2VuIGRvZXMgbm90IHlldCBpbmNsdWRlcyBzb3VyY2VcbiAgICAoLnNldFNvdXJjZUNvbnRlbnQgKDptYXAgb3V0cHV0KVxuICAgICAgICAgICAgICAgICAgICAgICAoOnNvdXJjZS11cmkgb3B0aW9ucylcbiAgICAgICAgICAgICAgICAgICAgICAgKDpzb3VyY2Ugb3B0aW9ucykpXG5cbiAgICB7OmNvZGUgKGlmICg6bm8tbWFwIG9wdGlvbnMpXG4gICAgICAgICAgICAgKDpjb2RlIG91dHB1dClcbiAgICAgICAgICAgICAoc3RyICg6Y29kZSBvdXRwdXQpXG4gICAgICAgICAgICAgICAgICBcIlxcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPVwiXG4gICAgICAgICAgICAgICAgICBcImRhdGE6YXBwbGljYXRpb24vanNvbjtiYXNlNjQsXCJcbiAgICAgICAgICAgICAgICAgIChidG9hIChzdHIgKDptYXAgb3V0cHV0KSkpXG4gICAgICAgICAgICAgICAgICBcIlxcblwiKSlcbiAgICAgOnNvdXJjZS1tYXAgKDptYXAgb3V0cHV0KVxuICAgICA6anMtYXN0IGFzdH0pKVxuXG5cbihkZWZuIGV4cGFuZC1kZWZtYWNyb1xuICBcIkxpa2UgZGVmbiwgYnV0IHRoZSByZXN1bHRpbmcgZnVuY3Rpb24gbmFtZSBpcyBkZWNsYXJlZCBhcyBhXG4gIG1hY3JvIGFuZCB3aWxsIGJlIHVzZWQgYXMgYSBtYWNybyBieSB0aGUgY29tcGlsZXIgd2hlbiBpdCBpc1xuICBjYWxsZWQuXCJcbiAgWyZmb3JtIGlkICYgYm9keV1cbiAgKGxldCBbZm4gKHdpdGgtbWV0YSBgKGRlZm4gfmlkIH5AYm9keSkgKG1ldGEgJmZvcm0pKVxuICAgICAgICBmb3JtIGAoZG8gfmZuIH5pZClcbiAgICAgICAgYXN0IChhbmFseXplIGZvcm0pXG4gICAgICAgIGNvZGUgKGNvbXBpbGUgYXN0KVxuICAgICAgICBtYWNybyAoZXZhbCBjb2RlKV1cbiAgICAoaW5zdGFsbC1tYWNybyEgaWQgbWFjcm8pXG4gICAgbmlsKSlcbihpbnN0YWxsLW1hY3JvISAnZGVmbWFjcm8gKHdpdGgtbWV0YSBleHBhbmQtZGVmbWFjcm8gezppbXBsaWNpdCBbOiZmb3JtXX0pKVxuIl19