|
|
- /*
- MIT License http://www.opensource.org/licenses/mit-license.php
- Author Tobias Koppers @sokra
- */
- "use strict";
-
- const base64VLQ = require("./base64-vlq");
- const getNumberOfLines = require("./helpers").getNumberOfLines;
- const getUnfinishedLine = require("./helpers").getUnfinishedLine;
-
- const LINE_MAPPING = ";AAAA";
-
- class SingleLineNode {
-
- constructor(generatedCode, source, originalSource, line) {
- this.generatedCode = generatedCode;
- this.originalSource = originalSource;
- this.source = source;
- this.line = line || 1;
- this._numberOfLines = getNumberOfLines(this.generatedCode);
- this._endsWithNewLine = generatedCode[generatedCode.length - 1] === "\n";
- }
-
- clone() {
- return new SingleLineNode(this.generatedCode, this.source, this.originalSource, this.line);
- }
-
- getGeneratedCode() {
- return this.generatedCode;
- }
-
- getMappings(mappingsContext) {
- if(!this.generatedCode)
- return "";
- const lines = this._numberOfLines;
- const sourceIdx = mappingsContext.ensureSource(this.source, this.originalSource);
- let mappings = "A"; // generated column 0
- if(mappingsContext.unfinishedGeneratedLine)
- mappings = "," + base64VLQ.encode(mappingsContext.unfinishedGeneratedLine);
- mappings += base64VLQ.encode(sourceIdx - mappingsContext.currentSource); // source index
- mappings += base64VLQ.encode(this.line - mappingsContext.currentOriginalLine); // original line index
- mappings += "A"; // original column 0
- mappingsContext.currentSource = sourceIdx;
- mappingsContext.currentOriginalLine = this.line;
- const unfinishedGeneratedLine = mappingsContext.unfinishedGeneratedLine = getUnfinishedLine(this.generatedCode)
- mappings += Array(lines).join(LINE_MAPPING);
- if(unfinishedGeneratedLine === 0) {
- mappings += ";";
- } else {
- if(lines !== 0)
- mappings += LINE_MAPPING;
- }
- return mappings;
- }
-
- getNormalizedNodes() {
- return [this];
- }
-
- mapGeneratedCode(fn) {
- const generatedCode = fn(this.generatedCode);
- return new SingleLineNode(generatedCode, this.source, this.originalSource, this.line);
- }
-
- merge(otherNode) {
- if(otherNode instanceof SingleLineNode) {
- return this.mergeSingleLineNode(otherNode);
- }
- return false;
- }
-
- mergeSingleLineNode(otherNode) {
- if(this.source === otherNode.source &&
- this.originalSource === otherNode.originalSource) {
- if(this.line === otherNode.line) {
- this.generatedCode += otherNode.generatedCode;
- this._numberOfLines += otherNode._numberOfLines;
- this._endsWithNewLine = otherNode._endsWithNewLine;
- return this;
- } else if(this.line + 1 === otherNode.line &&
- this._endsWithNewLine &&
- this._numberOfLines === 1 &&
- otherNode._numberOfLines <= 1) {
- return new SourceNode(this.generatedCode + otherNode.generatedCode, this.source, this.originalSource, this.line);
- }
- }
- return false;
- }
- }
-
- module.exports = SingleLineNode;
-
- const SourceNode = require("./SourceNode"); // circular dependency
|