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

Commit ee4e050

Browse files
WliuWliu
Wliu
authored and
Wliu
committed
Merge pull request #184 from atom/wl-function-params
Improve function-params regex
2 parents ed83b7e + 33c4717 commit ee4e050

File tree

2 files changed

+107
-17
lines changed

2 files changed

+107
-17
lines changed

grammars/javascript.cson

+53-10
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,23 @@
258258
}
259259
]
260260
}
261+
{
262+
'begin': '\\b(constructor)\\s*(\\()'
263+
'beginCaptures':
264+
'1':
265+
'name': 'entity.name.constructor.js'
266+
'2':
267+
'name': 'punctuation.definition.parameters.begin.js'
268+
'end': '(\\))'
269+
'endCaptures':
270+
'1':
271+
'name': 'punctuation.definition.parameters.end.js'
272+
'patterns': [
273+
{
274+
'include': '#function-params'
275+
}
276+
]
277+
}
261278
{
262279
'include': '#methods'
263280
}
@@ -315,8 +332,7 @@
315332
'name': 'support.function.js.console'
316333
}
317334
{
318-
'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'
319-
'name': 'constant.numeric.js'
335+
'include': '#numbers'
320336
}
321337
{
322338
'include': '#strings'
@@ -555,6 +571,13 @@
555571
}
556572
]
557573
'repository':
574+
'numbers':
575+
'patterns': [
576+
{
577+
'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'
578+
'name': 'constant.numeric.js'
579+
}
580+
]
558581
'strings':
559582
'patterns': [
560583
{
@@ -643,18 +666,38 @@
643666
'function-params':
644667
'patterns': [
645668
{
646-
'begin': '(?=[\\p{L}\\p{Nl}$_])'
647-
'end': '(?=[,)\\/])'
648-
'patterns': [
649-
{
650-
'match': '\\G[\\p{L}\\p{Nl}$_][\\p{L}\\p{Nl}$\\p{Mn}\\p{Mc}\\p{Nd}\\p{Pc}\\x{200C}\\x{200D}]*'
651-
'name': 'variable.parameter.function.js'
652-
}
653-
]
669+
'include': '#numbers'
670+
}
671+
{
672+
'include': '#strings'
673+
}
674+
{
675+
'match': '\\(|\\)'
676+
'name': 'meta.brace.round.js'
677+
}
678+
{
679+
'match': '\\[|\\]'
680+
'name': 'meta.brace.square.js'
681+
}
682+
{
683+
'match': '\\{|\\}'
684+
'name': 'meta.brace.curly.js'
685+
}
686+
{
687+
'match': ','
688+
'name': 'meta.object.delimiter.js'
689+
}
690+
{
691+
'match': '='
692+
'name': 'keyword.operator.js'
654693
}
655694
{
656695
'include': '#comments'
657696
}
697+
{
698+
'match': '[a-zA-Z_$][a-zA-Z_$0-9]*'
699+
'name': 'variable.parameter.function.js'
700+
}
658701
]
659702
'interpolated_js':
660703
'patterns': [

spec/javascript-spec.coffee

+54-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", ->
@@ -325,6 +336,16 @@ describe "Javascript grammar", ->
325336
expect(tokens[2]).toEqual value: 'extends', scopes: ['source.js', 'meta.class.js', 'storage.modifier.js']
326337
expect(tokens[4]).toEqual value: 'SomeClass', scopes: ['source.js', 'meta.class.js', 'entity.name.type.js']
327338

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+
328349
describe "ES6 import", ->
329350
it "Tokenizes import ... as", ->
330351
{tokens} = grammar.tokenizeLine('import \'react\' as React')
@@ -410,8 +431,34 @@ describe "Javascript grammar", ->
410431
expect(tokens[0]).toEqual value: 'f', scopes: ['source.js', 'meta.method.js', 'entity.name.function.js']
411432
expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.method.js', 'punctuation.definition.parameters.begin.js']
412433
expect(tokens[2]).toEqual value: 'a', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js']
413-
expect(tokens[4]).toEqual value: 'b', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js']
414-
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']
415462

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

0 commit comments

Comments
 (0)