Skip to content

Commit 6beec8d

Browse files
committed
Added multiple element preview on hover of scss selector
1 parent d022c0e commit 6beec8d

File tree

2 files changed

+36
-14
lines changed

2 files changed

+36
-14
lines changed

src/services/selectorPrinting.ts

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -332,14 +332,23 @@ export class SelectorPrinting {
332332
}
333333

334334
public selectorToMarkedString(node: nodes.Selector): MarkedString[] {
335-
const root = selectorToElement(node);
336-
if (root) {
337-
const markedStrings = new MarkedStringPrinter('"').print(root);
338-
markedStrings.push(this.selectorToSpecificityMarkedString(node));
339-
return markedStrings;
340-
} else {
341-
return [];
335+
let hasChild: boolean = true;
336+
let markedStrings: Array<Array<MarkedString>> = Array();
337+
let childNumber: number = 0;
338+
let childCount: number = 0;
339+
while(hasChild){
340+
const elementObject = selectorToElement(node, childNumber);
341+
let root = elementObject.root;
342+
hasChild = elementObject.hasChild;
343+
childNumber += 1;
344+
if ((hasChild || !childCount) && root) {
345+
childCount += 1;
346+
const markedString = new MarkedStringPrinter('"').print(root);
347+
markedString.push(this.selectorToSpecificityMarkedString(node));
348+
markedStrings.push(markedString);
349+
}
342350
}
351+
return markedStrings.flat(1);
343352
}
344353

345354
public simpleSelectorToMarkedString(node: nodes.SimpleSelector): MarkedString[] {
@@ -452,7 +461,7 @@ export class SelectorPrinting {
452461
return specificity;
453462
};
454463

455-
const specificity = calculateScore(node);;
464+
const specificity = calculateScore(node);
456465
return localize('specificity', "[Selector Specificity](https://developer.mozilla.org/en-US/docs/Web/CSS/Specificity): ({0}, {1}, {2})", specificity.id, specificity.attr, specificity.tag);
457466
}
458467

@@ -525,10 +534,17 @@ function isNewSelectorContext(node: nodes.Node): boolean {
525534
}
526535
return false;
527536
}
537+
interface ElementObject {
538+
root: Element | null,
539+
hasChild: boolean
540+
}
528541

529-
export function selectorToElement(node: nodes.Selector): Element | null {
542+
export function selectorToElement(node: nodes.Selector, child: number = 0): ElementObject {
530543
if (node.matches('@at-root')) {
531-
return null;
544+
return {
545+
root: null,
546+
hasChild: false
547+
};
532548
}
533549
const root: Element = new RootElement();
534550
const parentRuleSets: nodes.RuleSet[] = [];
@@ -548,14 +564,20 @@ export function selectorToElement(node: nodes.Selector): Element | null {
548564
}
549565

550566
const builder = new SelectorElementBuilder(root);
551-
567+
let hasChild: boolean = false;
552568
for (let i = parentRuleSets.length - 1; i >= 0; i--) {
553-
const selector = <nodes.Selector>parentRuleSets[i].getSelectors().getChild(0);
569+
const selector = <nodes.Selector>parentRuleSets[i].getSelectors().getChild(i === 0 ? child : 0);
554570
if (selector) {
571+
hasChild = true;
555572
builder.processSelector(selector);
573+
} else {
574+
hasChild = false;
556575
}
557576
}
558577

559578
builder.processSelector(node);
560-
return root;
579+
return {
580+
root,
581+
hasChild
582+
};
561583
}

src/test/css/selectorPrinting.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export function assertSelector(p: Parser, input: string, selectorName: string, e
6161
let element = selectorPrinting.selectorToElement(selector!);
6262
assert(element);
6363

64-
assert.equal(elementToString(element!), expected);
64+
assert.equal(elementToString(element.root!), expected);
6565
}
6666

6767
function assertElement(p: Parser, input: string, expected: { name: string; value?: string }[]): void {

0 commit comments

Comments
 (0)