From 889a1ab3cbc783f9f13b240af0a701d284d77a75 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Wed, 23 Sep 2015 19:55:16 +0300 Subject: [PATCH 01/18] :art: Cleanup operators specs --- spec/javascript-spec.coffee | 80 ++++++++++++++----------------------- 1 file changed, 30 insertions(+), 50 deletions(-) diff --git a/spec/javascript-spec.coffee b/spec/javascript-spec.coffee index 7d9e5bc8..68e3745f 100644 --- a/spec/javascript-spec.coffee +++ b/spec/javascript-spec.coffee @@ -196,65 +196,45 @@ describe "Javascript grammar", -> expect(tokens[0]).toEqual value: '5E+5', scopes: ['source.js', 'constant.numeric.js'] describe "operators", -> - it "tokenizes void correctly", -> + it "tokenizes void", -> {tokens} = grammar.tokenizeLine('void') expect(tokens[0]).toEqual value: 'void', scopes: ['source.js', 'keyword.operator.js'] - it "tokenizes the / arithmetic operator when separated by newlines", -> - lines = grammar.tokenizeLines """ - 1 - / 2 - """ - expect(lines[0][0]).toEqual value: '1', scopes: ['source.js', 'constant.numeric.js'] - expect(lines[1][0]).toEqual value: '/', scopes: ['source.js', 'keyword.operator.js'] - expect(lines[1][1]).toEqual value: ' ', scopes: ['source.js'] - expect(lines[1][2]).toEqual value: '2', scopes: ['source.js', 'constant.numeric.js'] - - it "tokenizes = correctly", -> - {tokens} = grammar.tokenizeLine('test = 2') - expect(tokens[0]).toEqual value: 'test ', scopes: ['source.js'] - expect(tokens[1]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.js'] - expect(tokens[2]).toEqual value: ' ', scopes: ['source.js'] - expect(tokens[3]).toEqual value: '2', scopes: ['source.js', 'constant.numeric.js'] - - it "tokenizes single operators correctly", -> + describe "arithmetic", -> operators = ["*", "/", "+", "-", "%"] - for operator in operators - {tokens} = grammar.tokenizeLine('test ' + operator + ' 2') - expect(tokens[0]).toEqual value: 'test ', scopes: ['source.js'] - expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.js'] - expect(tokens[2]).toEqual value: ' ', scopes: ['source.js'] - expect(tokens[3]).toEqual value: '2', scopes: ['source.js', 'constant.numeric.js'] - - describe "operators with 2 characters", -> - it "tokenizes += correctly", -> - {tokens} = grammar.tokenizeLine('test += 2') - expect(tokens[0]).toEqual value: 'test ', scopes: ['source.js'] - expect(tokens[1]).toEqual value: '+=', scopes: ['source.js', 'keyword.operator.js'] - expect(tokens[2]).toEqual value: ' ', scopes: ['source.js'] - expect(tokens[3]).toEqual value: '2', scopes: ['source.js', 'constant.numeric.js'] - - it "tokenizes -= correctly", -> - {tokens} = grammar.tokenizeLine('test -= 2') - expect(tokens[0]).toEqual value: 'test ', scopes: ['source.js'] - expect(tokens[1]).toEqual value: '-=', scopes: ['source.js', 'keyword.operator.js'] - expect(tokens[2]).toEqual value: ' ', scopes: ['source.js'] - expect(tokens[3]).toEqual value: '2', scopes: ['source.js', 'constant.numeric.js'] - - it "tokenizes *= correctly", -> - {tokens} = grammar.tokenizeLine('test *= 2') + it "tokenizes arithmetic operators", -> + for operator in operators + {tokens} = grammar.tokenizeLine('test ' + operator + ' 2') + expect(tokens[0]).toEqual value: 'test ', scopes: ['source.js'] + expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.js'] + expect(tokens[3]).toEqual value: '2', scopes: ['source.js', 'constant.numeric.js'] + + it "tokenizes the / arithmetic operator when separated by newlines", -> + lines = grammar.tokenizeLines """ + 1 + / 2 + """ + expect(lines[0][0]).toEqual value: '1', scopes: ['source.js', 'constant.numeric.js'] + expect(lines[1][0]).toEqual value: '/', scopes: ['source.js', 'keyword.operator.js'] + expect(lines[1][2]).toEqual value: '2', scopes: ['source.js', 'constant.numeric.js'] + + describe "assignment", -> + it "tokenizes '=' operator", -> + {tokens} = grammar.tokenizeLine('test = 2') expect(tokens[0]).toEqual value: 'test ', scopes: ['source.js'] - expect(tokens[1]).toEqual value: '*=', scopes: ['source.js', 'keyword.operator.js'] + expect(tokens[1]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.js'] expect(tokens[2]).toEqual value: ' ', scopes: ['source.js'] expect(tokens[3]).toEqual value: '2', scopes: ['source.js', 'constant.numeric.js'] - it "tokenizes /= correctly", -> - {tokens} = grammar.tokenizeLine('test /= 2') - expect(tokens[0]).toEqual value: 'test ', scopes: ['source.js'] - expect(tokens[1]).toEqual value: '/=', scopes: ['source.js', 'keyword.operator.js'] - expect(tokens[2]).toEqual value: ' ', scopes: ['source.js'] - expect(tokens[3]).toEqual value: '2', scopes: ['source.js', 'constant.numeric.js'] + describe "augmented", -> + operators = ["+=", "-=", "*=", "/="] + it "tokenizes augmented assignment operators", -> + for operator in operators + {tokens} = grammar.tokenizeLine('test ' + operator + ' 2') + expect(tokens[0]).toEqual value: 'test ', scopes: ['source.js'] + expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.js'] + expect(tokens[3]).toEqual value: '2', scopes: ['source.js', 'constant.numeric.js'] describe "constants", -> it "tokenizes ALL_CAPS variables as constants", -> From c4f89047a95d9bc7ec7ffc3dbd855916885203a4 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Thu, 17 Sep 2015 19:06:08 +0300 Subject: [PATCH 02/18] :white_check_mark: Test all arithmetic operators on newlines --- spec/javascript-spec.coffee | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/spec/javascript-spec.coffee b/spec/javascript-spec.coffee index 68e3745f..4623c1b9 100644 --- a/spec/javascript-spec.coffee +++ b/spec/javascript-spec.coffee @@ -210,14 +210,12 @@ describe "Javascript grammar", -> expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.js'] expect(tokens[3]).toEqual value: '2', scopes: ['source.js', 'constant.numeric.js'] - it "tokenizes the / arithmetic operator when separated by newlines", -> - lines = grammar.tokenizeLines """ - 1 - / 2 - """ - expect(lines[0][0]).toEqual value: '1', scopes: ['source.js', 'constant.numeric.js'] - expect(lines[1][0]).toEqual value: '/', scopes: ['source.js', 'keyword.operator.js'] - expect(lines[1][2]).toEqual value: '2', scopes: ['source.js', 'constant.numeric.js'] + it "tokenizes the arithmetic operators when separated by newlines", -> + for operator in operators + lines = grammar.tokenizeLines '1\n' + operator + ' 2' + expect(lines[0][0]).toEqual value: '1', scopes: ['source.js', 'constant.numeric.js'] + expect(lines[1][0]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.js'] + expect(lines[1][2]).toEqual value: '2', scopes: ['source.js', 'constant.numeric.js'] describe "assignment", -> it "tokenizes '=' operator", -> From 26d230a78464402e1f966902498702cca54a3dad Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Fri, 23 Oct 2015 13:44:34 +0300 Subject: [PATCH 03/18] :white_check_mark: Test arithmetic operators --- grammars/javascript.cson | 6 +++++- spec/javascript-spec.coffee | 8 ++++---- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/grammars/javascript.cson b/grammars/javascript.cson index 647ec3ce..e62a8b7b 100644 --- a/grammars/javascript.cson +++ b/grammars/javascript.cson @@ -857,10 +857,14 @@ 'operators': 'patterns': [ { - 'match': '!=|!==|<=|>=|<<=|>>=|>>>=|\\*=|(?|<|>|!|&&|\\|\\||\\?|\\:|\\^' + 'match': '!=|!==|<=|>=|<<=|>>=|>>>=|\\*=|(?|<|>|!|&&|\\|\\||\\?|\\:|\\^' 'comment': 'match 2-character operator first' 'name': 'keyword.operator.js' } + { + 'match': '%|\\*|/|\\-|\\+' + 'name': 'keyword.operator.js' + } ] 'strings': 'patterns': [ diff --git a/spec/javascript-spec.coffee b/spec/javascript-spec.coffee index 4623c1b9..791ee4dd 100644 --- a/spec/javascript-spec.coffee +++ b/spec/javascript-spec.coffee @@ -201,14 +201,14 @@ describe "Javascript grammar", -> expect(tokens[0]).toEqual value: 'void', scopes: ['source.js', 'keyword.operator.js'] describe "arithmetic", -> - operators = ["*", "/", "+", "-", "%"] + operators = ["*", "/", "-", "%", "+"] it "tokenizes arithmetic operators", -> for operator in operators - {tokens} = grammar.tokenizeLine('test ' + operator + ' 2') - expect(tokens[0]).toEqual value: 'test ', scopes: ['source.js'] + {tokens} = grammar.tokenizeLine('a ' + operator + ' b') + expect(tokens[0]).toEqual value: 'a ', scopes: ['source.js'] expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.js'] - expect(tokens[3]).toEqual value: '2', scopes: ['source.js', 'constant.numeric.js'] + expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] it "tokenizes the arithmetic operators when separated by newlines", -> for operator in operators From 3b02d17b7178a42a9c513650cdf58e88ee800e21 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Wed, 23 Sep 2015 19:45:22 +0300 Subject: [PATCH 04/18] Tokenize `--`, `++` as `keyword.operator.(in|de)crement` --- grammars/javascript.cson | 10 +++++++++- spec/javascript-spec.coffee | 11 +++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/grammars/javascript.cson b/grammars/javascript.cson index e62a8b7b..dd53bcb4 100644 --- a/grammars/javascript.cson +++ b/grammars/javascript.cson @@ -857,10 +857,18 @@ 'operators': 'patterns': [ { - 'match': '!=|!==|<=|>=|<<=|>>=|>>>=|\\*=|(?|<|>|!|&&|\\|\\||\\?|\\:|\\^' + 'match': '!=|!==|<=|>=|<<=|>>=|>>>=|\\*=|(?|<|>|!|&&|\\|\\||\\?|\\:|\\^' 'comment': 'match 2-character operator first' 'name': 'keyword.operator.js' } + { + 'match': '\\-\\-' + 'name': 'keyword.operator.decrement.js' + } + { + 'match': '\\+\\+' + 'name': 'keyword.operator.increment.js' + } { 'match': '%|\\*|/|\\-|\\+' 'name': 'keyword.operator.js' diff --git a/spec/javascript-spec.coffee b/spec/javascript-spec.coffee index 791ee4dd..cbad5a83 100644 --- a/spec/javascript-spec.coffee +++ b/spec/javascript-spec.coffee @@ -200,6 +200,17 @@ describe "Javascript grammar", -> {tokens} = grammar.tokenizeLine('void') expect(tokens[0]).toEqual value: 'void', scopes: ['source.js', 'keyword.operator.js'] + describe "increment, decrement", -> + it "tokenizes increment", -> + {tokens} = grammar.tokenizeLine('i++') + expect(tokens[0]).toEqual value: 'i', scopes: ['source.js'] + expect(tokens[1]).toEqual value: '++', scopes: ['source.js', 'keyword.operator.increment.js'] + + it "tokenizes decrement", -> + {tokens} = grammar.tokenizeLine('i--') + expect(tokens[0]).toEqual value: 'i', scopes: ['source.js'] + expect(tokens[1]).toEqual value: '--', scopes: ['source.js', 'keyword.operator.decrement.js'] + describe "arithmetic", -> operators = ["*", "/", "-", "%", "+"] From bc628b5628b2a40b54bc03593c2cf06d70dc6eab Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Wed, 23 Sep 2015 20:11:18 +0300 Subject: [PATCH 05/18] Tokenize `=` as `keyword.operator.assignment` --- grammars/javascript.cson | 26 +++++++++++++--------- spec/javascript-spec.coffee | 43 ++++++++++++++++++------------------- 2 files changed, 37 insertions(+), 32 deletions(-) diff --git a/grammars/javascript.cson b/grammars/javascript.cson index dd53bcb4..2caec8ae 100644 --- a/grammars/javascript.cson +++ b/grammars/javascript.cson @@ -267,7 +267,7 @@ '2': 'name': 'support.constant.js' '3': - 'name': 'keyword.operator.js' + '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' @@ -282,7 +282,7 @@ '3': 'name': 'entity.name.function.js' '4': - 'name': 'keyword.operator.js' + 'name': 'keyword.operator.assignment.js' '5': 'name': 'storage.modifier.js' '6': @@ -312,7 +312,7 @@ '3': 'name': 'entity.name.function.js' '4': - 'name': 'keyword.operator.js' + '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' @@ -325,7 +325,7 @@ '2': 'name': 'entity.name.function.js' '3': - 'name': 'keyword.operator.js' + 'name': 'keyword.operator.assignment.js' '4': 'name': 'storage.modifier.js' '5': @@ -354,7 +354,7 @@ '1': 'name': 'entity.name.function.js' '2': - 'name': 'keyword.operator.js' + 'name': 'keyword.operator.assignment.js' '3': 'name': 'storage.modifier.js' '4': @@ -538,7 +538,7 @@ '1': 'name': 'entity.name.function.js' '2': - 'name': 'keyword.operator.js' + 'name': 'keyword.operator.assignment.js' '3': 'name': 'punctuation.definition.parameters.begin.js' 'end': '(\\))(\\s*=>)' @@ -563,7 +563,7 @@ '2': 'name': 'entity.name.function.js' '3': - 'name': 'keyword.operator.js' + 'name': 'keyword.operator.assignment.js' '4': 'name': 'punctuation.definition.parameters.begin.js' 'end': '(\\))(\\s*=>)' @@ -634,12 +634,14 @@ 'beginCaptures': '1': 'name': 'storage.modifier.js' - 'end': '(=|\\bof\\b|\\bin\\b)|(;)|(?=|<<=|>>=|>>>=|\\*=|(?|<|>|!|&&|\\|\\||\\?|\\:|\\^' + 'match': '!=|!==|<=|>=|<<=|>>=|>>>=|\\*=|(?|<|>|!|&&|\\|\\||\\?|\\:|\\^' 'comment': 'match 2-character operator first' 'name': 'keyword.operator.js' } + { + 'match': '\\=' + 'name': 'keyword.operator.assignment.js' + } { 'match': '\\-\\-' 'name': 'keyword.operator.decrement.js' @@ -993,7 +999,7 @@ } { 'match': '=' - 'name': 'keyword.operator.js' + 'name': 'keyword.operator.assignment.js' } { 'include': '#comments' diff --git a/spec/javascript-spec.coffee b/spec/javascript-spec.coffee index cbad5a83..e6eea86f 100644 --- a/spec/javascript-spec.coffee +++ b/spec/javascript-spec.coffee @@ -230,11 +230,10 @@ describe "Javascript grammar", -> describe "assignment", -> it "tokenizes '=' operator", -> - {tokens} = grammar.tokenizeLine('test = 2') - expect(tokens[0]).toEqual value: 'test ', scopes: ['source.js'] - expect(tokens[1]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.js'] - expect(tokens[2]).toEqual value: ' ', scopes: ['source.js'] - expect(tokens[3]).toEqual value: '2', scopes: ['source.js', 'constant.numeric.js'] + {tokens} = grammar.tokenizeLine('a = b') + expect(tokens[0]).toEqual value: 'a ', scopes: ['source.js'] + expect(tokens[1]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] + expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] describe "augmented", -> operators = ["+=", "-=", "*=", "/="] @@ -252,14 +251,14 @@ describe "Javascript grammar", -> expect(tokens[1]).toEqual value: ' ', scopes: ['source.js'] expect(tokens[2]).toEqual value: 'MY_COOL_VAR', scopes: ['source.js', 'constant.other.js'] expect(tokens[3]).toEqual value: ' ', scopes: ['source.js'] - expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.js'] + expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] expect(tokens[5]).toEqual value: ' ', scopes: ['source.js'] expect(tokens[6]).toEqual value: '42', scopes: ['source.js', 'constant.numeric.js'] expect(tokens[7]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] {tokens} = grammar.tokenizeLine('something = MY_COOL_VAR * 1;') expect(tokens[0]).toEqual value: 'something ', scopes: ['source.js'] - expect(tokens[1]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.js'] + expect(tokens[1]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] expect(tokens[2]).toEqual value: ' ', scopes: ['source.js'] expect(tokens[3]).toEqual value: 'MY_COOL_VAR', scopes: ['source.js', 'constant.other.js'] expect(tokens[4]).toEqual value: ' ', scopes: ['source.js'] @@ -274,7 +273,7 @@ describe "Javascript grammar", -> expect(tokens[1]).toEqual value: ' ', scopes: ['source.js'] expect(tokens[2]).toEqual value: 'myCoolVar', scopes: ['source.js', 'constant.other.js'] expect(tokens[3]).toEqual value: ' ', scopes: ['source.js'] - expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.js'] + expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] expect(tokens[5]).toEqual value: ' ', scopes: ['source.js'] expect(tokens[6]).toEqual value: '42', scopes: ['source.js', 'constant.numeric.js'] expect(tokens[7]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] @@ -319,7 +318,7 @@ describe "Javascript grammar", -> expect(tokens[10]).toEqual value: 'rest', scopes: ['source.js', 'constant.other.js'] expect(tokens[11]).toEqual value: '}', scopes: ['source.js', 'meta.brace.curly.js'] expect(tokens[12]).toEqual value: ' ', scopes: ['source.js'] - expect(tokens[13]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.js'] + expect(tokens[13]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] expect(tokens[14]).toEqual value: ' obj', scopes: ['source.js'] expect(tokens[15]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js'] @@ -328,7 +327,7 @@ describe "Javascript grammar", -> expect(tokens[1]).toEqual value: ' ', scopes: ['source.js'] expect(tokens[2]).toEqual value: 'c', scopes: ['source.js', 'constant.other.js'] expect(tokens[3]).toEqual value: ' ', scopes: ['source.js'] - expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.js'] + expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] expect(tokens[5]).toEqual value: ' ', scopes: ['source.js', 'string.regexp.js'] expect(tokens[6]).toEqual value: '/', scopes: ['source.js', 'string.regexp.js', 'punctuation.definition.string.begin.js'] expect(tokens[7]).toEqual value: 'regex', scopes: ['source.js', 'string.regexp.js'] @@ -357,17 +356,17 @@ describe "Javascript grammar", -> {tokens} = grammar.tokenizeLine 'const index = 0;' expect(tokens[0]).toEqual value: 'const', scopes: ['source.js', 'storage.modifier.js'] expect(tokens[2]).toEqual value: 'index', scopes: ['source.js', 'constant.other.js'] - expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.js'] + expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] {tokens} = grammar.tokenizeLine 'const offset = 0;' expect(tokens[0]).toEqual value: 'const', scopes: ['source.js', 'storage.modifier.js'] expect(tokens[2]).toEqual value: 'offset', scopes: ['source.js', 'constant.other.js'] - expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.js'] + expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] it "tokenizes support constants", -> {tokens} = grammar.tokenizeLine('awesome = cool.systemLanguage;') expect(tokens[0]).toEqual value: 'awesome ', scopes: ['source.js'] - expect(tokens[1]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.js'] + expect(tokens[1]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] expect(tokens[2]).toEqual value: ' cool', scopes: ['source.js'] expect(tokens[3]).toEqual value: '.', scopes: ['source.js', 'meta.delimiter.method.period.js'] expect(tokens[4]).toEqual value: 'systemLanguage', scopes: ['source.js', 'support.constant.js'] @@ -503,19 +502,19 @@ describe "Javascript grammar", -> expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] expect(tokens[2]).toEqual value: 'var', scopes: ['source.js', 'storage.modifier.js'] expect(tokens[3]).toEqual value: ' x ', scopes: ['source.js'] - expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.js'] + expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] {tokens} = grammar.tokenizeLine('export let scopedVariable = 0;') expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] expect(tokens[2]).toEqual value: 'let', scopes: ['source.js', 'storage.modifier.js'] expect(tokens[3]).toEqual value: ' scopedVariable ', scopes: ['source.js'] - expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.js'] + expect(tokens[4]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] {tokens} = grammar.tokenizeLine('export const CONSTANT = 0;') expect(tokens[0]).toEqual value: 'export', scopes: ['source.js', 'meta.export.js', 'keyword.control.js'] expect(tokens[2]).toEqual value: 'const', scopes: ['source.js', 'storage.modifier.js'] expect(tokens[4]).toEqual value: 'CONSTANT', scopes: ['source.js', 'constant.other.js'] - expect(tokens[6]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.js'] + expect(tokens[6]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] it "tokenizes named function export", -> {tokens} = grammar.tokenizeLine('export function func(p1, p2){}') @@ -675,7 +674,7 @@ describe "Javascript grammar", -> {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'] + 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'] @@ -696,13 +695,13 @@ describe "Javascript grammar", -> 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[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.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'] @@ -718,7 +717,7 @@ describe "Javascript grammar", -> {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'] + 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'] @@ -761,7 +760,7 @@ describe "Javascript grammar", -> {tokens} = grammar.tokenizeLine('var func = (param1,param2)=>{}') expect(tokens[0]).toEqual value: 'var', scopes: ['source.js', 'storage.modifier.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.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'] @@ -771,7 +770,7 @@ describe "Javascript grammar", -> {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[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.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'] From 7c9a840f4f19cefea1c960d12a47a55b0e55e940 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Wed, 23 Sep 2015 20:34:24 +0300 Subject: [PATCH 06/18] Tokenize `:` as `keyword.operator.assignment` --- grammars/javascript.cson | 6 +++--- spec/javascript-spec.coffee | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/grammars/javascript.cson b/grammars/javascript.cson index 2caec8ae..b49086c5 100644 --- a/grammars/javascript.cson +++ b/grammars/javascript.cson @@ -408,7 +408,7 @@ '1': 'name': 'entity.name.function.js' '2': - 'name': 'keyword.operator.js' + 'name': 'keyword.operator.assignment.js' '3': 'name': 'storage.modifier.js' '4': @@ -451,7 +451,7 @@ '8': 'name': 'punctuation.definition.string.end.js' '9': - 'name': 'keyword.operator.js' + 'name': 'keyword.operator.assignment.js' '10': 'name': 'storage.modifier.js' '11': @@ -647,7 +647,7 @@ 'match': '([$_a-zA-Z][$_a-zA-Z0-9]*)\\s*(:)\\s*([$_a-zA-Z][$_a-zA-Z0-9]*)?' 'captures': '2': - 'name': 'keyword.operator.js' + 'name': 'keyword.operator.assignment.js' '3': 'name': 'constant.other.js' } diff --git a/spec/javascript-spec.coffee b/spec/javascript-spec.coffee index e6eea86f..ef72632b 100644 --- a/spec/javascript-spec.coffee +++ b/spec/javascript-spec.coffee @@ -309,7 +309,7 @@ describe "Javascript grammar", -> expect(tokens[1]).toEqual value: ' ', scopes: ['source.js'] expect(tokens[2]).toEqual value: '{', scopes: ['source.js', 'meta.brace.curly.js'] expect(tokens[3]).toEqual value: 'first', scopes: ['source.js'] - expect(tokens[4]).toEqual value: ':', scopes: ['source.js', 'keyword.operator.js'] + expect(tokens[4]).toEqual value: ':', scopes: ['source.js', 'keyword.operator.assignment.js'] expect(tokens[5]).toEqual value: 'f', scopes: ['source.js', 'constant.other.js'] expect(tokens[6]).toEqual value: ',', scopes: ['source.js', 'meta.delimiter.object.comma.js'] expect(tokens[7]).toEqual value: 'second', scopes: ['source.js', 'constant.other.js'] @@ -725,7 +725,7 @@ 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[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'] @@ -733,7 +733,7 @@ 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[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'] From 872e7348339f63e6ce71d86b908545c1500afbf9 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Mon, 2 Nov 2015 16:01:06 +0300 Subject: [PATCH 07/18] Tokenize compound assignment operators as 'assignment.compound` --- grammars/javascript.cson | 6 +++++- spec/javascript-spec.coffee | 14 +++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/grammars/javascript.cson b/grammars/javascript.cson index b49086c5..7968f025 100644 --- a/grammars/javascript.cson +++ b/grammars/javascript.cson @@ -859,7 +859,11 @@ 'operators': 'patterns': [ { - 'match': '!=|!==|<=|>=|<<=|>>=|>>>=|\\*=|(?|<|>|!|&&|\\|\\||\\?|\\:|\\^' + 'match': '%=|\\+=|\\-=|&=|\\^=|<<=|>>=|>>>=|\\*=|\\|=|(?=|!|&|~|===|==|<>|<|>|!|&&|\\|\\||\\?|\\:|\\^' 'comment': 'match 2-character operator first' 'name': 'keyword.operator.js' } diff --git a/spec/javascript-spec.coffee b/spec/javascript-spec.coffee index ef72632b..51d8b55f 100644 --- a/spec/javascript-spec.coffee +++ b/spec/javascript-spec.coffee @@ -235,14 +235,14 @@ describe "Javascript grammar", -> expect(tokens[1]).toEqual value: '=', scopes: ['source.js', 'keyword.operator.assignment.js'] expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] - describe "augmented", -> - operators = ["+=", "-=", "*=", "/="] - it "tokenizes augmented assignment operators", -> + describe "compound", -> + operators = ["+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=", "&=", "^=", "|="] + it "tokenizes compound assignment operators", -> for operator in operators - {tokens} = grammar.tokenizeLine('test ' + operator + ' 2') - expect(tokens[0]).toEqual value: 'test ', scopes: ['source.js'] - expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.js'] - expect(tokens[3]).toEqual value: '2', scopes: ['source.js', 'constant.numeric.js'] + {tokens} = grammar.tokenizeLine('a ' + operator + ' b') + expect(tokens[0]).toEqual value: 'a ', scopes: ['source.js'] + expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.assignment.compound.js'] + expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] describe "constants", -> it "tokenizes ALL_CAPS variables as constants", -> From 43519178a1c67d4aa89ed7d4bc19c503fd7af896 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Thu, 17 Sep 2015 23:21:52 +0300 Subject: [PATCH 08/18] Tokenize bitwise assignment as `...assignment.compound.bitwise` --- grammars/javascript.cson | 6 +++++- spec/javascript-spec.coffee | 10 +++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/grammars/javascript.cson b/grammars/javascript.cson index 7968f025..a44bae2b 100644 --- a/grammars/javascript.cson +++ b/grammars/javascript.cson @@ -859,9 +859,13 @@ 'operators': 'patterns': [ { - 'match': '%=|\\+=|\\-=|&=|\\^=|<<=|>>=|>>>=|\\*=|\\|=|(?>=|>>>=|\\|=' + 'name': 'keyword.operator.assignment.compound.bitwise.js' + } { 'match': '!=|!==|<=|>=|!|&|~|===|==|<>|<|>|!|&&|\\|\\||\\?|\\:|\\^' 'comment': 'match 2-character operator first' diff --git a/spec/javascript-spec.coffee b/spec/javascript-spec.coffee index 51d8b55f..7866316e 100644 --- a/spec/javascript-spec.coffee +++ b/spec/javascript-spec.coffee @@ -236,14 +236,22 @@ describe "Javascript grammar", -> expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] describe "compound", -> - operators = ["+=", "-=", "*=", "/=", "%=", "<<=", ">>=", ">>>=", "&=", "^=", "|="] it "tokenizes compound assignment operators", -> + operators = ["+=", "-=", "*=", "/=", "%="] for operator in operators {tokens} = grammar.tokenizeLine('a ' + operator + ' b') expect(tokens[0]).toEqual value: 'a ', scopes: ['source.js'] expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.assignment.compound.js'] expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] + it "tokenizes bitwise compound assignment operators", -> + operators = ["<<=", ">>=", ">>>=", "&=", "^=", "|="] + for operator in operators + {tokens} = grammar.tokenizeLine('a ' + operator + ' b') + expect(tokens[0]).toEqual value: 'a ', scopes: ['source.js'] + expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.assignment.compound.bitwise.js'] + expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] + describe "constants", -> it "tokenizes ALL_CAPS variables as constants", -> {tokens} = grammar.tokenizeLine('var MY_COOL_VAR = 42;') From ec8cfb2cf72ad447a4db6193a883897db2845426 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Thu, 17 Sep 2015 23:20:47 +0300 Subject: [PATCH 09/18] Tokenize logical operators as `keyword.operator.logical` --- grammars/javascript.cson | 10 +++++++++- spec/javascript-spec.coffee | 10 ++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/grammars/javascript.cson b/grammars/javascript.cson index a44bae2b..0eb6f449 100644 --- a/grammars/javascript.cson +++ b/grammars/javascript.cson @@ -867,10 +867,18 @@ 'name': 'keyword.operator.assignment.compound.bitwise.js' } { - 'match': '!=|!==|<=|>=|!|&|~|===|==|<>|<|>|!|&&|\\|\\||\\?|\\:|\\^' + 'match': '&&|\\|\\|' + 'name': 'keyword.operator.logical.js' + } + { + 'match': '!=|!==|<=|>=|&|~|===|==|<>|<|>|\\?|\\:|\\^' 'comment': 'match 2-character operator first' 'name': 'keyword.operator.js' } + { + 'match': '!' + 'name': 'keyword.operator.logical.js' + } { 'match': '\\=' 'name': 'keyword.operator.assignment.js' diff --git a/spec/javascript-spec.coffee b/spec/javascript-spec.coffee index 7866316e..1f8efa72 100644 --- a/spec/javascript-spec.coffee +++ b/spec/javascript-spec.coffee @@ -211,6 +211,16 @@ describe "Javascript grammar", -> expect(tokens[0]).toEqual value: 'i', scopes: ['source.js'] expect(tokens[1]).toEqual value: '--', scopes: ['source.js', 'keyword.operator.decrement.js'] + describe "logical", -> + operators = ["&&", "||", "!"] + + it "tokenizes logical operators", -> + for operator in operators + {tokens} = grammar.tokenizeLine('a ' + operator + ' b') + expect(tokens[0]).toEqual value: 'a ', scopes: ['source.js'] + expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.logical.js'] + expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] + describe "arithmetic", -> operators = ["*", "/", "-", "%", "+"] From 4c0a084c1285ae7cc0cde97302a0c59c4ffca0ca Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Thu, 17 Sep 2015 23:17:31 +0300 Subject: [PATCH 10/18] Tokenize comparison operators as `keyword.operator.comparison` --- grammars/javascript.cson | 12 ++++++------ spec/javascript-spec.coffee | 10 ++++++++++ 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/grammars/javascript.cson b/grammars/javascript.cson index 0eb6f449..51d2d828 100644 --- a/grammars/javascript.cson +++ b/grammars/javascript.cson @@ -867,18 +867,18 @@ 'name': 'keyword.operator.assignment.compound.bitwise.js' } { - 'match': '&&|\\|\\|' + 'match': '!==|!=|<=|>=|===|==|<|>' + 'name': 'keyword.operator.comparison.js' + } + { + 'match': '&&|!|\\|\\|' 'name': 'keyword.operator.logical.js' } { - 'match': '!=|!==|<=|>=|&|~|===|==|<>|<|>|\\?|\\:|\\^' + 'match': '&|~|<>|\\?|\\:|\\^' 'comment': 'match 2-character operator first' 'name': 'keyword.operator.js' } - { - 'match': '!' - 'name': 'keyword.operator.logical.js' - } { 'match': '\\=' 'name': 'keyword.operator.assignment.js' diff --git a/spec/javascript-spec.coffee b/spec/javascript-spec.coffee index 1f8efa72..3e2ca401 100644 --- a/spec/javascript-spec.coffee +++ b/spec/javascript-spec.coffee @@ -221,6 +221,16 @@ describe "Javascript grammar", -> expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.logical.js'] expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] + describe "comparison", -> + operators = ["<=", ">=", "!=", "!==", "===", "==", "<", ">" ] + + it "tokenizes comparison operators", -> + for operator in operators + {tokens} = grammar.tokenizeLine('a ' + operator + ' b') + expect(tokens[0]).toEqual value: 'a ', scopes: ['source.js'] + expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.comparison.js'] + expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] + describe "arithmetic", -> operators = ["*", "/", "-", "%", "+"] From 30492d4934233bc5034ea2e23588227e09a41ddd Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Thu, 17 Sep 2015 22:20:22 +0300 Subject: [PATCH 11/18] Tokenize bitwise operators as `keyword.operator.bitwise` --- grammars/javascript.cson | 6 +++++- spec/javascript-spec.coffee | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/grammars/javascript.cson b/grammars/javascript.cson index 51d2d828..48a5ec9e 100644 --- a/grammars/javascript.cson +++ b/grammars/javascript.cson @@ -875,7 +875,11 @@ 'name': 'keyword.operator.logical.js' } { - 'match': '&|~|<>|\\?|\\:|\\^' + 'match': '&|\\||\\^|~' + 'name': 'keyword.operator.bitwise.js' + } + { + 'match': '<>|\\?|\\:' 'comment': 'match 2-character operator first' 'name': 'keyword.operator.js' } diff --git a/spec/javascript-spec.coffee b/spec/javascript-spec.coffee index 3e2ca401..e862988b 100644 --- a/spec/javascript-spec.coffee +++ b/spec/javascript-spec.coffee @@ -231,6 +231,21 @@ describe "Javascript grammar", -> expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.comparison.js'] expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] + describe "bitwise", -> + it "tokenizes bitwise 'not'", -> + {tokens} = grammar.tokenizeLine('~a') + expect(tokens[0]).toEqual value: '~', scopes: ['source.js', 'keyword.operator.bitwise.js'] + expect(tokens[1]).toEqual value: 'a', scopes: ['source.js'] + + it "tokenizes bitwise operators", -> + operators = ["|", "^", "&"] + + for operator in operators + {tokens} = grammar.tokenizeLine('a ' + operator + ' b') + expect(tokens[0]).toEqual value: 'a ', scopes: ['source.js'] + expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.bitwise.js'] + expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] + describe "arithmetic", -> operators = ["*", "/", "-", "%", "+"] From f303833df06f1ed700da7aeec985065404d19a75 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Wed, 23 Sep 2015 19:51:57 +0300 Subject: [PATCH 12/18] :white_check_mark: Test conditional ternary '?', ':' operators --- spec/javascript-spec.coffee | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/spec/javascript-spec.coffee b/spec/javascript-spec.coffee index e862988b..484d94dd 100644 --- a/spec/javascript-spec.coffee +++ b/spec/javascript-spec.coffee @@ -211,6 +211,15 @@ describe "Javascript grammar", -> expect(tokens[0]).toEqual value: 'i', scopes: ['source.js'] expect(tokens[1]).toEqual value: '--', scopes: ['source.js', 'keyword.operator.decrement.js'] + describe "conditional ternary", -> + it "tokenizes conditional ternary", -> + {tokens} = grammar.tokenizeLine('test ? expr1 : expr2') + expect(tokens[0]).toEqual value: 'test ', scopes: ['source.js'] + expect(tokens[1]).toEqual value: '?', scopes: ['source.js', 'keyword.operator.js'] + expect(tokens[2]).toEqual value: ' expr1 ', scopes: ['source.js'] + expect(tokens[3]).toEqual value: ':', scopes: ['source.js', 'keyword.operator.js'] + expect(tokens[4]).toEqual value: ' expr2', scopes: ['source.js'] + describe "logical", -> operators = ["&&", "||", "!"] From 1fb23b900d7192812955570379e8894d13215fb5 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Wed, 23 Sep 2015 20:40:31 +0300 Subject: [PATCH 13/18] `keyword.operator` -> `keyword.operator.` --- grammars/javascript.cson | 4 ++-- spec/javascript-spec.coffee | 13 ++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/grammars/javascript.cson b/grammars/javascript.cson index 48a5ec9e..51c60bb6 100644 --- a/grammars/javascript.cson +++ b/grammars/javascript.cson @@ -637,7 +637,7 @@ 'end': '(\\bof\\b|\\bin\\b)|(;)|(=)|(? expect(tokens[0]).toEqual value: '5E+5', scopes: ['source.js', 'constant.numeric.js'] describe "operators", -> - it "tokenizes void", -> - {tokens} = grammar.tokenizeLine('void') - expect(tokens[0]).toEqual value: 'void', scopes: ['source.js', 'keyword.operator.js'] + it "tokenizes operators", -> + operators = ["delete", "in", "of", "instanceof", "new", "typeof", "void"] + + for operator in operators + {tokens} = grammar.tokenizeLine(operator) + expect(tokens[0]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.' + operator + '.js'] describe "increment, decrement", -> it "tokenizes increment", -> @@ -395,14 +398,14 @@ describe "Javascript grammar", -> 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[7]).toEqual value: 'of', scopes: ['source.js', 'keyword.operator.of.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[7]).toEqual value: 'in', scopes: ['source.js', 'keyword.operator.in.js'] expect(tokens[8]).toEqual value: ' object', scopes: ['source.js'] {tokens} = grammar.tokenizeLine 'const index = 0;' From fc8d57fa18b6d7f73efeeece6cfdb2daf843a4bc Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Thu, 17 Sep 2015 23:24:30 +0300 Subject: [PATCH 14/18] :fire: Remove '<>' operator --- grammars/javascript.cson | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grammars/javascript.cson b/grammars/javascript.cson index 51c60bb6..ea948bc1 100644 --- a/grammars/javascript.cson +++ b/grammars/javascript.cson @@ -879,7 +879,7 @@ 'name': 'keyword.operator.bitwise.js' } { - 'match': '<>|\\?|\\:' + 'match': '\\?|\\:' 'comment': 'match 2-character operator first' 'name': 'keyword.operator.js' } From a3401e785ba6d5714b21588e3a266dc307c68578 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Wed, 23 Sep 2015 19:58:19 +0300 Subject: [PATCH 15/18] :art: --- grammars/javascript.cson | 1 - 1 file changed, 1 deletion(-) diff --git a/grammars/javascript.cson b/grammars/javascript.cson index ea948bc1..a068982f 100644 --- a/grammars/javascript.cson +++ b/grammars/javascript.cson @@ -880,7 +880,6 @@ } { 'match': '\\?|\\:' - 'comment': 'match 2-character operator first' 'name': 'keyword.operator.js' } { From 19066dacdf81116e01e245df67aefba65e81509d Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Wed, 4 Nov 2015 15:54:50 +0300 Subject: [PATCH 16/18] :art: --- grammars/javascript.cson | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/grammars/javascript.cson b/grammars/javascript.cson index a068982f..e5667d1c 100644 --- a/grammars/javascript.cson +++ b/grammars/javascript.cson @@ -879,15 +879,15 @@ 'name': 'keyword.operator.bitwise.js' } { - 'match': '\\?|\\:' + 'match': '\\?|:' 'name': 'keyword.operator.js' } { - 'match': '\\=' + 'match': '=' 'name': 'keyword.operator.assignment.js' } { - 'match': '\\-\\-' + 'match': '--' 'name': 'keyword.operator.decrement.js' } { @@ -895,7 +895,7 @@ 'name': 'keyword.operator.increment.js' } { - 'match': '%|\\*|/|\\-|\\+' + 'match': '%|\\*|/|-|\\+' 'name': 'keyword.operator.js' } ] From 66e2d8e100d03753bc48e13fb123f8ee5c61ac17 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Wed, 4 Nov 2015 16:12:19 +0300 Subject: [PATCH 17/18] :memo: --- spec/javascript-spec.coffee | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/spec/javascript-spec.coffee b/spec/javascript-spec.coffee index 37553ee8..1b06703b 100644 --- a/spec/javascript-spec.coffee +++ b/spec/javascript-spec.coffee @@ -196,7 +196,7 @@ describe "Javascript grammar", -> expect(tokens[0]).toEqual value: '5E+5', scopes: ['source.js', 'constant.numeric.js'] describe "operators", -> - it "tokenizes operators", -> + it "tokenizes them", -> operators = ["delete", "in", "of", "instanceof", "new", "typeof", "void"] for operator in operators @@ -215,7 +215,7 @@ describe "Javascript grammar", -> expect(tokens[1]).toEqual value: '--', scopes: ['source.js', 'keyword.operator.decrement.js'] describe "conditional ternary", -> - it "tokenizes conditional ternary", -> + it "tokenizes them", -> {tokens} = grammar.tokenizeLine('test ? expr1 : expr2') expect(tokens[0]).toEqual value: 'test ', scopes: ['source.js'] expect(tokens[1]).toEqual value: '?', scopes: ['source.js', 'keyword.operator.js'] @@ -226,7 +226,7 @@ describe "Javascript grammar", -> describe "logical", -> operators = ["&&", "||", "!"] - it "tokenizes logical operators", -> + it "tokenizes them", -> for operator in operators {tokens} = grammar.tokenizeLine('a ' + operator + ' b') expect(tokens[0]).toEqual value: 'a ', scopes: ['source.js'] @@ -236,7 +236,7 @@ describe "Javascript grammar", -> describe "comparison", -> operators = ["<=", ">=", "!=", "!==", "===", "==", "<", ">" ] - it "tokenizes comparison operators", -> + it "tokenizes them", -> for operator in operators {tokens} = grammar.tokenizeLine('a ' + operator + ' b') expect(tokens[0]).toEqual value: 'a ', scopes: ['source.js'] @@ -249,7 +249,7 @@ describe "Javascript grammar", -> expect(tokens[0]).toEqual value: '~', scopes: ['source.js', 'keyword.operator.bitwise.js'] expect(tokens[1]).toEqual value: 'a', scopes: ['source.js'] - it "tokenizes bitwise operators", -> + it "tokenizes them", -> operators = ["|", "^", "&"] for operator in operators @@ -261,7 +261,7 @@ describe "Javascript grammar", -> describe "arithmetic", -> operators = ["*", "/", "-", "%", "+"] - it "tokenizes arithmetic operators", -> + it "tokenizes them", -> for operator in operators {tokens} = grammar.tokenizeLine('a ' + operator + ' b') expect(tokens[0]).toEqual value: 'a ', scopes: ['source.js'] @@ -283,7 +283,7 @@ describe "Javascript grammar", -> expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] describe "compound", -> - it "tokenizes compound assignment operators", -> + it "tokenizes them", -> operators = ["+=", "-=", "*=", "/=", "%="] for operator in operators {tokens} = grammar.tokenizeLine('a ' + operator + ' b') @@ -291,13 +291,14 @@ describe "Javascript grammar", -> expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.assignment.compound.js'] expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] - it "tokenizes bitwise compound assignment operators", -> - operators = ["<<=", ">>=", ">>>=", "&=", "^=", "|="] - for operator in operators - {tokens} = grammar.tokenizeLine('a ' + operator + ' b') - expect(tokens[0]).toEqual value: 'a ', scopes: ['source.js'] - expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.assignment.compound.bitwise.js'] - expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] + describe "bitwise", -> + it "tokenizes them", -> + operators = ["<<=", ">>=", ">>>=", "&=", "^=", "|="] + for operator in operators + {tokens} = grammar.tokenizeLine('a ' + operator + ' b') + expect(tokens[0]).toEqual value: 'a ', scopes: ['source.js'] + expect(tokens[1]).toEqual value: operator, scopes: ['source.js', 'keyword.operator.assignment.compound.bitwise.js'] + expect(tokens[2]).toEqual value: ' b', scopes: ['source.js'] describe "constants", -> it "tokenizes ALL_CAPS variables as constants", -> From 7fb69c33c7d3c5fc3893a153a5aeb7c818c20ef0 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Wed, 4 Nov 2015 16:13:25 +0300 Subject: [PATCH 18/18] :art: --- grammars/javascript.cson | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grammars/javascript.cson b/grammars/javascript.cson index e5667d1c..0a8811dd 100644 --- a/grammars/javascript.cson +++ b/grammars/javascript.cson @@ -859,7 +859,7 @@ 'operators': 'patterns': [ { - 'match': '%=|\\+=|\\-=|\\*=|(?