diff --git a/vendor-overwrites/csslint/parserlib.js b/vendor-overwrites/csslint/parserlib.js index a94692e0..d5460954 100644 --- a/vendor-overwrites/csslint/parserlib.js +++ b/vendor-overwrites/csslint/parserlib.js @@ -1050,13 +1050,7 @@ self.parserlib = (() => { '': '[ | ] {2} [ / ]? | ' + '[ | ] , #{2} [ , ]?', - // inset? && [ {2,4} && ? ] - '': Matcher => - Matcher.many( - [true], - Matcher.cast('').braces(2, 4), - 'inset', - ''), + '': 'inset? && [ {2,4} && ? ]', '': 'linear | | | frames()', @@ -1897,7 +1891,8 @@ self.parserlib = (() => { const p = required === false ? Matcher.prec.OROR : Matcher.prec.ANDAND; const s = ms.map((m, i) => { if (required !== false && !required[i]) { - return m.toString(Matcher.prec.MOD) + '?'; + const str = m.toString(Matcher.prec.MOD); + return str.endsWith('?') ? str : str + '?'; } return m.toString(p); }).join(required === false ? ' || ' : ' && '); @@ -1935,10 +1930,22 @@ self.parserlib = (() => { function andand() { // andand = seq ( " && " seq)* const m = [seq()]; + let reqPrev = !isOptional(m[0]); + const required = [reqPrev]; while (reader.readMatch(' && ')) { - m.push(seq()); + const item = seq(); + const req = !isOptional(item); + // Matcher.many apparently can't handle optional items first + if (req && !reqPrev) { + m.unshift(item); + required.unshift(req); + } else { + m.push(item); + required.push(req); + reqPrev = req; + } } - return m.length === 1 ? m[0] : Matcher.andand.apply(Matcher, m); + return m.length === 1 ? m[0] : Matcher.many(required, ...m); } function seq() { @@ -1993,6 +2000,10 @@ self.parserlib = (() => { } return result; } + + function isOptional(item) { + return !Array.isArray(item.options) && item.toString().endsWith('?'); + } })(); //endregion