diff --git a/.travis.yml b/.travis.yml index 31be69d1..a6b772f1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -6,3 +6,7 @@ notifications: on_failure: change script: 'curl -s https://raw.githubusercontent.com/atom/ci/master/build-package.sh | sh' + +branches: + only: + - master diff --git a/grammars/javascript.cson b/grammars/javascript.cson index 485d0fb6..10e280b8 100644 --- a/grammars/javascript.cson +++ b/grammars/javascript.cson @@ -258,6 +258,81 @@ } ] } + { +<<<<<<< HEAD + 'begin': '^\\s*(?=@\\s*[A-Za-z_][A-Za-z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z_0-9]*)*\\s*\\()' + 'end': '(\\))' + 'endCaptures': + '1': + 'name': 'punctuation.definition.arguments.end.js' + 'name': 'meta.function.decorator.js' + 'patterns': [ + { + 'begin': '(?=(@)\\s*[A-Za-z_][A-Za-z0-9_]*(?:\\.[A-Za-z_][A-Za-z0-9_]*)*\\s*\\()' + 'beginCaptures': + '1': + 'name': 'punctuation.definition.decorator.js' + 'contentName': 'entity.name.function.decorator.js' + 'end': '(?=\\s*\\()' + } + { + 'begin': '(\\()' + 'beginCaptures': + '1': + 'name': 'punctuation.definition.arguments.begin.js' + 'contentName': 'meta.function.decorator.arguments.js' + 'end': '(?=\\))' + 'patterns': [ + { + 'include': '#function-params' + } + { + 'include': '#comments' + } + { + 'include': '$self' + } + ] + } + ] + } + { + 'begin': '^\\s*(?=@\\s*[A-Za-z_][A-Za-z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z_0-9]*)*)' + 'contentName': 'entity.name.function.annotation.js' + 'end': '(?=\\s|$\\n?|//)' + 'name': 'meta.function.annotation.js' + 'patterns': [ + { + 'begin': '(?=(@)\\s*[A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)*)' + 'beginCaptures': + '1': + 'name': 'punctuation.definition.annotation.js' + 'end': '(?=\\s|$\\n?|//)' + 'patterns': [ + { + 'include': '#comments' + } + ] + } + ] + } + { + 'begin': '\\b(constructor)\\s*(\\()' + 'beginCaptures': + '1': + 'name': 'entity.name.constructor.js' + '2': + 'name': 'punctuation.definition.parameters.begin.js' + 'end': '(\\))' + 'endCaptures': + '1': + 'name': 'punctuation.definition.parameters.end.js' + 'patterns': [ + { + 'include': '#function-params' + } + ] + } { 'include': '#methods' } @@ -315,8 +390,7 @@ 'name': 'support.function.js.console' } { - 'match': '\\b((0(x|X)[0-9a-fA-F]+)|(0(b|B)[01]+)|(0(o|O)[0-7]+)|([0-9]+(\\.[0-9]+)?)((e|E)[+-]?[0-9]+)?)\\b' - 'name': 'constant.numeric.js' + 'include': '#numbers' } { 'include': '#strings' @@ -363,14 +437,16 @@ 'name': 'storage.modifier.js' } { - 'begin': '(? {tokens} = grammar.tokenizeLine('with') expect(tokens[0]).toEqual value: 'with', scopes: ['source.js', 'keyword.control.js'] - describe "built-in globals", -> it "tokenizes them as support classes", -> {tokens} = grammar.tokenizeLine('window') @@ -95,30 +94,41 @@ describe "Javascript grammar", -> expect(tokens[6]).toEqual value: '/', scopes: ['source.js', 'string.regexp.js', 'punctuation.definition.string.end.js'] expect(tokens[7]).toEqual value: ']', scopes: ['source.js', 'meta.brace.square.js'] + it "verifies that regular expressions have explicit count modifiers", -> + source = fs.readFileSync(path.resolve(__dirname, '..', 'grammars', 'javascript.cson'), 'utf8') + expect(source.search /{,/).toEqual -1 + + source = fs.readFileSync(path.resolve(__dirname, '..', 'grammars', 'regular expressions (javascript).cson'), 'utf8') + expect(source.search /{,/).toEqual -1 + + describe "numbers", -> + it "tokenizes hexadecimals", -> {tokens} = grammar.tokenizeLine('0x1D306') expect(tokens[0]).toEqual value: '0x1D306', scopes: ['source.js', 'constant.numeric.js'] {tokens} = grammar.tokenizeLine('0X1D306') expect(tokens[0]).toEqual value: '0X1D306', scopes: ['source.js', 'constant.numeric.js'] + it "tokenizes binary literals", -> {tokens} = grammar.tokenizeLine('0b011101110111010001100110') expect(tokens[0]).toEqual value: '0b011101110111010001100110', scopes: ['source.js', 'constant.numeric.js'] {tokens} = grammar.tokenizeLine('0B011101110111010001100110') expect(tokens[0]).toEqual value: '0B011101110111010001100110', scopes: ['source.js', 'constant.numeric.js'] + it "tokenizes octal literals", -> {tokens} = grammar.tokenizeLine('0o1411') expect(tokens[0]).toEqual value: '0o1411', scopes: ['source.js', 'constant.numeric.js'] {tokens} = grammar.tokenizeLine('0O1411') expect(tokens[0]).toEqual value: '0O1411', scopes: ['source.js', 'constant.numeric.js'] - it "verifies that regular expressions have explicit count modifiers", -> - source = fs.readFileSync(path.resolve(__dirname, '..', 'grammars', 'javascript.cson'), 'utf8') - expect(source.search /{,/).toEqual -1 + it "tokenizes decimals", -> + {tokens} = grammar.tokenizeLine('5e-10') + expect(tokens[0]).toEqual value: '5e-10', scopes: ['source.js', 'constant.numeric.js'] - source = fs.readFileSync(path.resolve(__dirname, '..', 'grammars', 'regular expressions (javascript).cson'), 'utf8') - expect(source.search /{,/).toEqual -1 + {tokens} = grammar.tokenizeLine('-5E+5') + expect(tokens[0]).toEqual value: '-5E+5', scopes: ['source.js', 'constant.numeric.js'] describe "operators", -> it "tokenizes void correctly", -> @@ -130,7 +140,6 @@ describe "Javascript grammar", -> 1 / 2 """ - expect(lines[0][0]).toEqual value: '1', scopes: ['source.js', 'constant.numeric.js'] expect(lines[1][0]).toEqual value: '/ ', scopes: ['source.js'] expect(lines[1][1]).toEqual value: '2', scopes: ['source.js', 'constant.numeric.js'] @@ -212,6 +221,32 @@ describe "Javascript grammar", -> expect(tokens[6]).toEqual value: '42', scopes: ['source.js', 'constant.numeric.js'] expect(tokens[7]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] + lines = grammar.tokenizeLines """ + const a, + b, + c + if(a) + """ + expect(lines[0][0]).toEqual value: 'const', scopes: ['source.js', 'storage.modifier.js'] + expect(lines[0][1]).toEqual value: ' ', scopes: ['source.js'] + expect(lines[0][2]).toEqual value: 'a', scopes: ['source.js', 'constant.other.js'] + expect(lines[0][3]).toEqual value: ',', scopes: ['source.js', 'meta.delimiter.object.comma.js'] + expect(lines[1][0]).toEqual value: 'b', scopes: ['source.js', 'constant.other.js'] + expect(lines[1][1]).toEqual value: ',', scopes: ['source.js', 'meta.delimiter.object.comma.js'] + expect(lines[2][0]).toEqual value: 'c', scopes: ['source.js', 'constant.other.js'] + expect(lines[3][0]).toEqual value: 'if', scopes: ['source.js', 'keyword.control.js'] + expect(lines[3][1]).toEqual value: '(', scopes: ['source.js', 'meta.brace.round.js'] + expect(lines[3][2]).toEqual value: 'a', scopes: ['source.js'] + expect(lines[3][3]).toEqual value: ')', scopes: ['source.js', 'meta.brace.round.js'] + + {tokens} = grammar.tokenizeLine('(const hi);') + expect(tokens[0]).toEqual value: '(', scopes: ['source.js', 'meta.brace.round.js'] + expect(tokens[1]).toEqual value: 'const', scopes: ['source.js', 'storage.modifier.js'] + expect(tokens[2]).toEqual value: ' ', scopes: ['source.js'] + expect(tokens[3]).toEqual value: 'hi', scopes: ['source.js', 'constant.other.js'] + expect(tokens[4]).toEqual value: ')', scopes: ['source.js', 'meta.brace.round.js'] + expect(tokens[5]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] + {tokens} = grammar.tokenizeLine('const {first:f,second,...rest} = obj;') expect(tokens[0]).toEqual value: 'const', scopes: ['source.js', 'storage.modifier.js'] expect(tokens[1]).toEqual value: ' ', scopes: ['source.js'] @@ -242,6 +277,25 @@ describe "Javascript grammar", -> expect(tokens[8]).toEqual value: '/', scopes: ['source.js', 'string.regexp.js', 'punctuation.definition.string.end.js'] expect(tokens[9]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] + it "tokenizes variables declared with `const` in for-in and for-of loops", -> + {tokens} = grammar.tokenizeLine 'for (const elem of array) {' + expect(tokens[0]).toEqual value: 'for', scopes: ['source.js', 'keyword.control.js'] + expect(tokens[1]).toEqual value: ' ', scopes: ['source.js'] + expect(tokens[2]).toEqual value: '(', scopes: ['source.js', 'meta.brace.round.js'] + expect(tokens[3]).toEqual value: 'const', scopes: ['source.js', 'storage.modifier.js'] + expect(tokens[4]).toEqual value: ' ', scopes: ['source.js'] + expect(tokens[5]).toEqual value: 'elem', scopes: ['source.js', 'constant.other.js'] + expect(tokens[6]).toEqual value: ' ', scopes: ['source.js'] + expect(tokens[7]).toEqual value: 'of', scopes: ['source.js', 'keyword.operator.js'] + expect(tokens[8]).toEqual value: ' array', scopes: ['source.js'] + expect(tokens[9]).toEqual value: ')', scopes: ['source.js', 'meta.brace.round.js'] + + {tokens} = grammar.tokenizeLine 'for (const name in object) {' + expect(tokens[5]).toEqual value: 'name', scopes: ['source.js', 'constant.other.js'] + expect(tokens[6]).toEqual value: ' ', scopes: ['source.js'] + expect(tokens[7]).toEqual value: 'in', scopes: ['source.js', 'keyword.operator.js'] + expect(tokens[8]).toEqual value: ' object', scopes: ['source.js'] + it "tokenizes support constants", -> {tokens} = grammar.tokenizeLine('awesome = cool.systemLanguage;') expect(tokens[0]).toEqual value: 'awesome ', scopes: ['source.js'] @@ -280,13 +334,23 @@ describe "Javascript grammar", -> expect(tokens[2]).toEqual value: 'extends', scopes: ['source.js', 'meta.class.js', 'storage.modifier.js'] expect(tokens[4]).toEqual value: 'SomeClass', scopes: ['source.js', 'meta.class.js', 'entity.name.type.js'] + it "tokenizes constructors", -> + {tokens} = grammar.tokenizeLine('constructor(a, b)') + expect(tokens[0]).toEqual value: 'constructor', scopes: ['source.js', 'entity.name.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'] + describe "ES6 import", -> - it "Tokenizes import ... as", -> + it "tokenizes import ... as", -> {tokens} = grammar.tokenizeLine('import \'react\' as React') expect(tokens[0]).toEqual value: 'import', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] expect(tokens[6]).toEqual value: 'as', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] - it "Tokenizes import ... from", -> + it "tokenizes import ... from", -> {tokens} = grammar.tokenizeLine('import React from \'react\'') expect(tokens[0]).toEqual value: 'import', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] expect(tokens[4]).toEqual value: 'from', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] @@ -295,18 +359,17 @@ describe "Javascript grammar", -> expect(tokens[6]).toEqual value: 'from', scopes: ['source.js', 'meta.import.js', 'keyword.control.js'] describe "ES6 yield", -> - it "Tokenizes yield", -> + it "tokenizes yield", -> {tokens} = grammar.tokenizeLine('yield next') expect(tokens[0]).toEqual value: 'yield', scopes: ['source.js', 'meta.control.yield.js', 'keyword.control.js'] - it "Tokenizes yield*", -> + it "tokenizes yield*", -> {tokens} = grammar.tokenizeLine('yield * next') expect(tokens[0]).toEqual value: 'yield', scopes: ['source.js', 'meta.control.yield.js', 'keyword.control.js'] expect(tokens[2]).toEqual value: '*', scopes: ['source.js', 'meta.control.yield.js', 'storage.modifier.js'] it "doesn't confuse strings and functions", -> {tokens} = grammar.tokenizeLine("'a'.b(':c(d)')") - expect(tokens[0]).toEqual value: "'", scopes: ['source.js', 'string.quoted.single.js', 'punctuation.definition.string.begin.js'] expect(tokens[1]).toEqual value: "a", scopes: ['source.js', 'string.quoted.single.js'] expect(tokens[2]).toEqual value: "'", scopes: ['source.js', 'string.quoted.single.js', 'punctuation.definition.string.end.js'] @@ -332,27 +395,9 @@ describe "Javascript grammar", -> {tokens} = grammar.tokenizeLine('default: ') expect(tokens[0]).toEqual value: 'default', scopes: ['source.js', 'keyword.control.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 comments in function params", -> - {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'] - describe "non-anonymous functions", -> 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'] 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.js'] @@ -365,12 +410,37 @@ describe "Javascript grammar", -> 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[4]).toEqual value: 'b', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js'] - expect(tokens[5]).toEqual value: ')', scopes: ['source.js', 'meta.method.js', 'punctuation.definition.parameters.end.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'] + + {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.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.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: 'var', scopes: ['source.js', 'storage.modifier.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.js'] @@ -380,7 +450,6 @@ describe "Javascript grammar", -> 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'] expect(tokens[1]).toEqual value: ':', scopes: ['source.js', 'meta.function.json.js', 'keyword.operator.js'] expect(tokens[3]).toEqual value: 'function', scopes: ['source.js', 'meta.function.json.js', 'storage.type.function.js'] @@ -389,7 +458,6 @@ describe "Javascript grammar", -> 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'] expect(tokens[3]).toEqual value: ':', scopes: ['source.js', 'meta.function.json.js', 'keyword.operator.js'] expect(tokens[5]).toEqual value: 'function', scopes: ['source.js', 'meta.function.json.js', 'storage.type.function.js'] @@ -402,53 +470,75 @@ describe "Javascript grammar", -> 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 /* */ comments", -> - {tokens} = grammar.tokenizeLine('/**/') - - expect(tokens[0]).toEqual value: '/*', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] - expect(tokens[1]).toEqual value: '*/', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] - - {tokens} = grammar.tokenizeLine('/* foo */') - - expect(tokens[0]).toEqual value: '/*', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] - expect(tokens[1]).toEqual value: ' foo ', scopes: ['source.js', 'comment.block.js'] - expect(tokens[2]).toEqual value: '*/', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] - - it "tokenizes /** */ comments", -> - {tokens} = grammar.tokenizeLine('/***/') - - expect(tokens[0]).toEqual value: '/**', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.definition.comment.js'] - expect(tokens[1]).toEqual value: '*/', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.definition.comment.js'] - - {tokens} = grammar.tokenizeLine('/** foo */') - - expect(tokens[0]).toEqual value: '/**', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.definition.comment.js'] - expect(tokens[1]).toEqual value: ' foo ', scopes: ['source.js', 'comment.block.documentation.js'] - expect(tokens[2]).toEqual value: '*/', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.definition.comment.js'] - - {tokens} = grammar.tokenizeLine('/** @mixins */') - - expect(tokens[0]).toEqual value: '/**', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.definition.comment.js'] - expect(tokens[2]).toEqual value: '@mixins', scopes: ['source.js', 'comment.block.documentation.js', 'storage.type.class.jsdoc'] - expect(tokens[3]).toEqual value: ' ', scopes: ['source.js', 'comment.block.documentation.js'] - expect(tokens[4]).toEqual value: '*/', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.definition.comment.js'] - - it "tokenizes comments inside function parameters correctly", -> - {tokens} = grammar.tokenizeLine('function test(arg1 /*, arg2 */) {}') - - 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'] + 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'] + + describe "decorators and annotations", -> + it "tokenizes decorators", -> + {tokens} = grammar.tokenizeLine('@thisIsADecorator(true)') + expect(tokens[0]).toEqual value: '@thisIsADecorator', scopes: ['source.js', 'meta.function.decorator.js', 'entity.name.function.decorator.js'] + expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.function.decorator.js', 'punctuation.definition.arguments.begin.js'] + expect(tokens[2]).toEqual value: 'true', scopes: ['source.js', 'meta.function.decorator.js', 'meta.function.decorator.arguments.js', 'variable.parameter.function.js'] + expect(tokens[3]).toEqual value: ')', scopes: ['source.js', 'meta.function.decorator.js', 'punctuation.definition.arguments.end.js'] + + it "tokenizes annotations", -> + {tokens} = grammar.tokenizeLine('@thisIsAnAnnotation') + expect(tokens[0]).toEqual value: '@thisIsAnAnnotation', scopes: ['source.js', 'meta.function.annotation.js', 'entity.name.function.annotation.js'] + + describe "comments", -> + it "tokenizes /* */ comments", -> + {tokens} = grammar.tokenizeLine('/**/') + expect(tokens[0]).toEqual value: '/*', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] + expect(tokens[1]).toEqual value: '*/', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] + + {tokens} = grammar.tokenizeLine('/* foo */') + expect(tokens[0]).toEqual value: '/*', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] + expect(tokens[1]).toEqual value: ' foo ', scopes: ['source.js', 'comment.block.js'] + expect(tokens[2]).toEqual value: '*/', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js'] + + it "tokenizes /** */ comments", -> + {tokens} = grammar.tokenizeLine('/***/') + expect(tokens[0]).toEqual value: '/**', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.definition.comment.js'] + expect(tokens[1]).toEqual value: '*/', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.definition.comment.js'] + + {tokens} = grammar.tokenizeLine('/** foo */') + expect(tokens[0]).toEqual value: '/**', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.definition.comment.js'] + expect(tokens[1]).toEqual value: ' foo ', scopes: ['source.js', 'comment.block.documentation.js'] + expect(tokens[2]).toEqual value: '*/', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.definition.comment.js'] + + {tokens} = grammar.tokenizeLine('/** @mixins */') + expect(tokens[0]).toEqual value: '/**', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.definition.comment.js'] + expect(tokens[2]).toEqual value: '@mixins', scopes: ['source.js', 'comment.block.documentation.js', 'storage.type.class.jsdoc'] + expect(tokens[3]).toEqual value: ' ', scopes: ['source.js', 'comment.block.documentation.js'] + expect(tokens[4]).toEqual value: '*/', scopes: ['source.js', 'comment.block.documentation.js', 'punctuation.definition.comment.js'] + + it "tokenizes comments inside function parameters correctly", -> + {tokens} = grammar.tokenizeLine('function test(arg1 /*, arg2 */) {}') + 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'] describe "indentation", -> editor = null