Skip to content

Commit dfb8b1b

Browse files
committed
feat: add extend property to nodes which use :extend
1 parent e8f1183 commit dfb8b1b

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

lib/LessParser.js

+18
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,17 @@ module.exports = class LessParser extends Parser {
2828
variableNode(this.lastNode);
2929
}
3030

31+
decl(...args) {
32+
super.decl(...args);
33+
34+
// #123: add `extend` decorator to nodes
35+
const extendPattern = /extend\(.+\)/i;
36+
37+
if (extendPattern.test(this.lastNode.value)) {
38+
this.lastNode.extend = true;
39+
}
40+
}
41+
3142
each(tokens) {
3243
// prepend a space so the `name` will be parsed correctly
3344
tokens[0][1] = ` ${tokens[0][1]}`;
@@ -168,6 +179,13 @@ module.exports = class LessParser extends Parser {
168179
}
169180

170181
super.rule(tokens);
182+
183+
// #123: add `extend` decorator to nodes
184+
const extendPattern = /:extend\(.+\)/i;
185+
186+
if (extendPattern.test(this.lastNode.selector)) {
187+
this.lastNode.extend = true;
188+
}
171189
}
172190

173191
unknownWord(tokens) {

test/parser/extend.test.js

+13-3
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,30 @@ const test = require('ava');
22

33
const { parse, nodeToString } = require('../../lib');
44

5-
test('inline &:extend()', (t) => {
5+
test('inline :extend()', (t) => {
66
const less = '.a:extend(.b) {color: red;}';
77
const root = parse(less);
88
const { first } = root;
99

1010
t.is(first.selector, '.a:extend(.b)');
11+
t.truthy(first.extend);
1112
t.is(nodeToString(root), less);
1213
});
1314

14-
test('inline &:extend() with multiple parameters', (t) => {
15+
test('inline :extend() with multiple parameters', (t) => {
1516
const less = '.e:extend(.f, .g) {}';
1617
const { first } = parse(less);
1718

1819
t.is(first.selector, '.e:extend(.f, .g)');
20+
t.truthy(first.extend);
1921
});
2022

21-
test('inline &:extend() with nested selector in parameters', (t) => {
23+
test('inline :extend() with nested selector in parameters', (t) => {
2224
const less = '.e:extend(.a .g, b span) {}';
2325
const { first } = parse(less);
2426

2527
t.is(first.selector, '.e:extend(.a .g, b span)');
28+
t.truthy(first.extend);
2629
});
2730

2831
test('parses nested &:extend()', (t) => {
@@ -32,27 +35,31 @@ test('parses nested &:extend()', (t) => {
3235
t.is(first.selector, '.a');
3336
t.is(first.first.prop, '&');
3437
t.is(first.first.value, 'extend(.bucket tr)');
38+
t.truthy(first.first.extend);
3539
});
3640

3741
test('parses :extend() after selector', (t) => {
3842
const less = 'pre:hover:extend(div pre){}';
3943
const { first } = parse(less);
4044

4145
t.is(first.selector, 'pre:hover:extend(div pre)');
46+
t.truthy(first.extend);
4247
});
4348

4449
test('parses :extend() after selector. 2', (t) => {
4550
const less = 'pre:hover :extend(div pre){}';
4651
const { first } = parse(less);
4752

4853
t.is(first.selector, 'pre:hover :extend(div pre)');
54+
t.truthy(first.extend);
4955
});
5056

5157
test('parses multiple extends', (t) => {
5258
const less = 'pre:hover:extend(div pre):extend(.bucket tr) { }';
5359
const { first } = parse(less);
5460

5561
t.is(first.selector, 'pre:hover:extend(div pre):extend(.bucket tr)');
62+
t.truthy(first.extend);
5663
});
5764

5865
test('parses nth expression in extend', (t) => {
@@ -62,13 +69,15 @@ test('parses nth expression in extend', (t) => {
6269

6370
t.is(first.selector, ':nth-child(1n+3)');
6471
t.is(last.selector, '.child:extend(:nth-child(n+3))');
72+
t.truthy(last.extend);
6573
});
6674

6775
test('"all"', (t) => {
6876
const less = '.replacement:extend(.test all) {}';
6977
const { first } = parse(less);
7078

7179
t.is(first.selector, '.replacement:extend(.test all)');
80+
t.truthy(first.extend);
7281
});
7382

7483
test('with interpolation', (t) => {
@@ -77,4 +86,5 @@ test('with interpolation', (t) => {
7786

7887
t.is(root.nodes[0].selector, '.bucket');
7988
t.is(root.nodes[1].selector, '.some-class:extend(@{variable})');
89+
t.truthy(root.nodes[1].extend);
8090
});

0 commit comments

Comments
 (0)