1 | import { getLocation } from '../language/location';
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | export function printLocation(location) {
|
7 | return printSourceLocation(location.source, getLocation(location.source, location.start));
|
8 | }
|
9 |
|
10 |
|
11 |
|
12 |
|
13 | export function printSourceLocation(source, sourceLocation) {
|
14 | var firstLineColumnOffset = source.locationOffset.column - 1;
|
15 | var body = whitespace(firstLineColumnOffset) + source.body;
|
16 | var lineIndex = sourceLocation.line - 1;
|
17 | var lineOffset = source.locationOffset.line - 1;
|
18 | var lineNum = sourceLocation.line + lineOffset;
|
19 | var columnOffset = sourceLocation.line === 1 ? firstLineColumnOffset : 0;
|
20 | var columnNum = sourceLocation.column + columnOffset;
|
21 | var locationStr = "".concat(source.name, ":").concat(lineNum, ":").concat(columnNum, "\n");
|
22 | var lines = body.split(/\r\n|[\n\r]/g);
|
23 | var locationLine = lines[lineIndex];
|
24 |
|
25 | if (locationLine.length > 120) {
|
26 | var sublineIndex = Math.floor(columnNum / 80);
|
27 | var sublineColumnNum = columnNum % 80;
|
28 | var sublines = [];
|
29 |
|
30 | for (var i = 0; i < locationLine.length; i += 80) {
|
31 | sublines.push(locationLine.slice(i, i + 80));
|
32 | }
|
33 |
|
34 | return locationStr + printPrefixedLines([["".concat(lineNum), sublines[0]]].concat(sublines.slice(1, sublineIndex + 1).map(function (subline) {
|
35 | return ['', subline];
|
36 | }), [[' ', whitespace(sublineColumnNum - 1) + '^'], ['', sublines[sublineIndex + 1]]]));
|
37 | }
|
38 |
|
39 | return locationStr + printPrefixedLines([
|
40 | ["".concat(lineNum - 1), lines[lineIndex - 1]], ["".concat(lineNum), locationLine], ['', whitespace(columnNum - 1) + '^'], ["".concat(lineNum + 1), lines[lineIndex + 1]]]);
|
41 | }
|
42 |
|
43 | function printPrefixedLines(lines) {
|
44 | var existingLines = lines.filter(function (_ref) {
|
45 | var _ = _ref[0],
|
46 | line = _ref[1];
|
47 | return line !== undefined;
|
48 | });
|
49 | var padLen = Math.max.apply(Math, existingLines.map(function (_ref2) {
|
50 | var prefix = _ref2[0];
|
51 | return prefix.length;
|
52 | }));
|
53 | return existingLines.map(function (_ref3) {
|
54 | var prefix = _ref3[0],
|
55 | line = _ref3[1];
|
56 | return lpad(padLen, prefix) + (line ? ' | ' + line : ' |');
|
57 | }).join('\n');
|
58 | }
|
59 |
|
60 | function whitespace(len) {
|
61 | return Array(len + 1).join(' ');
|
62 | }
|
63 |
|
64 | function lpad(len, str) {
|
65 | return whitespace(len - str.length) + str;
|
66 | }
|