UNPKG

polymer-analyzer

Version:
69 lines 3 kB
"use strict"; /** * @license * Copyright (c) 2017 The Polymer Project Authors. All rights reserved. * This code may only be used under the BSD style license found at * http://polymer.github.io/LICENSE.txt * The complete set of authors may be found at * http://polymer.github.io/AUTHORS.txt * The complete set of contributors may be found at * http://polymer.github.io/CONTRIBUTORS.txt * Code distributed by Google as part of the polymer project is also * subject to an additional IP rights grant found at * http://polymer.github.io/PATENTS.txt */ Object.defineProperty(exports, "__esModule", { value: true }); function underlineCode(sourceRange, parsedDocument, colorizer = (s) => s, maxLines) { const relativeRange = parsedDocument.absoluteToRelativeSourceRange(sourceRange); const code = _getRelavantSourceCode(relativeRange, parsedDocument); if (!code) { return undefined; } const outputLines = []; const lines = code.split('\n', maxLines); let lineNum = relativeRange.start.line; for (const line of lines) { outputLines.push(line); outputLines.push(colorizer(getSquiggleUnderline(line, lineNum, relativeRange))); lineNum++; } return outputLines.join('\n'); } exports.underlineCode = underlineCode; function _getRelavantSourceCode(relativeRange, parsedDocument) { if (parsedDocument === null) { return; } const startOffset = parsedDocument.sourcePositionToOffset({ column: 0, line: relativeRange.start.line }); let endOffset; if (parsedDocument.newlineIndexes.length === relativeRange.end.line) { endOffset = parsedDocument.sourcePositionToOffset({ column: 0, line: relativeRange.end.line + 1 }); } else { endOffset = parsedDocument.sourcePositionToOffset({ column: -1, line: relativeRange.end.line + 1 }); } return parsedDocument.contents.slice(startOffset, endOffset); } function getSquiggleUnderline(lineText, lineNum, sourceRange) { // We're on a middle line of a multiline range. Squiggle the entire line. if (lineNum !== sourceRange.start.line && lineNum !== sourceRange.end.line) { return '~'.repeat(lineText.length); } // The tricky case. Might be the start of a multiline range, or it might just // be a one-line range. if (lineNum === sourceRange.start.line) { const startColumn = sourceRange.start.column; const endColumn = sourceRange.end.line === sourceRange.start.line ? sourceRange.end.column : lineText.length; const prefix = lineText.slice(0, startColumn).replace(/[^\t]/g, ' '); if (startColumn === endColumn) { return prefix + '~'; // always draw at least one squiggle } return prefix + '~'.repeat(endColumn - startColumn); } // We're on the end line of a multiline range. Just squiggle up to the end // column. return '~'.repeat(sourceRange.end.column); } //# sourceMappingURL=code-printer.js.map