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

Commit f1ff9aa

Browse files
committed
🐛 Capture regular braces before ending interpolation
Fixes #199
1 parent 3517f99 commit f1ff9aa

File tree

2 files changed

+38
-11
lines changed

2 files changed

+38
-11
lines changed

grammars/javascript.cson

+23-11
Original file line numberDiff line numberDiff line change
@@ -670,7 +670,7 @@
670670
'name': 'meta.brace.round.js'
671671
}
672672
{
673-
'match': '\\{|\\}'
673+
'match': '{|}'
674674
'name': 'meta.brace.curly.js'
675675
}
676676
{
@@ -829,10 +829,10 @@
829829
'2':
830830
'name': 'punctuation.section.scope.end.js'
831831
'comment': 'Allows the special return snippet to fire.'
832-
'match': '(\\{)(\\})'
832+
'match': '({)(})'
833833
}
834834
{
835-
'match': '\\{|\\}'
835+
'match': '{|}'
836836
'name': 'meta.brace.curly.js'
837837
}
838838
{
@@ -969,14 +969,16 @@
969969
{
970970
'name': 'meta.method.js'
971971
'comment': 'match regular function like: function myFunc(arg) { … }'
972-
973972
'begin': '\\b((?!(?:break|case|catch|continue|do|else|finally|for|function|if|export|import|package|return|switch|throw|try|while|with)[\\s\\(])(?:[a-zA-Z_$][a-zA-Z_$0-9]*))\\s*(\\()(?=(?:[^\\(\\)]*)?\\)\\s*\\{)'
974973
'beginCaptures':
975974
'1':
976975
'name': 'entity.name.function.js'
977976
'2':
978977
'name': 'punctuation.definition.parameters.begin.js'
979-
978+
'end': '(\\))'
979+
'endCaptures':
980+
'1':
981+
'name': 'punctuation.definition.parameters.end.js'
980982
'patterns': [
981983
{
982984
'include': '#function-params'
@@ -985,11 +987,6 @@
985987
'include': '#strings'
986988
}
987989
]
988-
989-
'end': '(\\))'
990-
'endCaptures':
991-
'1':
992-
'name': 'punctuation.definition.parameters.end.js'
993990
}
994991
]
995992
'function-params':
@@ -1009,7 +1006,7 @@
10091006
'name': 'meta.brace.square.js'
10101007
}
10111008
{
1012-
'match': '\\{|\\}'
1009+
'match': '{|}'
10131010
'name': 'meta.brace.curly.js'
10141011
}
10151012
{
@@ -1038,6 +1035,21 @@
10381035
'end': '\\}'
10391036
'name': 'source.js.embedded.source'
10401037
'patterns': [
1038+
{
1039+
'begin': '{'
1040+
'beginCaptures':
1041+
'0':
1042+
'name': 'meta.brace.curly.js'
1043+
'end': '}'
1044+
'endCaptures':
1045+
'0':
1046+
'name': 'meta.brace.curly.js'
1047+
'patterns': [
1048+
{
1049+
'include': '$self'
1050+
}
1051+
]
1052+
}
10411053
{
10421054
'include': '$self'
10431055
}

spec/javascript-spec.coffee

+15
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,21 @@ describe "Javascript grammar", ->
451451
expect(tokens[4]).toEqual value: '}', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'punctuation.section.embedded.js']
452452
expect(tokens[5]).toEqual value: '`', scopes: ['source.js', 'string.quoted.template.js', 'punctuation.definition.string.end.js']
453453

454+
{tokens} = grammar.tokenizeLine('`hey ${() => {return hi;}}`')
455+
expect(tokens[0]).toEqual value: '`', scopes: ['source.js', 'string.quoted.template.js', 'punctuation.definition.string.begin.js']
456+
expect(tokens[1]).toEqual value: 'hey ', scopes: ['source.js', 'string.quoted.template.js']
457+
expect(tokens[2]).toEqual value: '${', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'punctuation.section.embedded.js']
458+
expect(tokens[3]).toEqual value: '(', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'meta.function.arrow.js', 'punctuation.definition.parameters.begin.js']
459+
expect(tokens[4]).toEqual value: ')', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'meta.function.arrow.js', 'punctuation.definition.parameters.end.js']
460+
expect(tokens[5]).toEqual value: ' =>', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'meta.function.arrow.js', 'storage.type.arrow.js']
461+
expect(tokens[7]).toEqual value: '{', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'meta.brace.curly.js']
462+
expect(tokens[8]).toEqual value: 'return', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'keyword.control.js']
463+
expect(tokens[9]).toEqual value: ' hi', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source']
464+
expect(tokens[10]).toEqual value: ';', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'punctuation.terminator.statement.js']
465+
expect(tokens[11]).toEqual value: '}', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'meta.brace.curly.js']
466+
expect(tokens[12]).toEqual value: '}', scopes: ['source.js', 'string.quoted.template.js', 'source.js.embedded.source', 'punctuation.section.embedded.js']
467+
expect(tokens[13]).toEqual value: '`', scopes: ['source.js', 'string.quoted.template.js', 'punctuation.definition.string.end.js']
468+
454469
describe "ES6 class", ->
455470
it "tokenizes class", ->
456471
{tokens} = grammar.tokenizeLine('class MyClass')

0 commit comments

Comments
 (0)