From ebc41e5c4b3bf8e6bb0afae324be3aeb8ba44d2a Mon Sep 17 00:00:00 2001 From: Simone Deponti Date: Wed, 19 Sep 2012 11:10:32 +0200 Subject: [PATCH] Fixed nested media bug. --- lib/less/parser.js | 32 +++++++++++++++++---------- lib/less/tree.js | 26 ++++++++++++++++++++++ lib/less/tree/media.js | 4 ++++ lib/less/tree/ruleset.js | 33 ++++++---------------------- test/css/debug/comments/comments.css | 2 +- 5 files changed, 58 insertions(+), 39 deletions(-) diff --git a/lib/less/parser.js b/lib/less/parser.js index 051ca2a8..6bb90cd6 100644 --- a/lib/less/parser.js +++ b/lib/less/parser.js @@ -234,6 +234,13 @@ less.Parser = function Parser(env) { return require('path').resolve(e.filename); } + function getDebugInfo(index, inputStream, e) { + return { + lineNumber: getLocation(index, inputStream).line + 1, + fileName: getFileName(e) + }; + } + function LessError(e, env) { var input = getInput(e, env), loc = getLocation(e.index, input), @@ -1063,14 +1070,11 @@ less.Parser = function Parser(env) { // div, .class, body > p {...} // ruleset: function () { - var selectors = [], s, rules, match, sourceLineNumber, - sourceFileName; + var selectors = [], s, rules, match, debugInfo; save(); - if (env.dumpLineNumbers) { - sourceLineNumber = getLocation(i, input).line + 1; - sourceFileName = getFileName(env); - } + if (env.dumpLineNumbers) + debugInfo = getDebugInfo(i, input, env); while (s = $(this.selector)) { selectors.push(s); @@ -1081,10 +1085,8 @@ less.Parser = function Parser(env) { if (selectors.length > 0 && (rules = $(this.block))) { var ruleset = new(tree.Ruleset)(selectors, rules, env.strictImports); - if (env.dumpLineNumbers) { - ruleset.sourceLineNumber = sourceLineNumber; - ruleset.sourceFileName = sourceFileName; - } + if (env.dumpLineNumbers) + ruleset.debugInfo = debugInfo; return ruleset; } else { // Backtrack @@ -1188,13 +1190,19 @@ less.Parser = function Parser(env) { }, media: function () { - var features, rules; + var features, rules, media, debugInfo; + + if (env.dumpLineNumbers) + debugInfo = getDebugInfo(i, input, env); if ($(/^@media/)) { features = $(this.mediaFeatures); if (rules = $(this.block)) { - return new(tree.Media)(rules, features); + media = new(tree.Media)(rules, features); + if(env.dumpLineNumbers) + media.debugInfo = debugInfo; + return media; } } }, diff --git a/lib/less/tree.js b/lib/less/tree.js index 24ecd712..7038ecc4 100644 --- a/lib/less/tree.js +++ b/lib/less/tree.js @@ -1,5 +1,31 @@ (function (tree) { +tree.debugInfo = function(env, ctx) { + var result=""; + if (env.dumpLineNumbers && !env.compress) { + switch(env.dumpLineNumbers) { + case 'comments': + result = tree.debugInfo.asComment(ctx); + break; + case 'mediaquery': + result = tree.debugInfo.asMediaQuery(ctx); + break; + case 'all': + result = tree.debugInfo.asComment(ctx)+tree.debugInfo.asMediaQuery(ctx); + break; + } + } + return result; +}; + +tree.debugInfo.asComment = function(ctx) { + return '/* line ' + ctx.debugInfo.lineNumber + ', ' + ctx.debugInfo.fileName + ' */\n'; +}; + +tree.debugInfo.asMediaQuery = function(ctx) { + return '@media -sass-debug-info{filename{font-family:"' + ctx.debugInfo.fileName + '";}line{font-family:"' + ctx.debugInfo.lineNumber + '";}}\n'; +}; + tree.find = function (obj, fun) { for (var i = 0, r; i < obj.length; i++) { if (r = fun.call(obj, obj[i])) { return r } diff --git a/lib/less/tree/media.js b/lib/less/tree/media.js index 81b8a038..3bc4c54a 100644 --- a/lib/less/tree/media.js +++ b/lib/less/tree/media.js @@ -27,6 +27,10 @@ tree.Media.prototype = { env.mediaBlocks.push(this); var media = new(tree.Media)([], []); + if(this.debugInfo) { + this.ruleset.debugInfo = this.debugInfo; + media.debugInfo = this.debugInfo; + } media.features = this.features.eval(env); env.frames.unshift(this.ruleset); diff --git a/lib/less/tree/ruleset.js b/lib/less/tree/ruleset.js index 52355695..d8066fef 100644 --- a/lib/less/tree/ruleset.js +++ b/lib/less/tree/ruleset.js @@ -15,6 +15,10 @@ tree.Ruleset.prototype = { ruleset.root = this.root; ruleset.allowImports = this.allowImports; + if(this.debugInfo) { + ruleset.debugInfo = this.debugInfo; + } + // push the current ruleset to the frames stack env.frames.unshift(ruleset); @@ -69,10 +73,6 @@ tree.Ruleset.prototype = { } } - if(this.sourceLineNumber && this.sourceFileName) { - ruleset.sourceLineNumber = this.sourceLineNumber; - ruleset.sourceFileName = this.sourceFileName; - } return ruleset; }, match: function (args) { @@ -136,9 +136,7 @@ tree.Ruleset.prototype = { rulesets = [], // node.Ruleset instances paths = [], // Current selectors selector, // The fully rendered selector - lineNumbersInfo, // Line number debugging, either as comment or fake media query. - lineNumbersComment, // Line number debug info as comment - lineNumbersMediaQuery, // Line number debug info as media query + debugInfo, // Line number debugging rule; if (! this.root) { @@ -177,24 +175,7 @@ tree.Ruleset.prototype = { css.push(rules.join(env.compress ? '' : '\n')); } else { if (rules.length > 0) { - lineNumbersInfo = ""; - lineNumbersComment = ''; - lineNumbersMediaQuery = ''; - if (env.dumpLineNumbers && !env.compress) { - lineNumbersComment = '/* line ' + this.sourceLineNumber + ', ' + this.sourceFileName + ' */\n'; - lineNumbersMediaQuery = '@media -sass-debug-info{filename{font-family:"' + this.sourceFileName + '";}line{font-family:"' + this.sourceLineNumber + '";}}\n'; - switch(env.dumpLineNumbers) { - case 'comments': - lineNumbersInfo = lineNumbersComment; - break; - case 'mediaquery': - lineNumbersInfo = lineNumbersMediaQuery; - break; - case 'all': - lineNumbersInfo = lineNumbersComment+lineNumbersMediaQuery; - break; - } - } + debugInfo = tree.debugInfo(env, this); selector = paths.map(function (p) { return p.map(function (s) { return s.toCSS(env); @@ -209,7 +190,7 @@ tree.Ruleset.prototype = { } rules = _rules; - css.push(lineNumbersInfo + selector + + css.push(debugInfo + selector + (env.compress ? '{' : ' {\n ') + rules.join(env.compress ? '' : '\n ') + (env.compress ? '}' : '\n}\n')); diff --git a/test/css/debug/comments/comments.css b/test/css/debug/comments/comments.css index fe5a20e8..9913ec76 100644 --- a/test/css/debug/comments/comments.css +++ b/test/css/debug/comments/comments.css @@ -17,7 +17,7 @@ } } @media all and screen { - /* line 3, {pathimport}test.less */ + /* line 5, {pathimport}test.less */ .tst { color: red; }