From c765d13722e3d0f077a55b61d73b6cf08eab7c15 Mon Sep 17 00:00:00 2001 From: Jan Nicklas Date: Thu, 18 Jul 2019 09:54:11 +0200 Subject: [PATCH] Use closest selector --- .../selector-no-union-class-name/index.js | 24 +++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/rules/selector-no-union-class-name/index.js b/src/rules/selector-no-union-class-name/index.js index 981dc7a0..4555c71b 100644 --- a/src/rules/selector-no-union-class-name/index.js +++ b/src/rules/selector-no-union-class-name/index.js @@ -35,8 +35,10 @@ export default function(actual) { root.walkRules(/&/, rule => { const parentNodes = []; - if (rule.parent && rule.parent.selector) { - parseSelector(rule.parent.selector, result, rule, fullSelector => { + const selector = getSelectorFromRule(rule.parent); + + if (selector) { + parseSelector(selector, result, rule, fullSelector => { fullSelector.walk(node => parentNodes.push(node)); }); } @@ -67,3 +69,21 @@ export default function(actual) { }); }; } + +/** + * Searches for the closest rule which + * has a selector and returns the selector + * @returns {string|undefined} + */ +function getSelectorFromRule(rule) { + // All non at-rules have their own selector + if (rule.selector !== undefined) { + return rule.selector; + } + + // At-rules like @mixin don't have a selector themself + // but their parents might have one + if (rule.parent) { + return getSelectorFromRule(rule.parent); + } +}