diff --git a/lib/rules/mixins-before-declarations.js b/lib/rules/mixins-before-declarations.js index 5499646e..982e15ee 100644 --- a/lib/rules/mixins-before-declarations.js +++ b/lib/rules/mixins-before-declarations.js @@ -11,35 +11,37 @@ module.exports = { ] }, 'detect': function (ast, parser) { - var result = [], - error; + var result = []; + var error; - ast.traverseByType('block', function (block) { - var lastDeclaration = null; - block.traverse(function (item, j) { - if (item.type === 'include') { - if (j > lastDeclaration && lastDeclaration !== null) { - item.forEach('simpleSelector', function (name) { - if (parser.options.exclude.indexOf(name.content[0].content) === -1) { - error = { - 'ruleId': parser.rule.name, - 'line': item.start.line, - 'column': item.start.column, - 'message': 'Mixins should come before declarations', - 'severity': parser.severity - }; - result = helpers.addUnique(result, error); - } - }); - } + ast.traverseByType('include', function (node, i, parent) { + var depth = 0; + var declarationCount = [depth]; + + parent.traverse( function (item) { + if (item.type === 'ruleset') { + depth++; + declarationCount[depth] = 0; } if (item.type === 'declaration') { - lastDeclaration = j; + declarationCount[depth]++; + } + else if (item.type === 'include') { + item.forEach('simpleSelector', function (name) { + if (parser.options.exclude.indexOf(name.content[0].content) === -1 && declarationCount[depth] > 0) { + error = { + 'ruleId': parser.rule.name, + 'line': item.start.line, + 'column': item.start.column, + 'message': 'Mixins should come before declarations', + 'severity': parser.severity + }; + result = helpers.addUnique(result, error); + } + }); } }); - lastDeclaration = null; }); - return result; } };