diff --git a/grammars/javascript.cson b/grammars/javascript.cson index ba61a276..9fb014ec 100644 --- a/grammars/javascript.cson +++ b/grammars/javascript.cson @@ -281,239 +281,386 @@ 'name': 'variable.language.js' } { - 'captures': - '1': - 'name': 'support.class.js' - '2': - 'name': 'support.constant.js' - '3': - 'name': 'keyword.operator.assignment.js' - 'comment': 'match stuff like: Sound.prototype = { … } when extending an object' - 'match': '([a-zA-Z_?.$][\\w?.$]*)\\.(prototype)\\s*(=)\\s*' - 'name': 'meta.class.js' + # [async] function [name](params) + # function* name(params) – generator function declaration + 'begin': '(?=(\\basync\\b\\s*)?\\bfunction\\b)' + 'end': '(?<=})' + 'patterns': [ + { + 'include': '#comments' + } + { + 'include': '#function_body' + } + { + 'begin': '\\G' + 'end': '(?<=\\))' + 'name': 'meta.function.js' + 'patterns': [ + { + 'include': '#function_innards' + } + ] + } + ] } { - 'begin': '([a-zA-Z_?.$][\\w?.$]*)\\.(prototype)\\.([a-zA-Z_?.$][\\w?.$]*)\\s*(=)\\s*(?:(async)(?:\\s+))?(function\\*?)\\s*(\\*?)(\\()' - 'beginCaptures': - '1': - 'name': 'support.class.js' - '2': - 'name': 'support.constant.js' - '3': - 'name': 'entity.name.function.js' - '4': - 'name': 'keyword.operator.assignment.js' - '5': - 'name': 'storage.modifier.js' - '6': - 'name': 'storage.type.function.js' - '7': - 'name': 'storage.type.function.js' - '8': - 'name': 'punctuation.definition.parameters.begin.js' - 'comment': 'match stuff like: Sound.prototype.play = function() { … }' - 'end': '(\\))' - 'endCaptures': - '1': - 'name': 'punctuation.definition.parameters.end.js' - 'name': 'meta.function.prototype.js' + # [.]foo = function... + 'begin': '(?=(\\.)?[a-zA-Z_$][\\w$]*\\s*=\\s*(\\basync\\b\\s*)?\\bfunction\\b)' + 'end': '(?<=})' 'patterns': [ { - 'include': '#function-params' + 'include': '#comments' + } + { + 'include': '#function_body' + } + { + 'begin': '\\G' + 'end': '(?<=\\))' + 'name': 'meta.function.js' + 'patterns': [ + { + 'match': '(\\.)?([a-zA-Z_$][\\w$]*)\\s*(=)\\s*' + 'captures': + '1': + 'name': 'meta.delimiter.method.period.js' + '2': + 'name': 'entity.name.function.js' + '3': + 'name': 'keyword.operator.assignment.js' + } + { + 'include': '#function_innards' + } + ] } ] } { - 'captures': - '1': - 'name': 'support.class.js' - '2': - 'name': 'support.constant.js' - '3': - 'name': 'entity.name.function.js' - '4': - 'name': 'keyword.operator.assignment.js' - 'comment': 'match stuff like: Sound.prototype.play = myfunc' - 'match': '([a-zA-Z_?.$][\\w?.$]*)\\.(prototype)\\.([a-zA-Z_?.$][\\w?.$]*)\\s*(=)\\s*' - 'name': 'meta.function.js' + # foo: function... + 'begin': '(?=\\b[a-zA-Z_$][\\w$]*\\s*:\\s*(\\basync\\b\\s*)?\\bfunction\\b)' + 'end': '(?<=})' + 'patterns': [ + { + 'include': '#comments' + } + { + 'include': '#function_body' + } + { + 'begin': '\\G' + 'end': '(?<=\\))' + 'name': 'meta.function.json.js' + 'patterns': [ + { + 'match': '\\b([a-zA-Z_$][\\w$]*)\\s*(:)\\s*' + 'captures': + '1': + 'name': 'entity.name.function.js' + '2': + 'name': 'keyword.operator.assignment.js' + } + { + 'include': '#function_innards' + } + ] + } + ] } { - 'begin': '([a-zA-Z_?.$][\\w?.$]*)\\.([a-zA-Z_?.$][\\w?.$]*)\\s*(=)\\s*(?:(async)(?:\\s+))?(function\\*?)\\s*(\\*?)\\s*([a-zA-Z_?$][\\w?$]*)?\\s*(\\()' - 'beginCaptures': - '1': - 'name': 'support.class.js' - '2': - 'name': 'entity.name.function.js' - '3': - 'name': 'keyword.operator.assignment.js' - '4': - 'name': 'storage.modifier.js' - '5': - 'name': 'storage.type.function.js' - '6': - 'name': 'storage.type.function.js' - '7': - 'name': 'entity.name.function.js' - '8': - 'name': 'punctuation.definition.parameters.begin.js' - 'comment': 'match stuff like: Sound.play = function() { … }' - 'end': '(\\))' - 'endCaptures': - '1': - 'name': 'punctuation.definition.parameters.end.js' - 'name': 'meta.function.js' + # "foo": function... + 'begin': '(?=((\'[^\']*?\')|("[^"]*?"))\\s*:\\s*(\\basync\\b\\s*)?\\bfunction\\b)' + 'end': '(?<=})' 'patterns': [ { - 'include': '#function-params' + 'include': '#comments' + } + { + 'include': '#function_body' + } + { + 'begin': '\\G' + 'end': '(?<=\\))' + 'name': 'meta.function.json.js' + 'patterns': [ + { + 'match': '(?:((\')([^\']*?)(\'))|((")([^"]*?)(")))\\s*(:)' + 'captures': + '1': + 'name': 'string.quoted.single.js' + '2': + 'name': 'punctuation.definition.string.begin.js' + '3': + 'name': 'entity.name.function.js' + '4': + 'name': 'punctuation.definition.string.end.js' + '5': + 'name': 'string.quoted.double.js' + '6': + 'name': 'punctuation.definition.string.begin.js' + '7': + 'name': 'entity.name.function.js' + '8': + 'name': 'punctuation.definition.string.end.js' + '9': + 'name': 'keyword.operator.assignment.js' + } + { + 'include': '#function_innards' + } + ] } ] } { - 'begin': '([a-zA-Z_?$][\\w?$]*)\\s*(=)\\s*(?:(async)(?:\\s+))?(function\\*?)\\s*(\\*?)\\s*([a-zA-Z_?$][\\w?$]*)?\\s*(\\()' - 'beginCaptures': - '1': - 'name': 'entity.name.function.js' - '2': - 'name': 'keyword.operator.assignment.js' - '3': - 'name': 'storage.modifier.js' - '4': - 'name': 'storage.type.function.js' - '5': - 'name': 'storage.type.function.js' - '6': - 'name': 'entity.name.function.js' - '7': - 'name': 'punctuation.definition.parameters.begin.js' - 'comment': 'match stuff like: play = function() { … }' - 'end': '(\\))' - 'endCaptures': - '1': - 'name': 'punctuation.definition.parameters.end.js' - 'name': 'meta.function.js' + # ES6 method definitions: foo() {} + 'begin': '''(?x) + (?= + (?! + (break|case|catch|continue|do|else|finally|for|function|if|export| + import|package|return|switch|throw|try|while|with) + [\\s\\(] + ) + \\b[a-zA-Z_$][\\w$]* + \\s*\\(\\s* + (("[^"]*")|(\\'[^\\']*\\')|((?!"|\\'|\\(|\\)).))* + \\)\\s*\\{ + ) + ''' + 'end': '(?<=})' 'patterns': [ { - 'include': '#function-params' + 'include': '#comments' + } + { + 'include': '#function_body' + } + { + 'begin': '\\G' + 'end': '(?<=\\))' + 'name': 'meta.function.method.definition.js' + 'patterns': [ + { + 'match': '\\b([a-zA-Z_$][\\w$]*)' + 'name': 'entity.name.function.js' + } + { + 'include': '#function_params' + } + ] } ] } { - 'begin': '\\b(?:(async)(?:\\s+))?(function\\*?)\\s*((\\*)|(?:(?:\\s+)(\\*?[a-zA-Z_$][\\w$]*)))?\\s*(\\()' - 'beginCaptures': - '1': - 'name': 'storage.modifier.js' - '2': - 'name': 'storage.type.function.js' - '4': - 'name': 'storage.type.function.js' - '5': - 'name': 'entity.name.function.js' - '6': - 'name': 'punctuation.definition.parameters.begin.js' - 'comment': 'match regular function like: function myFunc(arg) { … }' - 'end': '(\\))' - 'endCaptures': - '1': - 'name': 'punctuation.definition.parameters.end.js' - 'name': 'meta.function.js' + # [param|(params)] => [expression|{statements}] + 'begin': '''(?x) + (?= + (? + ) + ''' + 'end': '''(?x) + (?<=})| + ((?! + \\s*{| + \\G\\(| + \\G[\\w$]+| + \\s*/\\*|\\s*// + )(?=\\s*\\S)) + ''' 'patterns': [ { - 'include': '#function-params' + 'include': '#comments' + } + { + 'include': '#function_body' + } + { + 'begin': '\\G' + 'end': '(?<=(=>))' + 'name': 'meta.function.arrow.js' + 'patterns': [ + { + 'include': '#arrow_function_innards' + } + ] } ] } { - 'begin': '\\b([a-zA-Z_?.$][\\w?.$]*)\\s*(:)\\s*\\b(?:(async)(?:\\s+))?(function\\*?)\\s*(\\*?)\\s*([a-zA-Z_?$][\\w?$]*)?\\s*(\\()' - 'beginCaptures': - '1': - 'name': 'entity.name.function.js' - '2': - 'name': 'keyword.operator.assignment.js' - '3': - 'name': 'storage.modifier.js' - '4': - 'name': 'storage.type.function.js' - '5': - 'name': 'storage.type.function.js' - '6': - 'name': 'entity.name.function.js' - '7': - 'name': 'punctuation.definition.parameters.begin.js' - 'comment': 'match stuff like: foobar: function() { … }' - 'end': '(\\))' - 'endCaptures': - '1': - 'name': 'punctuation.definition.parameters.end.js' - 'name': 'meta.function.json.js' + # [.]foo = ... => ... + 'begin': '''(?x) + (?= + (\\.)?[a-zA-Z_$][\\w$]* + \\s*(=)\\s* + ((\\(([^\\(\\)]*)?\\))|[\\w$]+) + \\s*=> + ) + ''' + 'end': '''(?x) + (?<=})| + ((?! + \\s*{| + \\G(\\.)?[a-zA-Z_$][\\w$]*\\s*(=)\\s*\\(| + \\G(\\.)?[a-zA-Z_$][\\w$]*\\s*(=)\\s*[\\w$]+| + \\s*/\\*|\\s*// + )(?=\\s*\\S)) + ''' 'patterns': [ { - 'include': '#function-params' + 'include': '#comments' + } + { + 'include': '#function_body' + } + { + 'begin': '\\G' + 'end': '(?<=(=>))' + 'name': 'meta.function.arrow.js' + 'patterns': [ + { + 'match': '\\G(\\.)?([a-zA-Z_$][\\w$]*)\\s*(=)' + 'captures': + '1': + 'name': 'meta.delimiter.method.period.js' + '2': + 'name': 'entity.name.function.js' + '3': + 'name': 'keyword.operator.assignment.js' + } + { + 'include': '#arrow_function_innards' + } + ] } ] } { - 'begin': '(?:((\')([^\']*?)(\'))|((")([^"]*?)(")))\\s*(:)\\s*\\b(?:(async)(?:\\s+))?(function\\*?)\\s*(\\*?)\\s*([a-zA-Z_?$][\\w?$]*)?\\s*(\\()' - 'beginCaptures': - '1': - 'name': 'string.quoted.single.js' - '2': - 'name': 'punctuation.definition.string.begin.js' - '3': - 'name': 'entity.name.function.js' - '4': - 'name': 'punctuation.definition.string.end.js' - '5': - 'name': 'string.quoted.double.js' - '6': - 'name': 'punctuation.definition.string.begin.js' - '7': - 'name': 'entity.name.function.js' - '8': - 'name': 'punctuation.definition.string.end.js' - '9': - 'name': 'keyword.operator.assignment.js' - '10': - 'name': 'storage.modifier.js' - '11': - 'name': 'storage.type.function.js' - '12': - 'name': 'storage.type.function.js' - '13': - 'name': 'entity.name.function.js' - '14': - 'name': 'punctuation.definition.parameters.begin.js' - 'comment': 'Attempt to match "foo": function' - 'end': '(\\))' - 'endCaptures': - '1': - 'name': 'punctuation.definition.parameters.end.js' - 'name': 'meta.function.json.js' + # foo: ... => ... + 'begin': '''(?x) + (?= + \\b[a-zA-Z_$][\\w$]* + \\s*:\\s* + ((\\(([^\\(\\)]*)?\\))|[\\w$]+) + \\s*=> + ) + ''' + 'end': '''(?x) + (?<=})| + ((?! + \\s*{| + \\G[\\w$]+:| + \\s*/\\*|\\s*// + )(?=\\s*\\S)) + ''' 'patterns': [ { - 'include': '#function-params' + 'include': '#comments' + } + { + 'include': '#function_body' + } + { + 'begin': '\\G' + 'end': '(?<=(=>))' + 'name': 'meta.function.arrow.json.js' + 'patterns': [ + { + 'match': '\\b([a-zA-Z_$][\\w$]*)\\s*(:)\\s*' + 'captures': + '1': + 'name': 'entity.name.function.js' + '2': + 'name': 'keyword.operator.assignment.js' + } + { + 'include': '#arrow_function_innards' + } + ] } ] } { - 'begin': '\\b(constructor)\\s*(\\()' + # "foo": ... => ... + 'begin': '''(?x) + (?= + ((\'[^\']*?\')|("[^"]*?")) + \\s*:\\s* + ((\\(([^\\(\\)]*)?\\))|[\\w$]+) + \\s*=> + ) + ''' + 'end': '''(?x) + (?<=})| + ((?! + \\G((\'[^\']*?\')|("[^"]*?"))| + \\s*{| + \\s*/\\*|\\s*// + )(?=\\s*\\S)) + ''' + 'patterns': [ + { + 'include': '#comments' + } + { + 'include': '#function_body' + } + { + 'begin': '\\G' + 'end': '(?<=(=>))' + 'name': 'meta.function.arrow.json.js' + 'patterns': [ + { + 'match': '(?:((\')([^\']*?)(\'))|((")([^"]*?)(")))\\s*(:)' + 'captures': + '1': + 'name': 'string.quoted.single.js' + '2': + 'name': 'punctuation.definition.string.begin.js' + '3': + 'name': 'entity.name.function.js' + '4': + 'name': 'punctuation.definition.string.end.js' + '5': + 'name': 'string.quoted.double.js' + '6': + 'name': 'punctuation.definition.string.begin.js' + '7': + 'name': 'entity.name.function.js' + '8': + 'name': 'punctuation.definition.string.end.js' + '9': + 'name': 'keyword.operator.assignment.js' + } + { + 'include': '#arrow_function_innards' + } + ] + } + ] + } + { + 'match': '(=>)' + 'captures': + '0': + 'name': 'meta.function.arrow.js' + '1': + 'name': 'storage.type.function.arrow.js' + } + { + 'begin': '\\b(constructor)\\s*(?=\\()' 'beginCaptures': '1': 'name': 'entity.name.function.constructor.js' - '2': - 'name': 'punctuation.definition.parameters.begin.js' - 'end': '(\\))' - 'endCaptures': - '1': - 'name': 'punctuation.definition.parameters.end.js' + 'end': '(?<=\\})' 'patterns': [ { - 'include': '#function-params' + 'include': '#function_params' } ] } - { - 'include': '#methods' - } { 'match': '''(?x) \\b(class) @@ -541,72 +688,6 @@ 'name': 'entity.name.type.js' 'name': 'meta.class.js' } - { - 'name': 'meta.function.arrow.js' - 'begin': '(?)' - 'beginCaptures': - '1': - 'name': 'punctuation.definition.parameters.begin.js' - 'end': '(\\))\\s*(=>)' - 'endCaptures': - '1': - 'name': 'punctuation.definition.parameters.end.js' - '2': - 'name': 'storage.type.arrow.js' - 'patterns': [ - { - 'include': '#function-params' - } - ] - } - { - 'comment': 'match stuff like: play = (a,b) => { … }' - 'name': 'meta.function.arrow.js' - 'begin': '([a-zA-Z_?$][\\w?$]*)\\s*(=)\\s*(\\()(?=(?:[^\\(\\)]*)?\\)\\s*=>)' - 'beginCaptures': - '1': - 'name': 'entity.name.function.js' - '2': - 'name': 'keyword.operator.assignment.js' - '3': - 'name': 'punctuation.definition.parameters.begin.js' - 'end': '(\\))\\s*(=>)' - 'endCaptures': - '1': - 'name': 'punctuation.definition.parameters.end.js' - '2': - 'name': 'storage.type.arrow.js' - 'patterns': [ - { - 'include': '#function-params' - } - ] - } - { - 'comment': 'match stuff like: Sound.play = (a,b) => { … }' - 'name': 'meta.function.arrow.js' - 'begin': '([a-zA-Z_?$]*)\\.([a-zA-Z_?$][\\w?$]*)\\s*(=)\\s*(\\()(?=(?:[^\\(\\)]*)?\\)\\s*=>)' - 'beginCaptures': - '1': - 'name': 'support.class.js' - '2': - 'name': 'entity.name.function.js' - '3': - 'name': 'keyword.operator.assignment.js' - '4': - 'name': 'punctuation.definition.parameters.begin.js' - 'end': '(\\))\\s*(=>)' - 'endCaptures': - '1': - 'name': 'punctuation.definition.parameters.end.js' - '2': - 'name': 'storage.type.arrow.js' - 'patterns': [ - { - 'include': '#function-params' - } - ] - } { 'captures': '1': @@ -657,10 +738,6 @@ 'match': '()' 'name': 'comment.block.html.js' } - { - 'match': '=>', - 'name': 'storage.type.arrow.js' - } { 'match': '(?' + 'name': 'storage.type.function.arrow.js' } { - 'match': '=' - 'name': 'keyword.operator.assignment.js' + 'include': '#function_params' } { - 'include': '#comments' + 'match': '([a-zA-Z_$][\\w$]*)(?=\\s*=>)' + 'captures': + '0': + 'name': 'meta.parameters.js' + '1': + 'name': 'variable.parameter.function.js' } { - 'match': '[a-zA-Z_$][a-zA-Z_$0-9]*' - 'name': 'variable.parameter.function.js' + 'match': '(\\d[\\w$]*)' + 'captures': + '0': + 'name': 'meta.parameters.js' + '1': + 'name': 'invalid.illegal.identifier.js' } ] 'arguments': diff --git a/spec/javascript-spec.coffee b/spec/javascript-spec.coffee index 1668037d..b35a8328 100644 --- a/spec/javascript-spec.coffee +++ b/spec/javascript-spec.coffee @@ -509,14 +509,14 @@ describe "Javascript grammar", -> expect(tokens[0]).toEqual value: '`', scopes: ['source.js', 'string.quoted.template.js', 'punctuation.definition.string.begin.js'] expect(tokens[1]).toEqual value: 'hey ', scopes: ['source.js', 'string.quoted.template.js'] expect(tokens[2]).toEqual value: '${', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'punctuation.section.embedded.js'] - expect(tokens[3]).toEqual value: '(', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'meta.function.arrow.js', 'punctuation.definition.parameters.begin.js'] - expect(tokens[4]).toEqual value: ')', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'meta.function.arrow.js', 'punctuation.definition.parameters.end.js'] - expect(tokens[6]).toEqual value: '=>', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'meta.function.arrow.js', 'storage.type.arrow.js'] - expect(tokens[8]).toEqual value: '{', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'meta.brace.curly.js'] + expect(tokens[3]).toEqual value: '(', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'meta.function.arrow.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] + expect(tokens[4]).toEqual value: ')', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'meta.function.arrow.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] + expect(tokens[6]).toEqual value: '=>', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] + expect(tokens[8]).toEqual value: '{', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'punctuation.definition.function.body.begin.bracket.curly.js'] expect(tokens[9]).toEqual value: 'return', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'keyword.control.js'] expect(tokens[10]).toEqual value: ' hi', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source'] expect(tokens[11]).toEqual value: ';', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'punctuation.terminator.statement.js'] - expect(tokens[12]).toEqual value: '}', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'meta.brace.curly.js'] + expect(tokens[12]).toEqual value: '}', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'punctuation.definition.function.body.end.bracket.curly.js'] expect(tokens[13]).toEqual value: '}', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'punctuation.section.embedded.js'] expect(tokens[14]).toEqual value: '`', scopes: ['source.js', 'string.quoted.template.js', 'punctuation.definition.string.end.js'] @@ -632,14 +632,13 @@ describe "Javascript grammar", -> expect(tokens[4]).toEqual value: '$$', scopes: ['source.js', 'meta.class.js', 'entity.name.type.js'] it "tokenizes constructors", -> - {tokens} = grammar.tokenizeLine('constructor(a, b)') + {tokens} = grammar.tokenizeLine('constructor(p1, p2)') expect(tokens[0]).toEqual value: 'constructor', scopes: ['source.js', 'entity.name.function.constructor.js'] - expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'punctuation.definition.parameters.begin.js'] - expect(tokens[2]).toEqual value: 'a', scopes: ['source.js', 'variable.parameter.function.js'] - expect(tokens[3]).toEqual value: ',', scopes: ['source.js', 'meta.object.delimiter.js'] - expect(tokens[4]).toEqual value: ' ', scopes: ['source.js'] - expect(tokens[5]).toEqual value: 'b', scopes: ['source.js', 'variable.parameter.function.js'] - expect(tokens[6]).toEqual value: ')', scopes: ['source.js', 'punctuation.definition.parameters.end.js'] + expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] + expect(tokens[2]).toEqual value: 'p1', scopes: ['source.js', 'meta.parameters.js', 'variable.parameter.function.js'] + expect(tokens[3]).toEqual value: ',', scopes: ['source.js', 'meta.parameters.js', 'meta.delimiter.object.comma.js'] + expect(tokens[5]).toEqual value: 'p2', scopes: ['source.js', 'meta.parameters.js', 'variable.parameter.function.js'] + expect(tokens[6]).toEqual value: ')', scopes: ['source.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] describe "ES6 import", -> it "tokenizes import", -> @@ -755,11 +754,6 @@ describe "Javascript grammar", -> expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] expect(tokens[2]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] expect(tokens[4]).toEqual value: 'func', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] - expect(tokens[5]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'punctuation.definition.parameters.begin.js'] - expect(tokens[6]).toEqual value: 'p1', scopes: ['source.js', 'meta.function.js', 'variable.parameter.function.js'] - expect(tokens[7]).toEqual value: ',', scopes: ['source.js', 'meta.function.js', 'meta.object.delimiter.js'] - expect(tokens[9]).toEqual value: 'p2', scopes: ['source.js', 'meta.function.js', 'variable.parameter.function.js'] - expect(tokens[10]).toEqual value: ')', scopes: ['source.js', 'meta.function.js', 'punctuation.definition.parameters.end.js'] it "tokenizes named class export", -> {tokens} = grammar.tokenizeLine('export class Foo {}') @@ -825,18 +819,11 @@ describe "Javascript grammar", -> expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] expect(tokens[2]).toEqual value: 'default', scopes: ['source.js', 'meta.export.js', 'variable.language.default.js'] expect(tokens[4]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] - expect(tokens[6]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'punctuation.definition.parameters.begin.js'] - expect(tokens[7]).toEqual value: ')', scopes: ['source.js', 'meta.function.js', 'punctuation.definition.parameters.end.js'] - expect(tokens[9]).toEqual value: '{', scopes: ['source.js', 'punctuation.section.scope.begin.js'] - expect(tokens[10]).toEqual value: '}', scopes: ['source.js', 'punctuation.section.scope.end.js'] {tokens} = grammar.tokenizeLine('export default function func() {}') expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] expect(tokens[2]).toEqual value: 'default', scopes: ['source.js', 'meta.export.js', 'variable.language.default.js'] expect(tokens[4]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] - expect(tokens[6]).toEqual value: 'func', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] - expect(tokens[7]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'punctuation.definition.parameters.begin.js'] - expect(tokens[8]).toEqual value: ')', scopes: ['source.js', 'meta.function.js', 'punctuation.definition.parameters.end.js'] it "tokenizes comments in statement", -> lines = grammar.tokenizeLines ''' @@ -924,12 +911,30 @@ describe "Javascript grammar", -> {tokens} = grammar.tokenizeLine('default: ') expect(tokens[0]).toEqual value: 'default', scopes: ['source.js', 'keyword.control.js'] - describe "non-anonymous functions", -> - it "tokenizes regular functions", -> - {tokens} = grammar.tokenizeLine('function nonAnonymous(){}') + describe "functions", -> + it "tokenizes regular function declarations", -> + {tokens} = grammar.tokenizeLine('function foo(){}') expect(tokens[0]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] - expect(tokens[2]).toEqual value: 'nonAnonymous', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] - expect(tokens[3]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'punctuation.definition.parameters.begin.js'] + expect(tokens[2]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] + expect(tokens[3]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] + expect(tokens[4]).toEqual value: ')', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] + expect(tokens[5]).toEqual value: '{', scopes: ['source.js', 'punctuation.definition.function.body.begin.bracket.curly.js'] + expect(tokens[6]).toEqual value: '}', scopes: ['source.js', 'punctuation.definition.function.body.end.bracket.curly.js'] + + lines = grammar.tokenizeLines ''' + function foo() { + if(something){ } + } + ''' + expect(lines[0][0]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] + expect(lines[0][2]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] + expect(lines[0][3]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] + expect(lines[0][4]).toEqual value: ')', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] + expect(lines[0][6]).toEqual value: '{', scopes: ['source.js', 'punctuation.definition.function.body.begin.bracket.curly.js'] + expect(lines[1][1]).toEqual value: 'if', scopes: ['source.js', 'keyword.control.js'] + expect(lines[1][5]).toEqual value: '{', scopes: ['source.js', 'meta.brace.curly.js'] + expect(lines[1][7]).toEqual value: '}', scopes: ['source.js', 'meta.brace.curly.js'] + expect(lines[2][0]).toEqual value: '}', scopes: ['source.js', 'punctuation.definition.function.body.end.bracket.curly.js'] {tokens} = grammar.tokenizeLine('function $abc$(){}') expect(tokens[2]).toEqual value: '$abc$', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] @@ -937,111 +942,215 @@ describe "Javascript grammar", -> {tokens} = grammar.tokenizeLine('function $$(){}') expect(tokens[2]).toEqual value: '$$', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] - it "tokenizes methods", -> - {tokens} = grammar.tokenizeLine('Foo.method = function nonAnonymous(') - expect(tokens[0]).toEqual value: 'Foo', scopes: ['source.js', 'meta.function.js', 'support.class.js'] + it "tokenizes anonymous functions", -> + {tokens} = grammar.tokenizeLine('function (){}') + expect(tokens[0]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] + expect(tokens[2]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] + expect(tokens[3]).toEqual value: ')', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] + expect(tokens[4]).toEqual value: '{', scopes: ['source.js', 'punctuation.definition.function.body.begin.bracket.curly.js'] + expect(tokens[5]).toEqual value: '}', scopes: ['source.js', 'punctuation.definition.function.body.end.bracket.curly.js'] + + it "tokenizes async functions", -> + {tokens} = grammar.tokenizeLine('async function foo(){}') + expect(tokens[0]).toEqual value: 'async', scopes: ['source.js', 'meta.function.js', 'storage.modifier.async.js'] + expect(tokens[2]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] + expect(tokens[4]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] + + it "tokenizes functions as object properties", -> + {tokens} = grammar.tokenizeLine('obj.method = function foo(') + expect(tokens[0]).toEqual value: 'obj', scopes: ['source.js', 'variable.other.object.js'] + expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'meta.function.js', 'meta.delimiter.method.period.js'] expect(tokens[2]).toEqual value: 'method', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'meta.function.js', 'keyword.operator.assignment.js'] expect(tokens[6]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] - expect(tokens[8]).toEqual value: 'nonAnonymous', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] - expect(tokens[9]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'punctuation.definition.parameters.begin.js'] + expect(tokens[8]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] + expect(tokens[9]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] - it "tokenizes methods", -> + {tokens} = grammar.tokenizeLine('this.register = function(') + expect(tokens[0]).toEqual value: 'this', scopes: ['source.js', 'variable.language.js'] + expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'meta.function.js', 'meta.delimiter.method.period.js'] + expect(tokens[2]).toEqual value: 'register', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] + expect(tokens[6]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] + + it "tokenizes ES6 method definitions", -> {tokens} = grammar.tokenizeLine('f(a, b) {}') - expect(tokens[0]).toEqual value: 'f', scopes: ['source.js', 'meta.method.js', 'entity.name.function.js'] - expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.method.js', 'punctuation.definition.parameters.begin.js'] - expect(tokens[2]).toEqual value: 'a', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js'] - expect(tokens[3]).toEqual value: ',', scopes: ['source.js', 'meta.method.js', 'meta.object.delimiter.js'] - expect(tokens[5]).toEqual value: 'b', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js'] - expect(tokens[6]).toEqual value: ')', scopes: ['source.js', 'meta.method.js', 'punctuation.definition.parameters.end.js'] + expect(tokens[0]).toEqual value: 'f', scopes: ['source.js', 'meta.function.method.definition.js', 'entity.name.function.js'] + expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] + expect(tokens[2]).toEqual value: 'a', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'variable.parameter.function.js'] + expect(tokens[3]).toEqual value: ',', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'meta.delimiter.object.comma.js'] + expect(tokens[5]).toEqual value: 'b', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'variable.parameter.function.js'] + expect(tokens[6]).toEqual value: ')', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] + + {tokens} = grammar.tokenizeLine('async foo(){}') + expect(tokens[0]).toEqual value: 'async', scopes: ['source.js', 'storage.modifier.js'] + expect(tokens[2]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.method.definition.js', 'entity.name.function.js'] {tokens} = grammar.tokenizeLine('hi({host, root = "./", plugins = [a, "b", "c", d]}) {}') - expect(tokens[0]).toEqual value: 'hi', scopes: ['source.js', 'meta.method.js', 'entity.name.function.js'] - expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.method.js', 'punctuation.definition.parameters.begin.js'] - expect(tokens[2]).toEqual value: '{', scopes: ['source.js', 'meta.method.js', 'meta.brace.curly.js'] - expect(tokens[3]).toEqual value: 'host', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js'] - expect(tokens[4]).toEqual value: ',', scopes: ['source.js', 'meta.method.js', 'meta.object.delimiter.js'] - expect(tokens[6]).toEqual value: 'root', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js'] - expect(tokens[8]).toEqual value: '=', scopes: ['source.js', 'meta.method.js', 'keyword.operator.assignment.js'] - expect(tokens[10]).toEqual value: '"', scopes: ['source.js', 'meta.method.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js'] - expect(tokens[11]).toEqual value: './', scopes: ['source.js', 'meta.method.js', 'string.quoted.double.js'] - expect(tokens[12]).toEqual value: '"', scopes: ['source.js', 'meta.method.js', 'string.quoted.double.js', 'punctuation.definition.string.end.js'] - expect(tokens[13]).toEqual value: ',', scopes: ['source.js', 'meta.method.js', 'meta.object.delimiter.js'] - expect(tokens[15]).toEqual value: 'plugins', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js'] - expect(tokens[17]).toEqual value: '=', scopes: ['source.js', 'meta.method.js', 'keyword.operator.assignment.js'] - expect(tokens[19]).toEqual value: '[', scopes: ['source.js', 'meta.method.js', 'meta.brace.square.js'] - expect(tokens[20]).toEqual value: 'a', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js'] - expect(tokens[21]).toEqual value: ',', scopes: ['source.js', 'meta.method.js', 'meta.object.delimiter.js'] - expect(tokens[23]).toEqual value: '"', scopes: ['source.js', 'meta.method.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js'] - expect(tokens[26]).toEqual value: ',', scopes: ['source.js', 'meta.method.js', 'meta.object.delimiter.js'] - expect(tokens[28]).toEqual value: '"', scopes: ['source.js', 'meta.method.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js'] - expect(tokens[33]).toEqual value: 'd', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js'] - expect(tokens[34]).toEqual value: ']', scopes: ['source.js', 'meta.method.js', 'meta.brace.square.js'] - expect(tokens[35]).toEqual value: '}', scopes: ['source.js', 'meta.method.js', 'meta.brace.curly.js'] - expect(tokens[36]).toEqual value: ')', scopes: ['source.js', 'meta.method.js', 'punctuation.definition.parameters.end.js'] - - it "tokenizes functions", -> - {tokens} = grammar.tokenizeLine('var func = function nonAnonymous(') + expect(tokens[0]).toEqual value: 'hi', scopes: ['source.js', 'meta.function.method.definition.js', 'entity.name.function.js'] + expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] + expect(tokens[2]).toEqual value: '{', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'meta.brace.curly.js'] + expect(tokens[3]).toEqual value: 'host', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js'] + expect(tokens[4]).toEqual value: ',', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'meta.delimiter.object.comma.js'] + expect(tokens[5]).toEqual value: ' root ', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js'] + expect(tokens[6]).toEqual value: '=', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'keyword.operator.assignment.js'] + expect(tokens[8]).toEqual value: '"', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js'] + expect(tokens[9]).toEqual value: './', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'string.quoted.double.js'] + expect(tokens[10]).toEqual value: '"', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'string.quoted.double.js', 'punctuation.definition.string.end.js'] + expect(tokens[11]).toEqual value: ',', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'meta.delimiter.object.comma.js'] + expect(tokens[12]).toEqual value: ' plugins ', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js'] + expect(tokens[13]).toEqual value: '=', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'keyword.operator.assignment.js'] + expect(tokens[15]).toEqual value: '[', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'meta.brace.square.js'] + expect(tokens[16]).toEqual value: 'a', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js'] + expect(tokens[17]).toEqual value: ',', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'meta.delimiter.object.comma.js'] + expect(tokens[19]).toEqual value: '"', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js'] + expect(tokens[22]).toEqual value: ',', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'meta.delimiter.object.comma.js'] + expect(tokens[24]).toEqual value: '"', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js'] + expect(tokens[28]).toEqual value: ' d', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js'] + expect(tokens[29]).toEqual value: ']', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'meta.brace.square.js'] + expect(tokens[30]).toEqual value: '}', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'meta.brace.curly.js'] + expect(tokens[31]).toEqual value: ')', scopes: ['source.js', 'meta.function.method.definition.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] + + {tokens} = grammar.tokenizeLine('write("){");') + expect(tokens[0]).toEqual value: 'write', scopes: ['source.js', 'meta.function-call.js', 'entity.name.function.js'] + expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] + expect(tokens[2]).toEqual value: '"', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js'] + expect(tokens[3]).toEqual value: '){', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'string.quoted.double.js'] + expect(tokens[4]).toEqual value: '"', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'string.quoted.double.js', 'punctuation.definition.string.end.js'] + expect(tokens[5]).toEqual value: ')', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] + expect(tokens[6]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] + + it "tokenizes named function expressions", -> + {tokens} = grammar.tokenizeLine('var func = function foo(){}') + expect(tokens[0]).toEqual value: 'var', scopes: ['source.js', 'storage.type.var.js'] + expect(tokens[2]).toEqual value: 'func', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] + expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'meta.function.js', 'keyword.operator.assignment.js'] + expect(tokens[6]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] + expect(tokens[8]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] + expect(tokens[9]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] + + it "tokenizes anonymous function expressions", -> + {tokens} = grammar.tokenizeLine('var func = function(){}') expect(tokens[0]).toEqual value: 'var', scopes: ['source.js', 'storage.type.var.js'] expect(tokens[2]).toEqual value: 'func', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'meta.function.js', 'keyword.operator.assignment.js'] expect(tokens[6]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] - expect(tokens[8]).toEqual value: 'nonAnonymous', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] - expect(tokens[9]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'punctuation.definition.parameters.begin.js'] + expect(tokens[7]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] - it "tokenizes object functions", -> - {tokens} = grammar.tokenizeLine('foo: function nonAnonymous(') - expect(tokens[0]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.json.js', 'entity.name.function.js'] + it "tokenizes functions in object literals", -> + {tokens} = grammar.tokenizeLine('func: function foo(') + expect(tokens[0]).toEqual value: 'func', scopes: ['source.js', 'meta.function.json.js', 'entity.name.function.js'] expect(tokens[1]).toEqual value: ':', scopes: ['source.js', 'meta.function.json.js', 'keyword.operator.assignment.js'] expect(tokens[3]).toEqual value: 'function', scopes: ['source.js', 'meta.function.json.js', 'storage.type.function.js'] - expect(tokens[5]).toEqual value: 'nonAnonymous', scopes: ['source.js', 'meta.function.json.js', 'entity.name.function.js'] - expect(tokens[6]).toEqual value: '(', scopes: ['source.js', 'meta.function.json.js', 'punctuation.definition.parameters.begin.js'] + expect(tokens[5]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.json.js', 'entity.name.function.js'] + expect(tokens[6]).toEqual value: '(', scopes: ['source.js', 'meta.function.json.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] - it "tokenizes quoted object functions", -> - {tokens} = grammar.tokenizeLine('"foo": function nonAnonymous(') - expect(tokens[1]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.json.js', 'string.quoted.double.js', 'entity.name.function.js'] + {tokens} = grammar.tokenizeLine('"func": function foo(') + expect(tokens[1]).toEqual value: 'func', scopes: ['source.js', 'meta.function.json.js', 'string.quoted.double.js', 'entity.name.function.js'] expect(tokens[3]).toEqual value: ':', scopes: ['source.js', 'meta.function.json.js', 'keyword.operator.assignment.js'] expect(tokens[5]).toEqual value: 'function', scopes: ['source.js', 'meta.function.json.js', 'storage.type.function.js'] - expect(tokens[7]).toEqual value: 'nonAnonymous', scopes: ['source.js', 'meta.function.json.js', 'entity.name.function.js'] - expect(tokens[8]).toEqual value: '(', scopes: ['source.js', 'meta.function.json.js', 'punctuation.definition.parameters.begin.js'] + expect(tokens[7]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.json.js', 'entity.name.function.js'] + expect(tokens[8]).toEqual value: '(', scopes: ['source.js', 'meta.function.json.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] - it "tokenizes async functions", -> - {tokens} = grammar.tokenizeLine('async function f(){}') - expect(tokens[0]).toEqual value: 'async', scopes: ['source.js', 'meta.function.js', 'storage.modifier.js'] - expect(tokens[2]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] - expect(tokens[4]).toEqual value: 'f', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] + it "tokenizes generator functions", -> + {tokens} = grammar.tokenizeLine('function* foo(){}') + expect(tokens[0]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] + expect(tokens[1]).toEqual value: '*', scopes: ['source.js', 'meta.function.js', 'storage.modifier.generator.js'] + expect(tokens[3]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] + expect(tokens[4]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] + expect(tokens[5]).toEqual value: ')', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] + expect(tokens[6]).toEqual value: '{', scopes: ['source.js', 'punctuation.definition.function.body.begin.bracket.curly.js'] + expect(tokens[7]).toEqual value: '}', scopes: ['source.js', 'punctuation.definition.function.body.end.bracket.curly.js'] + + {tokens} = grammar.tokenizeLine('function *foo(){}') + expect(tokens[2]).toEqual value: '*', scopes: ['source.js', 'meta.function.js', 'storage.modifier.generator.js'] + + {tokens} = grammar.tokenizeLine('function *(){}') + expect(tokens[2]).toEqual value: '*', scopes: ['source.js', 'meta.function.js', 'storage.modifier.generator.js'] + + it "tokenizes arrow functions", -> + {tokens} = grammar.tokenizeLine('x => x * x') + expect(tokens[0]).toEqual value: 'x', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'variable.parameter.function.js'] + expect(tokens[2]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] + expect(tokens[3]).toEqual value: ' x ', scopes: ['source.js'] - {tokens} = grammar.tokenizeLine('async f(){}') - expect(tokens[0]).toEqual value: 'async', scopes: ['source.js', 'storage.modifier.js'] - expect(tokens[2]).toEqual value: 'f', scopes: ['source.js', 'meta.method.js', 'entity.name.function.js'] - - it "tokenizes arrow functions with params", -> - {tokens} = grammar.tokenizeLine('(param1,param2)=>{}') - expect(tokens[0]).toEqual value: '(', scopes: ['source.js', 'meta.function.arrow.js', 'punctuation.definition.parameters.begin.js'] - expect(tokens[1]).toEqual value: 'param1', scopes: ['source.js', 'meta.function.arrow.js', 'variable.parameter.function.js'] - expect(tokens[3]).toEqual value: 'param2', scopes: ['source.js', 'meta.function.arrow.js', 'variable.parameter.function.js'] - expect(tokens[4]).toEqual value: ')', scopes: ['source.js', 'meta.function.arrow.js', 'punctuation.definition.parameters.end.js'] - expect(tokens[5]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.arrow.js'] - - it "tokenizes stored arrow functions with params", -> - {tokens} = grammar.tokenizeLine('var func = (param1,param2)=>{}') + {tokens} = grammar.tokenizeLine('() => {}') + expect(tokens[0]).toEqual value: '(', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] + expect(tokens[1]).toEqual value: ')', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] + expect(tokens[3]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] + expect(tokens[5]).toEqual value: '{', scopes: ['source.js', 'punctuation.definition.function.body.begin.bracket.curly.js'] + expect(tokens[6]).toEqual value: '}', scopes: ['source.js', 'punctuation.definition.function.body.end.bracket.curly.js'] + + {tokens} = grammar.tokenizeLine('(p1, p2) => {}') + expect(tokens[0]).toEqual value: '(', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] + expect(tokens[1]).toEqual value: 'p1', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'variable.parameter.function.js'] + expect(tokens[2]).toEqual value: ',', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'meta.delimiter.object.comma.js'] + expect(tokens[4]).toEqual value: 'p2', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'variable.parameter.function.js'] + expect(tokens[5]).toEqual value: ')', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] + expect(tokens[7]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] + expect(tokens[9]).toEqual value: '{', scopes: ['source.js', 'punctuation.definition.function.body.begin.bracket.curly.js'] + expect(tokens[10]).toEqual value: '}', scopes: ['source.js', 'punctuation.definition.function.body.end.bracket.curly.js'] + + lines = grammar.tokenizeLines """ + a = (x, + y) => {} + """ + expect(lines[1][3]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] + + it "tokenizes stored arrow functions", -> + {tokens} = grammar.tokenizeLine('var func = (p1, p2) => {}') expect(tokens[0]).toEqual value: 'var', scopes: ['source.js', 'storage.type.var.js'] expect(tokens[2]).toEqual value: 'func', scopes: ['source.js', 'meta.function.arrow.js', 'entity.name.function.js'] expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'meta.function.arrow.js', 'keyword.operator.assignment.js'] - expect(tokens[7]).toEqual value: 'param1', scopes: ['source.js', 'meta.function.arrow.js', 'variable.parameter.function.js'] - expect(tokens[9]).toEqual value: 'param2', scopes: ['source.js', 'meta.function.arrow.js', 'variable.parameter.function.js'] - expect(tokens[10]).toEqual value: ')', scopes: ['source.js', 'meta.function.arrow.js', 'punctuation.definition.parameters.end.js'] - expect(tokens[11]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.arrow.js'] - - it "tokenizes arrow functions with params stored in object properties", -> - {tokens} = grammar.tokenizeLine('Utils.isEmpty = (param1, param2) => {}') - expect(tokens[0]).toEqual value: 'Utils', scopes: ['source.js', 'meta.function.arrow.js', 'support.class.js'] + expect(tokens[11]).toEqual value: ')', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] + expect(tokens[13]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] + + it "tokenizes arrow functions as object properties", -> + {tokens} = grammar.tokenizeLine('Utils.isEmpty = (p1, p2) => {}') + expect(tokens[0]).toEqual value: 'Utils', scopes: ['source.js', 'variable.other.object.js'] expect(tokens[2]).toEqual value: 'isEmpty', scopes: ['source.js', 'meta.function.arrow.js', 'entity.name.function.js'] expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'meta.function.arrow.js', 'keyword.operator.assignment.js'] - expect(tokens[7]).toEqual value: 'param1', scopes: ['source.js', 'meta.function.arrow.js', 'variable.parameter.function.js'] - expect(tokens[10]).toEqual value: 'param2', scopes: ['source.js', 'meta.function.arrow.js', 'variable.parameter.function.js'] - expect(tokens[11]).toEqual value: ')', scopes: ['source.js', 'meta.function.arrow.js', 'punctuation.definition.parameters.end.js'] - expect(tokens[13]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.arrow.js'] + expect(tokens[11]).toEqual value: ')', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] + expect(tokens[13]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] + + it "tokenizes arrow functions in object literals", -> + {tokens} = grammar.tokenizeLine('foo: param => {}') + expect(tokens[0]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.arrow.json.js', 'entity.name.function.js'] + expect(tokens[1]).toEqual value: ':', scopes: ['source.js', 'meta.function.arrow.json.js', 'keyword.operator.assignment.js'] + expect(tokens[3]).toEqual value: 'param', scopes: ['source.js', 'meta.function.arrow.json.js', 'meta.parameters.js', 'variable.parameter.function.js'] + expect(tokens[5]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.json.js', 'storage.type.function.arrow.js'] + + {tokens} = grammar.tokenizeLine('"foo": param => {}') + expect(tokens[1]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.arrow.json.js', 'string.quoted.double.js', 'entity.name.function.js'] + expect(tokens[3]).toEqual value: ':', scopes: ['source.js', 'meta.function.arrow.json.js', 'keyword.operator.assignment.js'] + expect(tokens[5]).toEqual value: 'param', scopes: ['source.js', 'meta.function.arrow.json.js', 'meta.parameters.js', 'variable.parameter.function.js'] + expect(tokens[7]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.json.js', 'storage.type.function.arrow.js'] + + it "tokenizes default parameters", -> + {tokens} = grammar.tokenizeLine('function multiply(a, b = 1){}') + expect(tokens[7]).toEqual value: 'b', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'variable.parameter.function.js'] + expect(tokens[9]).toEqual value: '=', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'keyword.operator.assignment.js'] + expect(tokens[11]).toEqual value: '1', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'constant.numeric.decimal.js'] + + {tokens} = grammar.tokenizeLine('function callSomething(thing = this.something()) {}') + expect(tokens[4]).toEqual value: 'thing', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'variable.parameter.function.js'] + expect(tokens[6]).toEqual value: '=', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'keyword.operator.assignment.js'] + expect(tokens[8]).toEqual value: 'this', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'variable.language.js'] + expect(tokens[9]).toEqual value: '.', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'meta.method-call.js', 'meta.delimiter.method.period.js'] + expect(tokens[10]).toEqual value: 'something', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'meta.method-call.js', 'entity.name.function.js'] + + it "tokenizes the rest parameter", -> + {tokens} = grammar.tokenizeLine('(...args) => args[0]') + expect(tokens[1]).toEqual value: '...', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'keyword.operator.spread.js'] + expect(tokens[2]).toEqual value: 'args', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'variable.parameter.rest.function.js'] + + it "tokenizes illegal parameters", -> + {tokens} = grammar.tokenizeLine('0abc => {}') + expect(tokens[0]).toEqual value: '0abc', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'invalid.illegal.identifier.js'] + expect(tokens[2]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] + + {tokens} = grammar.tokenizeLine('(0abc) => {}') + expect(tokens[1]).toEqual value: '0abc', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'invalid.illegal.identifier.js'] + expect(tokens[4]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] describe "variables", -> it "tokenizes 'this'", -> @@ -1159,14 +1268,14 @@ describe "Javascript grammar", -> expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] expect(tokens[2]).toEqual value: 'function', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.function.js', 'storage.type.function.js'] expect(tokens[4]).toEqual value: 'b', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.function.js', 'entity.name.function.js'] - expect(tokens[5]).toEqual value: '(', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.function.js', 'punctuation.definition.parameters.begin.js'] - expect(tokens[6]).toEqual value: 'p', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.function.js', 'variable.parameter.function.js'] - expect(tokens[7]).toEqual value: ')', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.function.js', 'punctuation.definition.parameters.end.js'] - expect(tokens[9]).toEqual value: '{', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.brace.curly.js'] + expect(tokens[5]).toEqual value: '(', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.begin.bracket.round.js'] + expect(tokens[6]).toEqual value: 'p', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.function.js', 'meta.parameters.js', 'variable.parameter.function.js'] + expect(tokens[7]).toEqual value: ')', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.function.js', 'meta.parameters.js', 'punctuation.definition.parameters.end.bracket.round.js'] + expect(tokens[9]).toEqual value: '{', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.function.body.begin.bracket.curly.js'] expect(tokens[11]).toEqual value: 'return', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'keyword.control.js'] expect(tokens[12]).toEqual value: ' p', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js'] expect(tokens[13]).toEqual value: ';', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.terminator.statement.js'] - expect(tokens[15]).toEqual value: '}', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'meta.brace.curly.js'] + expect(tokens[15]).toEqual value: '}', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.function.body.end.bracket.curly.js'] expect(tokens[16]).toEqual value: ')', scopes: ['source.js', 'meta.function-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] describe "method calls", -> @@ -1298,15 +1407,6 @@ describe "Javascript grammar", -> expect(tokens[8]).toEqual value: "'", scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'string.quoted.single.js', 'punctuation.definition.string.end.js'] expect(tokens[9]).toEqual value: ")", scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] - {tokens} = grammar.tokenizeLine('write("){");') - expect(tokens[0]).toEqual value: 'write', scopes: ['source.js', 'meta.method.js', 'entity.name.function.js'] - expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.method.js', 'punctuation.definition.parameters.begin.js'] - expect(tokens[2]).toEqual value: '"', scopes: ['source.js', 'meta.method.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js'] - expect(tokens[3]).toEqual value: '){', scopes: ['source.js', 'meta.method.js', 'string.quoted.double.js'] - expect(tokens[4]).toEqual value: '"', scopes: ['source.js', 'meta.method.js', 'string.quoted.double.js', 'punctuation.definition.string.end.js'] - expect(tokens[5]).toEqual value: ')', scopes: ['source.js', 'meta.method.js', 'punctuation.definition.parameters.end.js'] - expect(tokens[6]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] - delimsByScope = "string.quoted.double.js": '"' "string.quoted.single.js": "'" @@ -1366,37 +1466,56 @@ describe "Javascript grammar", -> expect(tokens[5]).toEqual value: '//', scopes: ['source.js', 'comment.line.double-slash.js', 'punctuation.definition.comment.js'] expect(tokens[6]).toEqual value: ' comment', scopes: ['source.js', 'comment.line.double-slash.js'] - it "tokenizes comments inside function parameters correctly", -> - {tokens} = grammar.tokenizeLine('function test(arg1 /*, arg2 */) {}') + it "tokenizes comments inside function declarations", -> + {tokens} = grammar.tokenizeLine('function /* */ foo() /* */ {}') expect(tokens[0]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] - expect(tokens[1]).toEqual value: ' ', scopes: ['source.js', 'meta.function.js'] - expect(tokens[2]).toEqual value: 'test', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] - expect(tokens[3]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'punctuation.definition.parameters.begin.js'] - expect(tokens[4]).toEqual value: 'arg1', scopes: ['source.js', 'meta.function.js', 'variable.parameter.function.js'] - expect(tokens[5]).toEqual value: ' ', scopes: ['source.js', 'meta.function.js'] - expect(tokens[6]).toEqual value: '/*', scopes: ['source.js', 'meta.function.js', 'comment.block.js', 'punctuation.definition.comment.js'] - expect(tokens[7]).toEqual value: ', arg2 ', scopes: ['source.js', 'meta.function.js', 'comment.block.js'] - expect(tokens[8]).toEqual value: '*/', scopes: ['source.js', 'meta.function.js', 'comment.block.js', 'punctuation.definition.comment.js'] - expect(tokens[9]).toEqual value: ')', scopes: ['source.js', 'meta.function.js', 'punctuation.definition.parameters.end.js'] - expect(tokens[10]).toEqual value: ' ', scopes: ['source.js'] - expect(tokens[11]).toEqual value: '{', scopes: ['source.js', 'punctuation.section.scope.begin.js'] - expect(tokens[12]).toEqual value: '}', scopes: ['source.js', 'punctuation.section.scope.end.js'] - - {tokens} = grammar.tokenizeLine('foo: function (/**Bar*/bar){') - expect(tokens[5]).toEqual value: '(', scopes: ['source.js', 'meta.function.json.js', 'punctuation.definition.parameters.begin.js'] - expect(tokens[6]).toEqual value: '/**', scopes: ['source.js', 'meta.function.json.js', 'comment.block.documentation.js', 'punctuation.definition.comment.js'] - expect(tokens[7]).toEqual value: 'Bar', scopes: ['source.js', 'meta.function.json.js', 'comment.block.documentation.js'] - expect(tokens[8]).toEqual value: '*/', scopes: ['source.js', 'meta.function.json.js', 'comment.block.documentation.js', 'punctuation.definition.comment.js'] - expect(tokens[9]).toEqual value: 'bar', scopes: ['source.js', 'meta.function.json.js', 'variable.parameter.function.js'] - - {tokens} = grammar.tokenizeLine('function test(bar, // comment') - expect(tokens[0]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] - expect(tokens[2]).toEqual value: 'test', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] - expect(tokens[3]).toEqual value: '(', scopes: ['source.js', 'meta.function.js', 'punctuation.definition.parameters.begin.js'] - expect(tokens[4]).toEqual value: 'bar', scopes: ['source.js', 'meta.function.js', 'variable.parameter.function.js'] - expect(tokens[5]).toEqual value: ',', scopes: ['source.js', 'meta.function.js', 'meta.object.delimiter.js'] - expect(tokens[7]).toEqual value: '//', scopes: ['source.js', 'meta.function.js', 'comment.line.double-slash.js', 'punctuation.definition.comment.js'] - expect(tokens[8]).toEqual value: ' comment', scopes: ['source.js', 'meta.function.js', 'comment.line.double-slash.js'] + expect(tokens[2]).toEqual value: '/*', scopes: ['source.js', 'meta.function.js', 'comment.block.js', 'punctuation.definition.comment.js'] + expect(tokens[4]).toEqual value: '*/', scopes: ['source.js', 'meta.function.js', 'comment.block.js', 'punctuation.definition.comment.js'] + expect(tokens[6]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] + expect(tokens[10]).toEqual value: '/*', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] + expect(tokens[12]).toEqual value: '*/', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] + + {tokens} = grammar.tokenizeLine('x => /* */ {}') + expect(tokens[0]).toEqual value: 'x', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'variable.parameter.function.js'] + expect(tokens[2]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] + expect(tokens[4]).toEqual value: '/*', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] + expect(tokens[6]).toEqual value: '*/', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] + expect(tokens[8]).toEqual value: '{', scopes: ['source.js', 'punctuation.definition.function.body.begin.bracket.curly.js'] + + {tokens} = grammar.tokenizeLine('.foo = x => /* */ {}') + expect(tokens[1]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.arrow.js', 'entity.name.function.js'] + expect(tokens[5]).toEqual value: 'x', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'variable.parameter.function.js'] + expect(tokens[7]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] + expect(tokens[9]).toEqual value: '/*', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] + expect(tokens[11]).toEqual value: '*/', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] + expect(tokens[13]).toEqual value: '{', scopes: ['source.js', 'punctuation.definition.function.body.begin.bracket.curly.js'] + + lines = grammar.tokenizeLines ''' + function + // comment + foo() {} + ''' + expect(lines[0][0]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] + expect(lines[1][0]).toEqual value: '//', scopes: ['source.js', 'meta.function.js', 'comment.line.double-slash.js', 'punctuation.definition.comment.js'] + expect(lines[1][1]).toEqual value: ' comment', scopes: ['source.js', 'meta.function.js', 'comment.line.double-slash.js'] + expect(lines[2][0]).toEqual value: 'foo', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] + + lines = grammar.tokenizeLines ''' + x => + // comment + {} + ''' + expect(lines[0][0]).toEqual value: 'x', scopes: ['source.js', 'meta.function.arrow.js', 'meta.parameters.js', 'variable.parameter.function.js'] + expect(lines[0][2]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.function.arrow.js'] + expect(lines[1][1]).toEqual value: '//', scopes: ['source.js', 'comment.line.double-slash.js', 'punctuation.definition.comment.js'] + expect(lines[1][2]).toEqual value: ' comment', scopes: ['source.js', 'comment.line.double-slash.js'] + expect(lines[2][0]).toEqual value: '{', scopes: ['source.js', 'punctuation.definition.function.body.begin.bracket.curly.js'] + + it "tokenizes comments inside function parameters correctly", -> + {tokens} = grammar.tokenizeLine('function test(p1 /*, p2 */) {}') + expect(tokens[6]).toEqual value: '/*', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'comment.block.js', 'punctuation.definition.comment.js'] + expect(tokens[7]).toEqual value: ', p2 ', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'comment.block.js'] + expect(tokens[8]).toEqual value: '*/', scopes: ['source.js', 'meta.function.js', 'meta.parameters.js', 'comment.block.js', 'punctuation.definition.comment.js'] describe "console", -> it "tokenizes the console keyword", ->