1 | "use strict";
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
18 | Object.defineProperty(exports, "__esModule", { value: true });
|
19 | exports.removeDisabledFailures = exports.ENABLE_DISABLE_REGEX = void 0;
|
20 |
|
21 | var utils = require("tsutils");
|
22 | var ts = require("typescript");
|
23 |
|
24 |
|
25 |
|
26 |
|
27 |
|
28 |
|
29 |
|
30 | exports.ENABLE_DISABLE_REGEX = /^\s*tslint:(enable|disable)(?:-(line|next-line))?(:|\s|$)/;
|
31 | function removeDisabledFailures(sourceFile, failures) {
|
32 | if (failures.length === 0) {
|
33 |
|
34 | return failures;
|
35 | }
|
36 | var failingRules = new Set(failures.map(function (f) { return f.getRuleName(); }));
|
37 | var map = getDisableMap(sourceFile, failingRules);
|
38 | return failures.filter(function (failure) {
|
39 | var disabledIntervals = map.get(failure.getRuleName());
|
40 | return (disabledIntervals === undefined ||
|
41 | !disabledIntervals.some(function (_a) {
|
42 | var pos = _a.pos, end = _a.end;
|
43 | var failPos = failure.getStartPosition().getPosition();
|
44 | var failEnd = failure.getEndPosition().getPosition();
|
45 | return failEnd >= pos && (end === -1 || failPos < end);
|
46 | }));
|
47 | });
|
48 | }
|
49 | exports.removeDisabledFailures = removeDisabledFailures;
|
50 |
|
51 |
|
52 |
|
53 |
|
54 | function getDisableMap(sourceFile, failingRules) {
|
55 | var map = new Map();
|
56 | utils.forEachComment(sourceFile, function (fullText, comment) {
|
57 | var commentText = comment.kind === ts.SyntaxKind.SingleLineCommentTrivia
|
58 | ? fullText.substring(comment.pos + 2, comment.end)
|
59 | : fullText.substring(comment.pos + 2, comment.end - 2);
|
60 | var parsed = parseComment(commentText);
|
61 | if (parsed !== undefined) {
|
62 | var rulesList = parsed.rulesList, isEnabled = parsed.isEnabled, modifier = parsed.modifier;
|
63 | var switchRange = getSwitchRange(modifier, comment, sourceFile);
|
64 | if (switchRange !== undefined) {
|
65 | var rulesToSwitch = rulesList === "all"
|
66 | ? Array.from(failingRules)
|
67 | : rulesList.filter(function (r) { return failingRules.has(r); });
|
68 | for (var _i = 0, rulesToSwitch_1 = rulesToSwitch; _i < rulesToSwitch_1.length; _i++) {
|
69 | var ruleToSwitch = rulesToSwitch_1[_i];
|
70 | switchRuleState(ruleToSwitch, isEnabled, switchRange.pos, switchRange.end);
|
71 | }
|
72 | }
|
73 | }
|
74 | });
|
75 | return map;
|
76 | function switchRuleState(ruleName, isEnable, start, end) {
|
77 | var disableRanges = map.get(ruleName);
|
78 | if (isEnable) {
|
79 | if (disableRanges !== undefined) {
|
80 | var lastDisable = disableRanges[disableRanges.length - 1];
|
81 | if (lastDisable.end === -1) {
|
82 | lastDisable.end = start;
|
83 | if (end !== -1) {
|
84 |
|
85 | disableRanges.push({ pos: end, end: -1 });
|
86 | }
|
87 | }
|
88 | }
|
89 | }
|
90 | else {
|
91 |
|
92 | if (disableRanges === undefined) {
|
93 | map.set(ruleName, [{ pos: start, end: end }]);
|
94 | }
|
95 | else if (disableRanges[disableRanges.length - 1].end !== -1) {
|
96 | disableRanges.push({ pos: start, end: end });
|
97 | }
|
98 | }
|
99 | }
|
100 | }
|
101 |
|
102 | function getSwitchRange(modifier, range, sourceFile) {
|
103 | var lineStarts = sourceFile.getLineStarts();
|
104 | switch (modifier) {
|
105 | case "line":
|
106 | return {
|
107 |
|
108 | pos: getStartOfLinePosition(range.pos),
|
109 |
|
110 | end: getStartOfLinePosition(range.end, 1),
|
111 | };
|
112 | case "next-line":
|
113 |
|
114 | var pos = getStartOfLinePosition(range.end, 1);
|
115 | if (pos === -1) {
|
116 |
|
117 | return undefined;
|
118 | }
|
119 |
|
120 | return { pos: pos, end: getStartOfLinePosition(range.end, 2) };
|
121 | default:
|
122 |
|
123 |
|
124 | return { pos: range.pos, end: -1 };
|
125 | }
|
126 |
|
127 | function getStartOfLinePosition(position, lineOffset) {
|
128 | if (lineOffset === void 0) { lineOffset = 0; }
|
129 | var line = ts.getLineAndCharacterOfPosition(sourceFile, position).line + lineOffset;
|
130 | return line >= lineStarts.length ? -1 : lineStarts[line];
|
131 | }
|
132 | }
|
133 | function parseComment(commentText) {
|
134 | var match = exports.ENABLE_DISABLE_REGEX.exec(commentText);
|
135 | if (match === null) {
|
136 | return undefined;
|
137 | }
|
138 |
|
139 |
|
140 |
|
141 | var rulesList = splitOnSpaces(commentText.substr(match[0].length));
|
142 | if (rulesList.length === 0 && match[3] === ":") {
|
143 |
|
144 | return undefined;
|
145 | }
|
146 | if (rulesList.length === 0 || rulesList.indexOf("all") !== -1) {
|
147 |
|
148 |
|
149 | rulesList = "all";
|
150 | }
|
151 | return { rulesList: rulesList, isEnabled: match[1] === "enable", modifier: match[2] };
|
152 | }
|
153 | function splitOnSpaces(str) {
|
154 | return str.split(/\s+/).filter(function (s) { return s !== ""; });
|
155 | }
|