mark(node) { let loc = node.loc; if (!loc) return; // no location info let map = this.map; if (!map) return; // no source map if (t.isProgram(node) || t.isFile(node)) return; // illegal mapping nodes let position = this.position; let generated = { line: position.line, column: position.column }; let original = loc.start; // Avoid emitting duplicates on either side. Duplicated // original values creates unnecesssarily large source maps // and increases compile time. Duplicates on the generated // side can lead to incorrect mappings. if (comparePosition(original, this.last.original) || comparePosition(generated, this.last.generated)) { return; } this.last = { source: loc.filename || this.opts.sourceFileName, generated: generated, original: original }; map.addMapping(this.last); }
print(node, parent, opts = {}) { if (!node) return; this._lastPrintedIsEmptyStatement = false; if (parent && parent._compact) { node._compact = true; } let oldInAux = this.insideAux; this.insideAux = !node.loc; let oldConcise = this.format.concise; if (node._compact) { this.format.concise = true; } let printMethod = this[node.type]; if (!printMethod) { throw new ReferenceError(`unknown node of type ${JSON.stringify(node.type)} with constructor ${JSON.stringify(node && node.constructor.name)}`); } this._printStack.push(node); if (node.loc) this.printAuxAfterComment(); this.printAuxBeforeComment(oldInAux); let needsParens = n.needsParens(node, parent, this._printStack); if (needsParens) this.push("("); this.printLeadingComments(node, parent); this.catchUp(node); this._printNewline(true, node, parent, opts); if (opts.before) opts.before(); let loc = (t.isProgram(node) || t.isFile(node)) ? null : node.loc; this.withSource("start", loc, () => { this._print(node, parent); }); // Check again if any of our children may have left an aux comment on the stack if (node.loc) this.printAuxAfterComment(); this.printTrailingComments(node, parent); if (needsParens) this.push(")"); // end this._printStack.pop(); if (opts.after) opts.after(); this.format.concise = oldConcise; this.insideAux = oldInAux; this._printNewline(false, node, parent, opts); }