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

Commit 4293ce6

Browse files
WliuWliu
Wliu
authored and
Wliu
committed
Merge pull request #358 from MaximSokolov/fix-console-math-matching
Fix console, Math matching
2 parents 892b8d6 + cd6d3c2 commit 4293ce6

File tree

2 files changed

+105
-18
lines changed

2 files changed

+105
-18
lines changed

grammars/javascript.cson

+32-9
Original file line numberDiff line numberDiff line change
@@ -716,14 +716,24 @@
716716
{
717717
# console
718718
# console.log(arg1, "arg2", [...])
719-
'begin': '\\bconsole\\b'
719+
'begin': '(?<![\\w$])console(?![\\w$]|\\s*:)'
720720
'beginCaptures':
721721
'0':
722722
'name': 'entity.name.type.object.console.js'
723-
'end': '(?!\\G)'
723+
'end': '''(?x)
724+
(?<=\\)) | (?=
725+
(?! (\\s*//)|(\\s*/\\*)|(\\s*(\\.)\\s*
726+
(assert|clear|debug|error|info|log|profile|profileEnd|time|timeEnd|warn)
727+
\\s*\\(
728+
)) \\s*\\S
729+
)
730+
'''
724731
'patterns': [
725732
{
726-
'begin': '\\s*(\\.)\\s*(assert|clear|debug|error|info|log|profile|profileEnd|time|timeEnd|warn)\\s*(?=\\()'
733+
'include': '#comments'
734+
}
735+
{
736+
'begin': '\\s*(\\.)\\s*(\\w+)\\s*(?=\\()'
727737
'beginCaptures':
728738
'1':
729739
'name': 'meta.delimiter.method.period.js'
@@ -741,15 +751,28 @@
741751
}
742752
{
743753
# Math
744-
'begin': '\\bMath\\b'
754+
'begin': '(?<![\\w$])Math(?![\\w$]|\\s*:)'
745755
'beginCaptures':
746756
'0':
747-
'name': 'support.class.js'
748-
'end': '(?!\\G)'
757+
'name': 'support.class.math.js'
758+
'end': '''(?x)
759+
(?<=E|LN10|LN2|LOG10E|LOG2E|PI|SQRT1_2|SQRT2|\\)
760+
) | (?=
761+
(?! (\\s*//)|(\\s*/\\*)|(\\s*\\.\\s* (
762+
((abs|acos|acosh|asin|asinh|atan|atan2|atanh|cbrt|ceil|clz32|cos|cosh|exp|
763+
expm1|floor|fround|hypot|imul|log|log10|log1p|log2|max|min|pow|random|
764+
round|sign|sin|sinh|sqrt|tan|tanh|trunc)\\s*\\(
765+
) | (E|LN10|LN2|LOG10E|LOG2E|PI|SQRT1_2|SQRT2)(?!\\s*[\\w$(]))
766+
)) \\s*\\S
767+
)
768+
'''
749769
'patterns': [
770+
{
771+
'include': '#comments'
772+
}
750773
{
751774
# Math.random()
752-
'begin': '\\s*(\\.)\\s*(abs|acos|acosh|asin|asinh|atan|atan2|atanh|cbrt|ceil|clz32|cos|cosh|exp|expm1|floor|fround|hypot|imul|log|log10|log1p|log2|max|min|pow|random|round|sign|sin|sinh|sqrt|tan|tanh|trunc)\\s*(?=\\()'
775+
'begin': '\\s*(\\.)\\s*(\\w+)\\s*(?=\\()'
753776
'beginCaptures':
754777
'1':
755778
'name': 'meta.delimiter.method.period.js'
@@ -765,7 +788,7 @@
765788
}
766789
{
767790
# Math.PI
768-
'match': '\\s*(\\.)\\s*(E|LN10|LN2|LOG10E|LOG2E|PI|SQRT1_2|SQRT2)\\b'
791+
'match': '\\s*(\\.)\\s*(\\w+)\\b'
769792
'captures':
770793
'1':
771794
'name': 'meta.delimiter.property.period.js'
@@ -908,7 +931,7 @@
908931
'name': 'keyword.other.js'
909932
}
910933
{
911-
'match': '(?<!\\$)\\b(Anchor|Applet|Area|Array|Boolean|Button|Checkbox|Date|document|event|FileUpload|Form|Frame|Function|Hidden|History|Image|JavaArray|JavaClass|JavaObject|JavaPackage|java|Layer|Link|Location|Map|Math|MimeType|Number|navigator|netscape|Object|Option|Packages|Password|Plugin|performance|Radio|RegExp|Reset|Select|Set|String|Style|Submit|Symbol|screen|sun|Text|Textarea|WeakMap|WeakSet|window|XMLHttpRequest)\\b'
934+
'match': '(?<!\\$)\\b(Anchor|Applet|Area|Array|Boolean|Button|Checkbox|Date|document|event|FileUpload|Form|Frame|Function|Hidden|History|Image|JavaArray|JavaClass|JavaObject|JavaPackage|java|Layer|Link|Location|Map|MimeType|Number|navigator|netscape|Object|Option|Packages|Password|Plugin|performance|Radio|RegExp|Reset|Select|Set|String|Style|Submit|Symbol|screen|sun|Text|Textarea|WeakMap|WeakSet|window|XMLHttpRequest)\\b'
912935
'name': 'support.class.js'
913936
}
914937
{

spec/javascript-spec.coffee

+73-9
Original file line numberDiff line numberDiff line change
@@ -1565,41 +1565,105 @@ describe "Javascript grammar", ->
15651565

15661566
describe "console", ->
15671567
it "tokenizes the console keyword", ->
1568-
{tokens} = grammar.tokenizeLine('console')
1568+
{tokens} = grammar.tokenizeLine('console;')
15691569
expect(tokens[0]).toEqual value: 'console', scopes: ['source.js', 'entity.name.type.object.console.js']
1570+
expect(tokens[1]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js']
1571+
1572+
{tokens} = grammar.tokenizeLine('console$')
1573+
expect(tokens[0]).not.toEqual value: 'console', scopes: ['source.js', 'entity.name.type.object.console.js']
1574+
1575+
{tokens} = grammar.tokenizeLine('$console')
1576+
expect(tokens[1]).not.toEqual value: 'console', scopes: ['source.js', 'entity.name.type.object.console.js']
15701577

15711578
it "tokenizes console support functions", ->
1572-
{tokens} = grammar.tokenizeLine('console.log()')
1579+
{tokens} = grammar.tokenizeLine('console.log().log()')
15731580
expect(tokens[0]).toEqual value: 'console', scopes: ['source.js', 'entity.name.type.object.console.js']
15741581
expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js']
15751582
expect(tokens[2]).toEqual value: 'log', scopes: ['source.js', 'meta.method-call.js', 'support.function.console.js']
15761583
expect(tokens[3]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js']
15771584
expect(tokens[4]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js']
1585+
expect(tokens[6]).not.toEqual value: 'log', scopes: ['source.js', 'meta.method-call.js', 'support.function.console.js']
15781586

1579-
{tokens} = grammar.tokenizeLine('console . log()')
1587+
{tokens} = grammar.tokenizeLine('console/**/.log()')
1588+
expect(tokens[0]).toEqual value: 'console', scopes: ['source.js', 'entity.name.type.object.console.js']
1589+
expect(tokens[1]).toEqual value: '/*', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js']
1590+
expect(tokens[2]).toEqual value: '*/', scopes: ['source.js', 'comment.block.js', 'punctuation.definition.comment.js']
1591+
expect(tokens[3]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js']
1592+
expect(tokens[4]).toEqual value: 'log', scopes: ['source.js', 'meta.method-call.js', 'support.function.console.js']
1593+
expect(tokens[5]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js']
1594+
expect(tokens[6]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js']
1595+
1596+
lines = grammar.tokenizeLines '''
1597+
console
1598+
.log();
1599+
'''
1600+
expect(lines[0][0]).toEqual value: 'console', scopes: ['source.js', 'entity.name.type.object.console.js']
1601+
expect(lines[1][0]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js']
1602+
expect(lines[1][1]).toEqual value: 'log', scopes: ['source.js', 'meta.method-call.js', 'support.function.console.js']
1603+
expect(lines[1][2]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js']
1604+
expect(lines[1][3]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js']
1605+
expect(lines[1][4]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js']
1606+
1607+
{tokens} = grammar.tokenizeLine('console . log();')
15801608
expect(tokens[0]).toEqual value: 'console', scopes: ['source.js', 'entity.name.type.object.console.js']
15811609
expect(tokens[2]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js']
15821610
expect(tokens[4]).toEqual value: 'log', scopes: ['source.js', 'meta.method-call.js', 'support.function.console.js']
15831611
expect(tokens[5]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js']
15841612
expect(tokens[6]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js']
1613+
expect(tokens[7]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js']
1614+
1615+
it "tokenizes console custom functions", ->
1616+
{tokens} = grammar.tokenizeLine('console.foo();')
1617+
expect(tokens[0]).toEqual value: 'console', scopes: ['source.js', 'entity.name.type.object.console.js']
1618+
expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js']
1619+
expect(tokens[2]).toEqual value: 'foo', scopes: ['source.js', 'meta.method-call.js', 'entity.name.function.js']
1620+
expect(tokens[3]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js']
1621+
expect(tokens[4]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js']
1622+
expect(tokens[5]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js']
1623+
1624+
{tokens} = grammar.tokenizeLine('console .foo();')
1625+
expect(tokens[3]).toEqual value: 'foo', scopes: ['source.js', 'meta.method-call.js', 'entity.name.function.js']
15851626

15861627
describe "math", ->
15871628
it "tokenizes the math object", ->
1588-
{tokens} = grammar.tokenizeLine('Math')
1589-
expect(tokens[0]).toEqual value: 'Math', scopes: ['source.js', 'support.class.js']
1629+
{tokens} = grammar.tokenizeLine('Math;')
1630+
expect(tokens[0]).toEqual value: 'Math', scopes: ['source.js', 'support.class.math.js']
1631+
expect(tokens[1]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js']
15901632

15911633
it "tokenizes math support functions/properties", ->
1592-
{tokens} = grammar.tokenizeLine('Math.random()')
1593-
expect(tokens[0]).toEqual value: 'Math', scopes: ['source.js', 'support.class.js']
1634+
{tokens} = grammar.tokenizeLine('Math.random();')
1635+
expect(tokens[0]).toEqual value: 'Math', scopes: ['source.js', 'support.class.math.js']
15941636
expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js']
15951637
expect(tokens[2]).toEqual value: 'random', scopes: ['source.js', 'meta.method-call.js', 'support.function.math.js']
15961638
expect(tokens[3]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js']
15971639
expect(tokens[4]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js']
1640+
expect(tokens[5]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js']
15981641

1599-
{tokens} = grammar.tokenizeLine('Math.PI')
1600-
expect(tokens[0]).toEqual value: 'Math', scopes: ['source.js', 'support.class.js']
1642+
lines = grammar.tokenizeLines '''
1643+
Math
1644+
.random();
1645+
'''
1646+
expect(lines[0][0]).toEqual value: 'Math', scopes: ['source.js', 'support.class.math.js']
1647+
expect(lines[1][0]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js']
1648+
expect(lines[1][1]).toEqual value: 'random', scopes: ['source.js', 'meta.method-call.js', 'support.function.math.js']
1649+
expect(lines[1][2]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js']
1650+
expect(lines[1][3]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js']
1651+
expect(lines[1][4]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js']
1652+
1653+
{tokens} = grammar.tokenizeLine('Math.PI;')
1654+
expect(tokens[0]).toEqual value: 'Math', scopes: ['source.js', 'support.class.math.js']
16011655
expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'meta.delimiter.property.period.js']
16021656
expect(tokens[2]).toEqual value: 'PI', scopes: ['source.js', 'support.constant.property.math.js']
1657+
expect(tokens[3]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js']
1658+
1659+
it "tokenizes math custom functions", ->
1660+
{tokens} = grammar.tokenizeLine('Math.PI();')
1661+
expect(tokens[0]).toEqual value: 'Math', scopes: ['source.js', 'support.class.math.js']
1662+
expect(tokens[1]).toEqual value: '.', scopes: ['source.js', 'meta.method-call.js', 'meta.delimiter.method.period.js']
1663+
expect(tokens[2]).toEqual value: 'PI', scopes: ['source.js', 'meta.method-call.js', 'entity.name.function.js']
1664+
expect(tokens[3]).toEqual value: '(', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js']
1665+
expect(tokens[4]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js']
1666+
expect(tokens[5]).toEqual value: ';', scopes: ['source.js', 'punctuation.terminator.statement.js']
16031667

16041668
describe "indentation", ->
16051669
editor = null

0 commit comments

Comments
 (0)