Skip to content
This repository was archived by the owner on Dec 15, 2022. It is now read-only.

Commit 2a00768

Browse files
committed
Merge branch 'master' into wl-decorators
Conflicts: grammars/javascript.cson
2 parents 282f765 + ee4e050 commit 2a00768

File tree

4 files changed

+165
-23
lines changed

4 files changed

+165
-23
lines changed

.travis.yml

+4
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,7 @@ notifications:
66
on_failure: change
77

88
script: 'curl -s https://raw.githubusercontent.com/atom/ci/master/build-package.sh | sh'
9+
10+
branches:
11+
only:
12+
- master

grammars/javascript.cson

+61-15
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,23 @@
315315
}
316316
]
317317
}
318+
{
319+
'begin': '\\b(constructor)\\s*(\\()'
320+
'beginCaptures':
321+
'1':
322+
'name': 'entity.name.constructor.js'
323+
'2':
324+
'name': 'punctuation.definition.parameters.begin.js'
325+
'end': '(\\))'
326+
'endCaptures':
327+
'1':
328+
'name': 'punctuation.definition.parameters.end.js'
329+
'patterns': [
330+
{
331+
'include': '#function-params'
332+
}
333+
]
334+
}
318335
{
319336
'include': '#methods'
320337
}
@@ -372,8 +389,7 @@
372389
'name': 'support.function.js.console'
373390
}
374391
{
375-
'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'
376-
'name': 'constant.numeric.js'
392+
'include': '#numbers'
377393
}
378394
{
379395
'include': '#strings'
@@ -420,14 +436,16 @@
420436
'name': 'storage.modifier.js'
421437
}
422438
{
423-
'begin': '(?<!\\.)\\b(const)(?!\\s*:)\\b\\s+'
439+
'begin': '(?<!\\.)\\b(const)(?!\\s*:)\\b'
424440
'beginCaptures':
425441
'1':
426442
'name': 'storage.modifier.js'
427-
'end': '(=)'
443+
'end': '(=|of|in)|(;)|(?<!,)\\n'
428444
'endCaptures':
429445
'1':
430446
'name': 'keyword.operator.js'
447+
'2':
448+
'name': 'punctuation.terminator.statement.js'
431449
'patterns': [
432450
{
433451
'match': '([$_a-zA-Z][$_a-zA-Z0-9]*)\\s*(:)\\s*([$_a-zA-Z][$_a-zA-Z0-9]*)?'
@@ -451,6 +469,10 @@
451469
'match': ','
452470
'name': 'meta.delimiter.object.comma.js'
453471
}
472+
{
473+
'match': '\\(|\\)'
474+
'name': 'meta.brace.round.js'
475+
}
454476
{
455477
'match': '\\{|\\}'
456478
'name': 'meta.brace.curly.js'
@@ -459,9 +481,6 @@
459481
'match': '\\[|\\]'
460482
'name': 'meta.brace.square.js'
461483
}
462-
{
463-
'match': '\\s+'
464-
}
465484
]
466485
}
467486
{
@@ -609,6 +628,13 @@
609628
}
610629
]
611630
'repository':
631+
'numbers':
632+
'patterns': [
633+
{
634+
'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'
635+
'name': 'constant.numeric.js'
636+
}
637+
]
612638
'strings':
613639
'patterns': [
614640
{
@@ -697,18 +723,38 @@
697723
'function-params':
698724
'patterns': [
699725
{
700-
'begin': '(?=[\\p{L}\\p{Nl}$_])'
701-
'end': '(?=[,)\\/])'
702-
'patterns': [
703-
{
704-
'match': '\\G[\\p{L}\\p{Nl}$_][\\p{L}\\p{Nl}$\\p{Mn}\\p{Mc}\\p{Nd}\\p{Pc}\\x{200C}\\x{200D}]*'
705-
'name': 'variable.parameter.function.js'
706-
}
707-
]
726+
'include': '#numbers'
727+
}
728+
{
729+
'include': '#strings'
730+
}
731+
{
732+
'match': '\\(|\\)'
733+
'name': 'meta.brace.round.js'
734+
}
735+
{
736+
'match': '\\[|\\]'
737+
'name': 'meta.brace.square.js'
738+
}
739+
{
740+
'match': '\\{|\\}'
741+
'name': 'meta.brace.curly.js'
742+
}
743+
{
744+
'match': ','
745+
'name': 'meta.object.delimiter.js'
746+
}
747+
{
748+
'match': '='
749+
'name': 'keyword.operator.js'
708750
}
709751
{
710752
'include': '#comments'
711753
}
754+
{
755+
'match': '[a-zA-Z_$][a-zA-Z_$0-9]*'
756+
'name': 'variable.parameter.function.js'
757+
}
712758
]
713759
'interpolated_js':
714760
'patterns': [

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "language-javascript",
3-
"version": "0.84.0",
3+
"version": "0.86.0",
44
"description": "JavaScript language support in Atom",
55
"engines": {
66
"atom": "*",

spec/javascript-spec.coffee

+99-7
Original file line numberDiff line numberDiff line change
@@ -95,30 +95,41 @@ describe "Javascript grammar", ->
9595
expect(tokens[6]).toEqual value: '/', scopes: ['source.js', 'string.regexp.js', 'punctuation.definition.string.end.js']
9696
expect(tokens[7]).toEqual value: ']', scopes: ['source.js', 'meta.brace.square.js']
9797

98+
it "verifies that regular expressions have explicit count modifiers", ->
99+
source = fs.readFileSync(path.resolve(__dirname, '..', 'grammars', 'javascript.cson'), 'utf8')
100+
expect(source.search /{,/).toEqual -1
101+
102+
source = fs.readFileSync(path.resolve(__dirname, '..', 'grammars', 'regular expressions (javascript).cson'), 'utf8')
103+
expect(source.search /{,/).toEqual -1
104+
105+
describe "numbers", ->
106+
it "tokenizes hexadecimals", ->
98107
{tokens} = grammar.tokenizeLine('0x1D306')
99108
expect(tokens[0]).toEqual value: '0x1D306', scopes: ['source.js', 'constant.numeric.js']
100109

101110
{tokens} = grammar.tokenizeLine('0X1D306')
102111
expect(tokens[0]).toEqual value: '0X1D306', scopes: ['source.js', 'constant.numeric.js']
103112

113+
it "tokenizes binary literals", ->
104114
{tokens} = grammar.tokenizeLine('0b011101110111010001100110')
105115
expect(tokens[0]).toEqual value: '0b011101110111010001100110', scopes: ['source.js', 'constant.numeric.js']
106116

107117
{tokens} = grammar.tokenizeLine('0B011101110111010001100110')
108118
expect(tokens[0]).toEqual value: '0B011101110111010001100110', scopes: ['source.js', 'constant.numeric.js']
109119

120+
it "tokenizes octal literals", ->
110121
{tokens} = grammar.tokenizeLine('0o1411')
111122
expect(tokens[0]).toEqual value: '0o1411', scopes: ['source.js', 'constant.numeric.js']
112123

113124
{tokens} = grammar.tokenizeLine('0O1411')
114125
expect(tokens[0]).toEqual value: '0O1411', scopes: ['source.js', 'constant.numeric.js']
115126

116-
it "verifies that regular expressions have explicit count modifiers", ->
117-
source = fs.readFileSync(path.resolve(__dirname, '..', 'grammars', 'javascript.cson'), 'utf8')
118-
expect(source.search /{,/).toEqual -1
127+
it "tokenizes decimals", ->
128+
{tokens} = grammar.tokenizeLine('5e-10')
129+
expect(tokens[0]).toEqual value: '5e-10', scopes: ['source.js', 'constant.numeric.js']
119130

120-
source = fs.readFileSync(path.resolve(__dirname, '..', 'grammars', 'regular expressions (javascript).cson'), 'utf8')
121-
expect(source.search /{,/).toEqual -1
131+
{tokens} = grammar.tokenizeLine('-5E+5')
132+
expect(tokens[0]).toEqual value: '-5E+5', scopes: ['source.js', 'constant.numeric.js']
122133

123134
describe "operators", ->
124135
it "tokenizes void correctly", ->
@@ -212,6 +223,32 @@ describe "Javascript grammar", ->
212223
expect(tokens[6]).toEqual value: '42', scopes: ['source.js', 'constant.numeric.js']
213224
expect(tokens[7]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js']
214225

226+
lines = grammar.tokenizeLines """
227+
const a,
228+
b,
229+
c
230+
if(a)
231+
"""
232+
expect(lines[0][0]).toEqual value: 'const', scopes: ['source.js', 'storage.modifier.js']
233+
expect(lines[0][1]).toEqual value: ' ', scopes: ['source.js']
234+
expect(lines[0][2]).toEqual value: 'a', scopes: ['source.js', 'constant.other.js']
235+
expect(lines[0][3]).toEqual value: ',', scopes: ['source.js', 'meta.delimiter.object.comma.js']
236+
expect(lines[1][0]).toEqual value: 'b', scopes: ['source.js', 'constant.other.js']
237+
expect(lines[1][1]).toEqual value: ',', scopes: ['source.js', 'meta.delimiter.object.comma.js']
238+
expect(lines[2][0]).toEqual value: 'c', scopes: ['source.js', 'constant.other.js']
239+
expect(lines[3][0]).toEqual value: 'if', scopes: ['source.js', 'keyword.control.js']
240+
expect(lines[3][1]).toEqual value: '(', scopes: ['source.js', 'meta.brace.round.js']
241+
expect(lines[3][2]).toEqual value: 'a', scopes: ['source.js']
242+
expect(lines[3][3]).toEqual value: ')', scopes: ['source.js', 'meta.brace.round.js']
243+
244+
{tokens} = grammar.tokenizeLine('(const hi);')
245+
expect(tokens[0]).toEqual value: '(', scopes: ['source.js', 'meta.brace.round.js']
246+
expect(tokens[1]).toEqual value: 'const', scopes: ['source.js', 'storage.modifier.js']
247+
expect(tokens[2]).toEqual value: ' ', scopes: ['source.js']
248+
expect(tokens[3]).toEqual value: 'hi', scopes: ['source.js', 'constant.other.js']
249+
expect(tokens[4]).toEqual value: ')', scopes: ['source.js', 'meta.brace.round.js']
250+
expect(tokens[5]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js']
251+
215252
{tokens} = grammar.tokenizeLine('const {first:f,second,...rest} = obj;')
216253
expect(tokens[0]).toEqual value: 'const', scopes: ['source.js', 'storage.modifier.js']
217254
expect(tokens[1]).toEqual value: ' ', scopes: ['source.js']
@@ -242,6 +279,25 @@ describe "Javascript grammar", ->
242279
expect(tokens[8]).toEqual value: '/', scopes: ['source.js', 'string.regexp.js', 'punctuation.definition.string.end.js']
243280
expect(tokens[9]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js']
244281

282+
it "tokenizes variables declared with `const` in for-in and for-of loops", ->
283+
{tokens} = grammar.tokenizeLine 'for (const elem of array) {'
284+
expect(tokens[0]).toEqual value: 'for', scopes: ['source.js', 'keyword.control.js']
285+
expect(tokens[1]).toEqual value: ' ', scopes: ['source.js']
286+
expect(tokens[2]).toEqual value: '(', scopes: ['source.js', 'meta.brace.round.js']
287+
expect(tokens[3]).toEqual value: 'const', scopes: ['source.js', 'storage.modifier.js']
288+
expect(tokens[4]).toEqual value: ' ', scopes: ['source.js']
289+
expect(tokens[5]).toEqual value: 'elem', scopes: ['source.js', 'constant.other.js']
290+
expect(tokens[6]).toEqual value: ' ', scopes: ['source.js']
291+
expect(tokens[7]).toEqual value: 'of', scopes: ['source.js', 'keyword.operator.js']
292+
expect(tokens[8]).toEqual value: ' array', scopes: ['source.js']
293+
expect(tokens[9]).toEqual value: ')', scopes: ['source.js', 'meta.brace.round.js']
294+
295+
{tokens} = grammar.tokenizeLine 'for (const name in object) {'
296+
expect(tokens[5]).toEqual value: 'name', scopes: ['source.js', 'constant.other.js']
297+
expect(tokens[6]).toEqual value: ' ', scopes: ['source.js']
298+
expect(tokens[7]).toEqual value: 'in', scopes: ['source.js', 'keyword.operator.js']
299+
expect(tokens[8]).toEqual value: ' object', scopes: ['source.js']
300+
245301
it "tokenizes support constants", ->
246302
{tokens} = grammar.tokenizeLine('awesome = cool.systemLanguage;')
247303
expect(tokens[0]).toEqual value: 'awesome ', scopes: ['source.js']
@@ -280,6 +336,16 @@ describe "Javascript grammar", ->
280336
expect(tokens[2]).toEqual value: 'extends', scopes: ['source.js', 'meta.class.js', 'storage.modifier.js']
281337
expect(tokens[4]).toEqual value: 'SomeClass', scopes: ['source.js', 'meta.class.js', 'entity.name.type.js']
282338

339+
it "tokenizes constructors", ->
340+
{tokens} = grammar.tokenizeLine('constructor(a, b)')
341+
expect(tokens[0]).toEqual value: 'constructor', scopes: ['source.js', 'entity.name.constructor.js']
342+
expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'punctuation.definition.parameters.begin.js']
343+
expect(tokens[2]).toEqual value: 'a', scopes: ['source.js', 'variable.parameter.function.js']
344+
expect(tokens[3]).toEqual value: ',', scopes: ['source.js', 'meta.object.delimiter.js']
345+
expect(tokens[4]).toEqual value: ' ', scopes: ['source.js']
346+
expect(tokens[5]).toEqual value: 'b', scopes: ['source.js', 'variable.parameter.function.js']
347+
expect(tokens[6]).toEqual value: ')', scopes: ['source.js', 'punctuation.definition.parameters.end.js']
348+
283349
describe "ES6 import", ->
284350
it "Tokenizes import ... as", ->
285351
{tokens} = grammar.tokenizeLine('import \'react\' as React')
@@ -365,8 +431,34 @@ describe "Javascript grammar", ->
365431
expect(tokens[0]).toEqual value: 'f', scopes: ['source.js', 'meta.method.js', 'entity.name.function.js']
366432
expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.method.js', 'punctuation.definition.parameters.begin.js']
367433
expect(tokens[2]).toEqual value: 'a', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js']
368-
expect(tokens[4]).toEqual value: 'b', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js']
369-
expect(tokens[5]).toEqual value: ')', scopes: ['source.js', 'meta.method.js', 'punctuation.definition.parameters.end.js']
434+
expect(tokens[3]).toEqual value: ',', scopes: ['source.js', 'meta.method.js', 'meta.object.delimiter.js']
435+
expect(tokens[5]).toEqual value: 'b', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js']
436+
expect(tokens[6]).toEqual value: ')', scopes: ['source.js', 'meta.method.js', 'punctuation.definition.parameters.end.js']
437+
438+
{tokens} = grammar.tokenizeLine('hi({host, root = "./", plugins = [a, "b", "c", d]}) {}')
439+
expect(tokens[0]).toEqual value: 'hi', scopes: ['source.js', 'meta.method.js', 'entity.name.function.js']
440+
expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.method.js', 'punctuation.definition.parameters.begin.js']
441+
expect(tokens[2]).toEqual value: '{', scopes: ['source.js', 'meta.method.js', 'meta.brace.curly.js']
442+
expect(tokens[3]).toEqual value: 'host', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js']
443+
expect(tokens[4]).toEqual value: ',', scopes: ['source.js', 'meta.method.js', 'meta.object.delimiter.js']
444+
expect(tokens[6]).toEqual value: 'root', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js']
445+
expect(tokens[8]).toEqual value: '=', scopes: ['source.js', 'meta.method.js', 'keyword.operator.js']
446+
expect(tokens[10]).toEqual value: '"', scopes: ['source.js', 'meta.method.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js']
447+
expect(tokens[11]).toEqual value: './', scopes: ['source.js', 'meta.method.js', 'string.quoted.double.js']
448+
expect(tokens[12]).toEqual value: '"', scopes: ['source.js', 'meta.method.js', 'string.quoted.double.js', 'punctuation.definition.string.end.js']
449+
expect(tokens[13]).toEqual value: ',', scopes: ['source.js', 'meta.method.js', 'meta.object.delimiter.js']
450+
expect(tokens[15]).toEqual value: 'plugins', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js']
451+
expect(tokens[17]).toEqual value: '=', scopes: ['source.js', 'meta.method.js', 'keyword.operator.js']
452+
expect(tokens[19]).toEqual value: '[', scopes: ['source.js', 'meta.method.js', 'meta.brace.square.js']
453+
expect(tokens[20]).toEqual value: 'a', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js']
454+
expect(tokens[21]).toEqual value: ',', scopes: ['source.js', 'meta.method.js', 'meta.object.delimiter.js']
455+
expect(tokens[23]).toEqual value: '"', scopes: ['source.js', 'meta.method.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js']
456+
expect(tokens[26]).toEqual value: ',', scopes: ['source.js', 'meta.method.js', 'meta.object.delimiter.js']
457+
expect(tokens[28]).toEqual value: '"', scopes: ['source.js', 'meta.method.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js']
458+
expect(tokens[33]).toEqual value: 'd', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js']
459+
expect(tokens[34]).toEqual value: ']', scopes: ['source.js', 'meta.method.js', 'meta.brace.square.js']
460+
expect(tokens[35]).toEqual value: '}', scopes: ['source.js', 'meta.method.js', 'meta.brace.curly.js']
461+
expect(tokens[36]).toEqual value: ')', scopes: ['source.js', 'meta.method.js', 'punctuation.definition.parameters.end.js']
370462

371463
it "tokenizes functions", ->
372464
{tokens} = grammar.tokenizeLine('var func = function nonAnonymous(')

0 commit comments

Comments
 (0)