diff --git a/grammars/javascript.cson b/grammars/javascript.cson index 45a8d3dc..6ee1fef9 100644 --- a/grammars/javascript.cson +++ b/grammars/javascript.cson @@ -56,7 +56,7 @@ 'name': 'meta.class.js' } { - 'begin': '([a-zA-Z_?.$][\\w?.$]*)\\.(prototype)\\.([a-zA-Z_?.$][\\w?.$]*)\\s*(=)\\s*(function\\*?)\\s*(\\*?)(\\()' + 'begin': '([a-zA-Z_?.$][\\w?.$]*)\\.(prototype)\\.([a-zA-Z_?.$][\\w?.$]*)\\s*(=)\\s*(?:(async)(?:\\s+))?(function\\*?)\\s*(\\*?)(\\()' 'beginCaptures': '1': 'name': 'support.class.js' @@ -67,10 +67,12 @@ '4': 'name': 'keyword.operator.js' '5': - 'name': 'storage.type.function.js' + 'name': 'storage.modifier.js' '6': 'name': 'storage.type.function.js' '7': + 'name': 'storage.type.function.js' + '8': 'name': 'punctuation.definition.parameters.begin.js' 'comment': 'match stuff like: Sound.prototype.play = function() { … }' 'end': '(\\))' @@ -99,7 +101,7 @@ 'name': 'meta.function.js' } { - 'begin': '([a-zA-Z_?.$][\\w?.$]*)\\.([a-zA-Z_?.$][\\w?.$]*)\\s*(=)\\s*(function\\*?)\\s*(\\*?)\\s*([a-zA-Z_?$][\\w?$]*)?\\s*(\\()' + 'begin': '([a-zA-Z_?.$][\\w?.$]*)\\.([a-zA-Z_?.$][\\w?.$]*)\\s*(=)\\s*(?:(async)(?:\\s+))?(function\\*?)\\s*(\\*?)\\s*([a-zA-Z_?$][\\w?$]*)?\\s*(\\()' 'beginCaptures': '1': 'name': 'support.class.js' @@ -108,12 +110,14 @@ '3': 'name': 'keyword.operator.js' '4': - 'name': 'storage.type.function.js' + 'name': 'storage.modifier.js' '5': 'name': 'storage.type.function.js' '6': - 'name': 'entity.name.function.js' + 'name': 'storage.type.function.js' '7': + 'name': 'entity.name.function.js' + '8': 'name': 'punctuation.definition.parameters.begin.js' 'comment': 'match stuff like: Sound.play = function() { … }' 'end': '(\\))' @@ -128,19 +132,21 @@ ] } { - 'begin': '([a-zA-Z_?$][\\w?$]*)\\s*(=)\\s*(function\\*?)\\s*(\\*?)\\s*([a-zA-Z_?$][\\w?$]*)?\\s*(\\()' + 'begin': '([a-zA-Z_?$][\\w?$]*)\\s*(=)\\s*(?:(async)(?:\\s+))?(function\\*?)\\s*(\\*?)\\s*([a-zA-Z_?$][\\w?$]*)?\\s*(\\()' 'beginCaptures': '1': 'name': 'entity.name.function.js' '2': 'name': 'keyword.operator.js' '3': - 'name': 'storage.type.function.js' + 'name': 'storage.modifier.js' '4': 'name': 'storage.type.function.js' '5': - 'name': 'entity.name.function.js' + 'name': 'storage.type.function.js' '6': + 'name': 'entity.name.function.js' + '7': 'name': 'punctuation.definition.parameters.begin.js' 'comment': 'match stuff like: play = function() { … }' 'end': '(\\))' @@ -155,15 +161,17 @@ ] } { - 'begin': '\\b(function\\*?)\\s*((\\*)|(?:(?:\\s+)(\\*?[a-zA-Z_$]\\w*)))?\\s*(\\()' + 'begin': '\\b(?:(async)(?:\\s+))?(function\\*?)\\s*((\\*)|(?:(?:\\s+)(\\*?[a-zA-Z_$]\\w*)))?\\s*(\\()' 'beginCaptures': '1': - 'name': 'storage.type.function.js' - '3': + 'name': 'storage.modifier.js' + '2': 'name': 'storage.type.function.js' '4': - 'name': 'entity.name.function.js' + 'name': 'storage.type.function.js' '5': + 'name': 'entity.name.function.js' + '6': 'name': 'punctuation.definition.parameters.begin.js' 'comment': 'match regular function like: function myFunc(arg) { … }' 'end': '(\\))' @@ -178,17 +186,19 @@ ] } { - 'begin': '\\b([a-zA-Z_?.$][\\w?.$]*)\\s*:\\s*\\b(function\\*?)\\s*(\\*?)\\s*([a-zA-Z_?$][\\w?$]*)?\\s*(\\()' + 'begin': '\\b([a-zA-Z_?.$][\\w?.$]*)\\s*:\\s*\\b(?:(async)(?:\\s+))?(function\\*?)\\s*(\\*?)\\s*([a-zA-Z_?$][\\w?$]*)?\\s*(\\()' 'beginCaptures': '1': 'name': 'entity.name.function.js' '2': - 'name': 'storage.type.function.js' + 'name': 'storage.modifier.js' '3': 'name': 'storage.type.function.js' '4': - 'name': 'entity.name.function.js' + 'name': 'storage.type.function.js' '5': + 'name': 'entity.name.function.js' + '6': 'name': 'punctuation.definition.parameters.begin.js' 'comment': 'match stuff like: foobar: function() { … }' 'end': '(\\))' @@ -203,7 +213,7 @@ ] } { - 'begin': '(?:((\')(.*?)(\'))|((")(.*?)(")))\\s*:\\s*\\b(function\\*?)\\s*(\\*?)\\s*([a-zA-Z_?$][\\w?$]*)?\\s*(\\()' + 'begin': '(?:((\')(.*?)(\'))|((")(.*?)(")))\\s*:\\s*\\b(?:(async)(?:\\s+))?(function\\*?)\\s*(\\*?)\\s*([a-zA-Z_?$][\\w?$]*)?\\s*(\\()' 'beginCaptures': '1': 'name': 'string.quoted.single.js' @@ -222,12 +232,14 @@ '8': 'name': 'punctuation.definition.string.end.js' '9': - 'name': 'storage.type.function.js' + 'name': 'storage.modifier.js' '10': 'name': 'storage.type.function.js' '11': - 'name': 'entity.name.function.js' + 'name': 'storage.type.function.js' '12': + 'name': 'entity.name.function.js' + '13': 'name': 'punctuation.definition.parameters.begin.js' 'comment': 'Attempt to match "foo": function' 'end': '(\\))' diff --git a/spec/javascript-spec.coffee b/spec/javascript-spec.coffee index 9928164f..ded2f14f 100644 --- a/spec/javascript-spec.coffee +++ b/spec/javascript-spec.coffee @@ -269,6 +269,12 @@ describe "Javascript grammar", -> expect(tokens[6]).toEqual value: 'nonAnonymous', scopes: ['source.js', 'meta.function.json.js', 'entity.name.function.js'] expect(tokens[7]).toEqual value: '(', scopes: ['source.js', 'meta.function.json.js', 'punctuation.definition.parameters.begin.js'] + it "tokenizes async functions", -> + {tokens} = grammar.tokenizeLine('async function f(){}') + expect(tokens[0]).toEqual value: 'async', scopes: ['source.js', 'meta.function.js', 'storage.modifier.js'] + expect(tokens[2]).toEqual value: 'function', scopes: ['source.js', 'meta.function.js', 'storage.type.function.js'] + expect(tokens[4]).toEqual value: 'f', scopes: ['source.js', 'meta.function.js', 'entity.name.function.js'] + it "tokenizes /* */ comments", -> {tokens} = grammar.tokenizeLine('/**/')