Skip to content

Commit e4198ba

Browse files
authored
fix(issue:4268) nested pseudo-selector parsing (#4290)
* Fix nested pseudo-selector parsing where selectors are separated by one or more commas.
1 parent 773e157 commit e4198ba

File tree

3 files changed

+38
-4
lines changed

3 files changed

+38
-4
lines changed

packages/less/src/less/parser/parser.js

+24-4
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import getParserInput from './parser-input';
55
import * as utils from '../utils';
66
import functionRegistry from '../functions/function-registry';
77
import { ContainerSyntaxOptions, MediaSyntaxOptions } from '../tree/atrule-syntax';
8+
import Selector from '../tree/selector';
9+
import Anonymous from '../tree/anonymous';
810

911
//
1012
// less.js - parser
@@ -1312,9 +1314,25 @@ const Parser = function Parser(context, imports, fileInfo, currentIndex) {
13121314
if (!e) {
13131315
parserInput.save();
13141316
if (parserInput.$char('(')) {
1315-
if ((v = this.selector(false)) && parserInput.$char(')')) {
1316-
e = new(tree.Paren)(v);
1317-
parserInput.forget();
1317+
if ((v = this.selector(false))) {
1318+
let selectors = [];
1319+
while (parserInput.$char(',')) {
1320+
selectors.push(v);
1321+
selectors.push(new Anonymous(','));
1322+
v = this.selector(false);
1323+
}
1324+
selectors.push(v);
1325+
1326+
if (parserInput.$char(')')) {
1327+
if (selectors.length > 1) {
1328+
e = new (tree.Paren)(new Selector(selectors));
1329+
} else {
1330+
e = new(tree.Paren)(v);
1331+
}
1332+
parserInput.forget();
1333+
} else {
1334+
parserInput.restore('Missing closing \')\'');
1335+
}
13181336
} else {
13191337
parserInput.restore('Missing closing \')\'');
13201338
}
@@ -1395,7 +1413,9 @@ const Parser = function Parser(context, imports, fileInfo, currentIndex) {
13951413
} else {
13961414
if (allExtends) { error('Extend can only be used at the end of selector'); }
13971415
c = parserInput.currentChar();
1398-
if (elements) {
1416+
if (Array.isArray(e)){
1417+
e.forEach(ele => elements.push(ele));
1418+
} if (elements) {
13991419
elements.push(e);
14001420
} else {
14011421
elements = [ e ];

packages/test-data/css/_main/selectors.css

+6
Original file line numberDiff line numberDiff line change
@@ -183,3 +183,9 @@ blank blank blank blank blank blank blank blank blank blank blank blank blank bl
183183
.first-level .second-level.active2 {
184184
content: '\2661';
185185
}
186+
a:is(.b, :is(.c)) {
187+
color: blue;
188+
}
189+
a:is(.b, :is(.c), :has(div)) {
190+
color: red;
191+
}

packages/test-data/less/_main/selectors.less

+8
Original file line numberDiff line numberDiff line change
@@ -200,3 +200,11 @@ blank blank blank blank blank blank blank blank blank blank blank blank blank bl
200200
&.active2:extend(.extend-this) { }
201201
}
202202
}
203+
204+
a:is(.b, :is(.c)) {
205+
color: blue;
206+
}
207+
208+
a:is(.b, :is(.c), :has(div)) {
209+
color: red;
210+
}

0 commit comments

Comments
 (0)