From 0ab748371c3a545811e36b42e18cbdeb3436bf35 Mon Sep 17 00:00:00 2001 From: Luke Page Date: Sun, 9 Sep 2012 10:17:05 +0100 Subject: [PATCH] basic support in definition, clean up and tests --- lib/less/parser.js | 24 ++++++++++++------- .../errors/mixed-mixin-definition-args-1.less | 6 +++++ .../errors/mixed-mixin-definition-args-1.txt | 4 ++++ .../errors/mixed-mixin-definition-args-2.less | 6 +++++ .../errors/mixed-mixin-definition-args-2.txt | 4 ++++ .../errors/mixed-mixin-definition-args.less | 3 --- .../errors/mixed-mixin-definition-args.txt | 3 --- test/less/mixins-args.less | 2 +- 8 files changed, 36 insertions(+), 16 deletions(-) create mode 100644 test/less/errors/mixed-mixin-definition-args-1.less create mode 100644 test/less/errors/mixed-mixin-definition-args-1.txt create mode 100644 test/less/errors/mixed-mixin-definition-args-2.less create mode 100644 test/less/errors/mixed-mixin-definition-args-2.txt delete mode 100644 test/less/errors/mixed-mixin-definition-args.less delete mode 100644 test/less/errors/mixed-mixin-definition-args.txt diff --git a/lib/less/parser.js b/lib/less/parser.js index 3236f965..8ce0e8fd 100644 --- a/lib/less/parser.js +++ b/lib/less/parser.js @@ -802,7 +802,7 @@ less.Parser = function Parser(env) { // selector for now. // call: function () { - var elements = [], e, c, argsSemiColon = [], argsComma = [], args, delim, arg, nameLoop, expressions, isSemiColonSeperated, index = i, s = input.charAt(i), name, value, important = false; + var elements = [], e, c, argsSemiColon = [], argsComma = [], args, delim, arg, nameLoop, expressions, isSemiColonSeperated, expressionContainsNamed, index = i, s = input.charAt(i), name, value, important = false; if (s !== '.' && s !== '#') { return } @@ -813,9 +813,6 @@ less.Parser = function Parser(env) { c = $('>'); } if ($('(')) { - //todo remove - name = null; - isSemiColonSeperated = false; expressions = []; while (arg = $(this.expression)) { nameLoop = null; @@ -826,8 +823,11 @@ less.Parser = function Parser(env) { var val = arg.value[0]; if (val instanceof tree.Variable) { if ($(':')) { - if (isSemiColonSeperated && expressions.length > 1) { - error("Cannot mix ; and , as delimiter types"); + if (expressions.length > 0) { + if (isSemiColonSeperated) { + error("Cannot mix ; and , as delimiter types"); + } + expressionContainsNamed = true; } value = expect(this.expression); nameLoop = (name = val.name); @@ -844,6 +844,11 @@ less.Parser = function Parser(env) { } if ($(';') || isSemiColonSeperated) { + + if (expressionContainsNamed) { + error("Cannot mix ; and , as delimiter types"); + } + isSemiColonSeperated = true; if (expressions.length > 1) { @@ -853,10 +858,11 @@ less.Parser = function Parser(env) { name = null; expressions = []; + expressionContainsNamed = false; } } - if (! $(')')) throw new(Error)("Expected )"); + expect(')'); } args = isSemiColonSeperated ? argsSemiColon : argsComma; @@ -894,7 +900,7 @@ less.Parser = function Parser(env) { definition: function () { var name, params = [], match, ruleset, param, value, cond, variadic = false; if ((input.charAt(i) !== '.' && input.charAt(i) !== '#') || - peek(/^[^{]*(;|})/)) return; + peek(/^[^{]*\}/)) return; save(); @@ -926,7 +932,7 @@ less.Parser = function Parser(env) { } else { break; } - } while ($(',')) + } while ($(',') || $(';')) // .mixincall("@{a}"); // looks a bit like a mixin definition.. so we have to be nice and restore diff --git a/test/less/errors/mixed-mixin-definition-args-1.less b/test/less/errors/mixed-mixin-definition-args-1.less new file mode 100644 index 00000000..9b0e23af --- /dev/null +++ b/test/less/errors/mixed-mixin-definition-args-1.less @@ -0,0 +1,6 @@ +.mixin(@a : 4, @b : 3, @c: 2) { + will: fail; +} +.mixin-test { + .mixin(@a: 5; @b: 6, @c: 7); +} \ No newline at end of file diff --git a/test/less/errors/mixed-mixin-definition-args-1.txt b/test/less/errors/mixed-mixin-definition-args-1.txt new file mode 100644 index 00000000..6ceda7d8 --- /dev/null +++ b/test/less/errors/mixed-mixin-definition-args-1.txt @@ -0,0 +1,4 @@ +SyntaxError: Cannot mix ; and , as delimiter types in {path}mixed-mixin-definition-args-1.less:5:29 +4 .mixin-test { +5 .mixin(@a: 5; @b: 6, @c: 7); +6 } diff --git a/test/less/errors/mixed-mixin-definition-args-2.less b/test/less/errors/mixed-mixin-definition-args-2.less new file mode 100644 index 00000000..c9709427 --- /dev/null +++ b/test/less/errors/mixed-mixin-definition-args-2.less @@ -0,0 +1,6 @@ +.mixin(@a : 4, @b : 3, @c: 2) { + will: fail; +} +.mixin-test { + .mixin(@a: 5, @b: 6; @c: 7); +} diff --git a/test/less/errors/mixed-mixin-definition-args-2.txt b/test/less/errors/mixed-mixin-definition-args-2.txt new file mode 100644 index 00000000..ebb56665 --- /dev/null +++ b/test/less/errors/mixed-mixin-definition-args-2.txt @@ -0,0 +1,4 @@ +SyntaxError: Cannot mix ; and , as delimiter types in {path}mixed-mixin-definition-args-2.less:5:25 +4 .mixin-test { +5 .mixin(@a: 5, @b: 6; @c: 7); +6 } diff --git a/test/less/errors/mixed-mixin-definition-args.less b/test/less/errors/mixed-mixin-definition-args.less deleted file mode 100644 index c08c89dc..00000000 --- a/test/less/errors/mixed-mixin-definition-args.less +++ /dev/null @@ -1,3 +0,0 @@ -.mixin(@a : 4; @b : 4, @c: 3) { - will: fail; -} \ No newline at end of file diff --git a/test/less/errors/mixed-mixin-definition-args.txt b/test/less/errors/mixed-mixin-definition-args.txt deleted file mode 100644 index b66a5d53..00000000 --- a/test/less/errors/mixed-mixin-definition-args.txt +++ /dev/null @@ -1,3 +0,0 @@ -ParseError: Syntax Error on line 1 in {path}mixed-mixin-definition-args.less:1:10 -1 .mixin(@a : 4; @b : 4, @c: 3) { -2 will: fail; diff --git a/test/less/mixins-args.less b/test/less/mixins-args.less index 6c479512..76ba2623 100644 --- a/test/less/mixins-args.less +++ b/test/less/mixins-args.less @@ -135,7 +135,7 @@ body { one: @a; } -.mixin-takes-two(@a, @b) { +.mixin-takes-two(@a; @b) { one: @a; two: @b; }