diff --git a/grammars/scss.cson b/grammars/scss.cson index 48919ec..bf75f71 100644 --- a/grammars/scss.cson +++ b/grammars/scss.cson @@ -294,27 +294,41 @@ 'at_rule_include': 'patterns': [ { - 'begin': '\\s*((@)include\\b)\\s*' - 'captures': + 'begin': '(?<=@include)\\s+([\\w-]+)\\s*(\\()' + 'beginCaptures': '1': - 'name': 'keyword.control.at-rule.include.scss' - '2': - 'name': 'punctuation.definition.keyword.scss' - '3': 'name': 'entity.name.function.scss' - '4': - 'name': 'entity.name.text.scss' - 'end': '\\s*[\\)|\\s\\;]' + '2': + 'name': 'punctuation.definition.parameters.begin.bracket.round.scss' + 'end': '\\)' + 'endCaptures': + '0': + 'name': 'punctuation.definition.parameters.end.bracket.round.scss' 'name': 'meta.at-rule.include.scss' 'patterns': [ { 'include': '#function_attributes' } - { - 'include': '#functions' - } ] } + { + 'match': '(?<=@include)\\s+([\\w-]+)' + 'captures': + '0': + 'name': 'meta.at-rule.include.scss' + '1': + 'name': 'entity.name.function.scss' + } + { + 'match': '((@)include)\\b' + 'captures': + '0': + 'name': 'meta.at-rule.include.scss' + '1': + 'name': 'keyword.control.at-rule.include.scss' + '2': + 'name': 'punctuation.definition.keyword.scss' + } ] 'at_rule_keyframes': 'patterns': [ diff --git a/spec/scss-spec.coffee b/spec/scss-spec.coffee index cc4a142..feb7b75 100644 --- a/spec/scss-spec.coffee +++ b/spec/scss-spec.coffee @@ -40,6 +40,28 @@ describe 'SCSS grammar', -> expect(tokens[0]).toEqual value: '@', scopes: ['source.css.scss', 'meta.at-rule.at-root.scss', 'keyword.control.at-rule.at-root.scss', 'punctuation.definition.keyword.scss'] expect(tokens[1]).toEqual value: 'at-root', scopes: ['source.css.scss', 'meta.at-rule.at-root.scss', 'keyword.control.at-rule.at-root.scss'] + describe '@include', -> + it 'tokenizes it correctly', -> + {tokens} = grammar.tokenizeLine '@include' + + expect(tokens[0]).toEqual value: '@', scopes: ['source.css.scss', 'meta.at-rule.include.scss', 'keyword.control.at-rule.include.scss', 'punctuation.definition.keyword.scss'] + expect(tokens[1]).toEqual value: 'include', scopes: ['source.css.scss', 'meta.at-rule.include.scss', 'keyword.control.at-rule.include.scss'] + + {tokens} = grammar.tokenizeLine '@include media{}' + + expect(tokens[0]).toEqual value: '@', scopes: ['source.css.scss', 'meta.at-rule.include.scss', 'keyword.control.at-rule.include.scss', 'punctuation.definition.keyword.scss'] + expect(tokens[1]).toEqual value: 'include', scopes: ['source.css.scss', 'meta.at-rule.include.scss', 'keyword.control.at-rule.include.scss'] + expect(tokens[3]).toEqual value: 'media', scopes: ['source.css.scss', 'meta.at-rule.include.scss', 'entity.name.function.scss'] + expect(tokens[4]).toEqual value: '{', scopes: ['source.css.scss', 'meta.property-list.scss', 'punctuation.section.property-list.begin.bracket.curly.scss'] + + {tokens} = grammar.tokenizeLine '@include media($width: 100px){}' + + expect(tokens[3]).toEqual value: 'media', scopes: ['source.css.scss', 'meta.at-rule.include.scss', 'entity.name.function.scss'] + expect(tokens[4]).toEqual value: '(', scopes: ['source.css.scss', 'meta.at-rule.include.scss', 'punctuation.definition.parameters.begin.bracket.round.scss'] + expect(tokens[6]).toEqual value: ':', scopes: ['source.css.scss', 'meta.at-rule.include.scss', 'punctuation.definition'] + expect(tokens[10]).toEqual value: ')', scopes: ['source.css.scss', 'meta.at-rule.include.scss', 'punctuation.definition.parameters.end.bracket.round.scss'] + expect(tokens[11]).toEqual value: '{', scopes: ['source.css.scss', 'meta.property-list.scss', 'punctuation.section.property-list.begin.bracket.curly.scss'] + describe '@mixin', -> it 'tokenizes solitary @mixin correctly', -> {tokens} = grammar.tokenizeLine '@mixin'