scss-parser icon indicating copy to clipboard operation
scss-parser copied to clipboard

Parse error with mixin using map for parameters

Open strarsis opened this issue 8 years ago • 1 comments

scss-parser throws a parse error when a mixin using a map for parameters (also see https://www.sitepoint.com/sass-multiple-arguments-lists-or-arglist/) is included.

Input SCSS:

.test {
  @include some-mixin((
    param1: 2,
    param2: 100%
  )...);
}

Parse error:

Unhandled rejection Error: Selector ("class") expected "identifier" or "interpolation" (5:6)
    at InputStream.err ([...]/node_modules/scss-parser/dist/input-stream.js:122:13)
    at Object.err ([...]/node_modules/scss-parser/dist/input-stream.js:161:20)
    at TokenStream.err ([...]/node_modules/scss-parser/dist/token-stream.js:297:40)
    at Object.err ([...]/node_modules/scss-parser/dist/token-stream.js:634:20)
    at Parser.parse_selector ([...]/node_modules/scss-parser/dist/parse.js:728:21)
    at [...]/node_modules/scss-parser/dist/parse.js:435:25
    at Parser.maybe_function ([...]/node_modules/scss-parser/dist/parse.js:609:14)
    at Parser.parse_atom ([...]/node_modules/scss-parser/dist/parse.js:420:19)
    at Parser.parse_expression ([...]/node_modules/scss-parser/dist/parse.js:394:25)
    at Parser.parse_arguments ([...]/node_modules/scss-parser/dist/parse.js:581:37)
    at Parser.parse_at_rule ([...]/node_modules/scss-parser/dist/parse.js:665:27)
    at Parser.parse_node ([...]/node_modules/scss-parser/dist/parse.js:350:36)
    at Parser.parse_block ([...]/node_modules/scss-parser/dist/parse.js:539:25)
    at Parser.parse_rule ([...]/node_modules/scss-parser/dist/parse.js:692:24)
    at Parser.parse_node ([...]/node_modules/scss-parser/dist/parse.js:357:51)
    at Parser.parse_stylesheet ([...]/node_modules/scss-parser/dist/parse.js:267:25)

strarsis avatar Nov 15 '16 20:11 strarsis

This seems to relate to the ellipsis (variable arguments), because the same error is thrown when the following code is executed:

let { parse, stringify } = require('scss-parser')

// Create an AST from a string of SCSS
let ast = parse('@mixin box-shadow($shadow...) { @if enable-shadows { box-shadow: $shadow; } }')
// Modify the AST (see below for a better way to do this)
ast.value[0].value[0].value[0].value[0].value = 'world'
// Convert the modified AST back to SCSS
let scss = stringify(ast) // .world { color: $red; }

smallstepstoday avatar Feb 11 '19 05:02 smallstepstoday