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

Commit 0e8d0ba

Browse files
committed
Improve function-params regex
In addition, add a constructor regex -Fixes #183
1 parent ed83b7e commit 0e8d0ba

File tree

2 files changed

+91
-12
lines changed

2 files changed

+91
-12
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

+38-2
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,16 @@ describe "Javascript grammar", ->
325325
expect(tokens[2]).toEqual value: 'extends', scopes: ['source.js', 'meta.class.js', 'storage.modifier.js']
326326
expect(tokens[4]).toEqual value: 'SomeClass', scopes: ['source.js', 'meta.class.js', 'entity.name.type.js']
327327

328+
it "tokenizes constructors", ->
329+
{tokens} = grammar.tokenizeLine('constructor(a, b)')
330+
expect(tokens[0]).toEqual value: 'constructor', scopes: ['source.js', 'entity.name.constructor.js']
331+
expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'punctuation.definition.parameters.begin.js']
332+
expect(tokens[2]).toEqual value: 'a', scopes: ['source.js', 'variable.parameter.function.js']
333+
expect(tokens[3]).toEqual value: ',', scopes: ['source.js', 'meta.object.delimiter.js']
334+
expect(tokens[4]).toEqual value: ' ', scopes: ['source.js']
335+
expect(tokens[5]).toEqual value: 'b', scopes: ['source.js', 'variable.parameter.function.js']
336+
expect(tokens[6]).toEqual value: ')', scopes: ['source.js', 'punctuation.definition.parameters.end.js']
337+
328338
describe "ES6 import", ->
329339
it "Tokenizes import ... as", ->
330340
{tokens} = grammar.tokenizeLine('import \'react\' as React')
@@ -410,8 +420,34 @@ describe "Javascript grammar", ->
410420
expect(tokens[0]).toEqual value: 'f', scopes: ['source.js', 'meta.method.js', 'entity.name.function.js']
411421
expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.method.js', 'punctuation.definition.parameters.begin.js']
412422
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']
423+
expect(tokens[3]).toEqual value: ',', scopes: ['source.js', 'meta.method.js', 'meta.object.delimiter.js']
424+
expect(tokens[5]).toEqual value: 'b', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js']
425+
expect(tokens[6]).toEqual value: ')', scopes: ['source.js', 'meta.method.js', 'punctuation.definition.parameters.end.js']
426+
427+
{tokens} = grammar.tokenizeLine('hi({host, root = "./", plugins = [a, "b", "c", d]}) {}')
428+
expect(tokens[0]).toEqual value: 'hi', scopes: ['source.js', 'meta.method.js', 'entity.name.function.js']
429+
expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.method.js', 'punctuation.definition.parameters.begin.js']
430+
expect(tokens[2]).toEqual value: '{', scopes: ['source.js', 'meta.method.js', 'meta.brace.curly.js']
431+
expect(tokens[3]).toEqual value: 'host', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js']
432+
expect(tokens[4]).toEqual value: ',', scopes: ['source.js', 'meta.method.js', 'meta.object.delimiter.js']
433+
expect(tokens[6]).toEqual value: 'root', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js']
434+
expect(tokens[8]).toEqual value: '=', scopes: ['source.js', 'meta.method.js', 'keyword.operator.js']
435+
expect(tokens[10]).toEqual value: '"', scopes: ['source.js', 'meta.method.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js']
436+
expect(tokens[11]).toEqual value: './', scopes: ['source.js', 'meta.method.js', 'string.quoted.double.js']
437+
expect(tokens[12]).toEqual value: '"', scopes: ['source.js', 'meta.method.js', 'string.quoted.double.js', 'punctuation.definition.string.end.js']
438+
expect(tokens[13]).toEqual value: ',', scopes: ['source.js', 'meta.method.js', 'meta.object.delimiter.js']
439+
expect(tokens[15]).toEqual value: 'plugins', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js']
440+
expect(tokens[17]).toEqual value: '=', scopes: ['source.js', 'meta.method.js', 'keyword.operator.js']
441+
expect(tokens[19]).toEqual value: '[', scopes: ['source.js', 'meta.method.js', 'meta.brace.square.js']
442+
expect(tokens[20]).toEqual value: 'a', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js']
443+
expect(tokens[21]).toEqual value: ',', scopes: ['source.js', 'meta.method.js', 'meta.object.delimiter.js']
444+
expect(tokens[23]).toEqual value: '"', scopes: ['source.js', 'meta.method.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js']
445+
expect(tokens[26]).toEqual value: ',', scopes: ['source.js', 'meta.method.js', 'meta.object.delimiter.js']
446+
expect(tokens[28]).toEqual value: '"', scopes: ['source.js', 'meta.method.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js']
447+
expect(tokens[33]).toEqual value: 'd', scopes: ['source.js', 'meta.method.js', 'variable.parameter.function.js']
448+
expect(tokens[34]).toEqual value: ']', scopes: ['source.js', 'meta.method.js', 'meta.brace.square.js']
449+
expect(tokens[35]).toEqual value: '}', scopes: ['source.js', 'meta.method.js', 'meta.brace.curly.js']
450+
expect(tokens[36]).toEqual value: ')', scopes: ['source.js', 'meta.method.js', 'punctuation.definition.parameters.end.js']
415451

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

0 commit comments

Comments
 (0)