polymer-analyzer
Version:
Static analysis for Web Components
69 lines • 3 kB
JavaScript
/**
* @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
;