Sha256: d00b990d426d22baa2f73b3373437b2641459f0daf9f46969056a36e09d203e6
Contents?: true
Size: 1.7 KB
Versions: 4
Compression:
Stored size: 1.7 KB
Contents
import types from './types/index.js'; import BlockStatement from './BlockStatement.js'; import Node from './Node.js'; import keys from './keys.js'; const statementsWithBlocks = { IfStatement: 'consequent', ForStatement: 'body', ForInStatement: 'body', ForOfStatement: 'body', WhileStatement: 'body', DoWhileStatement: 'body', ArrowFunctionExpression: 'body' }; export default function wrap(raw, parent) { if (!raw) return; if ('length' in raw) { let i = raw.length; while (i--) wrap(raw[i], parent); return; } // with e.g. shorthand properties, key and value are // the same node. We don't want to wrap an object twice if (raw.__wrapped) return; raw.__wrapped = true; if (!keys[raw.type]) { keys[raw.type] = Object.keys(raw).filter( key => typeof raw[key] === 'object' ); } // special case – body-less if/for/while statements. TODO others? const bodyType = statementsWithBlocks[raw.type]; if (bodyType && raw[bodyType].type !== 'BlockStatement') { const expression = raw[bodyType]; // create a synthetic block statement, otherwise all hell // breaks loose when it comes to block scoping raw[bodyType] = { start: expression.start, end: expression.end, type: 'BlockStatement', body: [expression], synthetic: true }; } raw.parent = parent; raw.program = parent.program || parent; raw.depth = parent.depth + 1; raw.keys = keys[raw.type]; raw.indentation = undefined; for (const key of keys[raw.type]) { wrap(raw[key], raw); } raw.program.magicString.addSourcemapLocation(raw.start); raw.program.magicString.addSourcemapLocation(raw.end); const type = (raw.type === 'BlockStatement' ? BlockStatement : types[raw.type]) || Node; raw.__proto__ = type.prototype; }
Version data entries
4 entries across 4 versions & 1 rubygems