4 const _ = require("lodash");
6 /*:: type rangeDataType = {
11 /*:: type rangeType = {
17 /*:: type unusedRangeT = {
22 module.exports = function(
23 results /*: Array<stylelint$result>*/
24 ) /*: stylelint$needlessDisablesReport*/ {
27 results.forEach(result => {
28 // File with `CssSyntaxError` have not `_postcssResult`
29 if (!result._postcssResult) {
33 const unused = { source: result.source, ranges: [] };
34 const rangeData /*: ?rangeDataType*/ = _.cloneDeep(
35 result._postcssResult.stylelint.disabledRanges
42 result.warnings.forEach(warning => {
43 const rule /*: string*/ = warning.rule;
45 const ruleRanges /*: Array<Object>*/ = rangeData[rule];
47 // Back to front so we get the *last* range that applies to the warning
48 for (const range of ruleRanges.reverse()) {
49 if (isWarningInRange(warning, range)) {
56 for (const range of rangeData.all.reverse()) {
57 if (isWarningInRange(warning, range)) {
64 Object.keys(rangeData).forEach(rule => {
65 rangeData[rule].forEach((range /*: rangeType*/) => {
66 // Is an equivalent range already marked as unused?
67 const alreadyMarkedUnused /*: ?unusedRangeT*/ = unused.ranges.find((
68 unusedRange /*: unusedRangeT*/
71 unusedRange.start === range.start && unusedRange.end === range.end
75 // If this range is unused and no equivalent is marked,
76 // mark this range as unused
77 if (!range.used && !alreadyMarkedUnused) {
78 unused.ranges.push(range);
81 // If this range is used but an equivalent has been marked as unused,
82 // remove that equivalent. This can happen because of the duplication
83 // of ranges in rule-specific range sets and the "all" range set
84 if (range.used && alreadyMarkedUnused) {
85 _.remove(unused.ranges, alreadyMarkedUnused);
90 unused.ranges = _.sortBy(unused.ranges, ["start", "end"]);
98 function isWarningInRange(
107 rules?: Array<string>,
113 const rule = warning.rule,
116 // Need to check if range.end exist, because line number type cannot be compared to undefined
118 range.start <= line &&
119 ((range.end !== undefined && range.end >= line) ||
120 range.end === undefined) &&
121 (!range.rules || range.rules.indexOf(rule) !== -1)