From b032a4b5547c91a15f005da3432b0a7feef48de7 Mon Sep 17 00:00:00 2001 From: Wliu Date: Sat, 1 Aug 2015 21:28:24 -0400 Subject: [PATCH 1/4] Add support for decorators Closes #163 --- grammars/javascript.cson | 57 +++++++++++++++++++++++++++++++++++++ spec/javascript-spec.coffee | 12 ++++++++ 2 files changed, 69 insertions(+) diff --git a/grammars/javascript.cson b/grammars/javascript.cson index 1ba3899e..d1904065 100644 --- a/grammars/javascript.cson +++ b/grammars/javascript.cson @@ -258,6 +258,63 @@ } ] } + { + 'begin': '^\\s*(?=@\\s*[A-Za-z_][A-Za-z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z_0-9]*)*\\s*\\()' + 'end': '(\\))' + 'endCaptures': + '1': + 'name': 'punctuation.definition.arguments.end.js' + 'name': 'meta.function.decorator.js' + 'patterns': [ + { + 'begin': '(?=(@)\\s*[A-Za-z_][A-Za-z0-9_]*(?:\\.[A-Za-z_][A-Za-z0-9_]*)*\\s*\\()' + 'beginCaptures': + '1': + 'name': 'punctuation.definition.decorator.js' + 'contentName': 'entity.name.function.decorator.js' + 'end': '(?=\\s*\\()' + } + { + 'begin': '(\\()' + 'beginCaptures': + '1': + 'name': 'punctuation.definition.arguments.begin.js' + 'contentName': 'meta.function.decorator.arguments.js' + 'end': '(?=\\))' + 'patterns': [ + { + 'include': '#function-params' + } + { + 'include': '#comments' + } + { + 'include': '$self' + } + ] + } + ] + } + { + 'begin': '^\\s*(?=@\\s*[A-Za-z_][A-Za-z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z_0-9]*)*)' + 'contentName': 'entity.name.function.annotation.js' + 'end': '(?=\\s|$\\n?|//)' + 'name': 'meta.function.annotation.js' + 'patterns': [ + { + 'begin': '(?=(@)\\s*[A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)*)' + 'beginCaptures': + '1': + 'name': 'punctuation.definition.annotation.js' + 'end': '(?=\\s|$\\n?|//)' + 'patterns': [ + { + 'include': '#comments' + } + ] + } + ] + } { 'begin': '\\b(constructor)\\s*(\\()' 'beginCaptures': diff --git a/spec/javascript-spec.coffee b/spec/javascript-spec.coffee index c6520cdb..eac5f25c 100644 --- a/spec/javascript-spec.coffee +++ b/spec/javascript-spec.coffee @@ -478,6 +478,18 @@ describe "Javascript grammar", -> expect(tokens[4]).toEqual value: ')', scopes: ['source.js', 'meta.function.arrow.js', 'punctuation.definition.parameters.end.js'] expect(tokens[5]).toEqual value: '=>', scopes: ['source.js', 'meta.function.arrow.js', 'storage.type.arrow.js'] + describe "decorators and annotations", -> + it "tokenizes decorators", -> + {tokens} = grammar.tokenizeLine('@thisIsADecorator(true)') + expect(tokens[0]).toEqual value: '@thisIsADecorator', scopes: ['source.js', 'meta.function.decorator.js', 'entity.name.function.decorator.js'] + expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.function.decorator.js', 'punctuation.definition.arguments.begin.js'] + expect(tokens[2]).toEqual value: 'true', scopes: ['source.js', 'meta.function.decorator.js', 'meta.function.decorator.arguments.js', 'variable.parameter.function.js'] + expect(tokens[3]).toEqual value: ')', scopes: ['source.js', 'meta.function.decorator.js', 'punctuation.definition.arguments.end.js'] + + it "tokenizes annotations", -> + {tokens} = grammar.tokenizeLine('@thisIsAnAnnotation') + expect(tokens[0]).toEqual value: '@thisIsAnAnnotation', scopes: ['source.js', 'meta.function.annotation.js', 'entity.name.function.annotation.js'] + describe "comments", -> it "tokenizes /* */ comments", -> {tokens} = grammar.tokenizeLine('/**/') From 307f54a2456a24411317812a213d8488b922b92e Mon Sep 17 00:00:00 2001 From: Wliu Date: Tue, 29 Mar 2016 13:08:20 +0000 Subject: [PATCH 2/4] Update decorators to ES2016 syntax --- grammars/javascript.cson | 56 +++++-------------------------------- spec/javascript-spec.coffee | 28 +++++++++++-------- 2 files changed, 24 insertions(+), 60 deletions(-) diff --git a/grammars/javascript.cson b/grammars/javascript.cson index 0bfeec09..0c66e5be 100644 --- a/grammars/javascript.cson +++ b/grammars/javascript.cson @@ -689,59 +689,17 @@ 'name': 'meta.class.js' } { - 'begin': '^\\s*(?=@\\s*[A-Za-z_][A-Za-z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z_0-9]*)*\\s*\\()' - 'end': '(\\))' - 'endCaptures': + 'begin': '^\\s*(@)\\s*([A-Za-z_$]\\w*)' + 'beginCaptures': '1': - 'name': 'punctuation.definition.arguments.end.js' + 'name': 'punctuation.definition.decorator.js' + '2': + 'name': 'entity.name.function.decorator.js' + 'end': '(?<=\\))|$' 'name': 'meta.function.decorator.js' 'patterns': [ { - 'begin': '(?=(@)\\s*[A-Za-z_][A-Za-z0-9_]*(?:\\.[A-Za-z_][A-Za-z0-9_]*)*\\s*\\()' - 'beginCaptures': - '1': - 'name': 'punctuation.definition.decorator.js' - 'contentName': 'entity.name.function.decorator.js' - 'end': '(?=\\s*\\()' - } - { - 'begin': '(\\()' - 'beginCaptures': - '1': - 'name': 'punctuation.definition.arguments.begin.js' - 'contentName': 'meta.function.decorator.arguments.js' - 'end': '(?=\\))' - 'patterns': [ - { - 'include': '#function-params' - } - { - 'include': '#comments' - } - { - 'include': '$self' - } - ] - } - ] - } - { - 'begin': '^\\s*(?=@\\s*[A-Za-z_][A-Za-z0-9_]*(?:\\.[a-zA-Z_][a-zA-Z_0-9]*)*)' - 'contentName': 'entity.name.function.annotation.js' - 'end': '(?=\\s|$\\n?|//)' - 'name': 'meta.function.annotation.js' - 'patterns': [ - { - 'begin': '(?=(@)\\s*[A-Za-z_][A-Za-z0-9_]*(\\.[A-Za-z_][A-Za-z0-9_]*)*)' - 'beginCaptures': - '1': - 'name': 'punctuation.definition.annotation.js' - 'end': '(?=\\s|$\\n?|//)' - 'patterns': [ - { - 'include': '#comments' - } - ] + 'include': '#arguments' } ] } diff --git a/spec/javascript-spec.coffee b/spec/javascript-spec.coffee index a45582ed..e49c9050 100644 --- a/spec/javascript-spec.coffee +++ b/spec/javascript-spec.coffee @@ -1435,17 +1435,23 @@ describe "Javascript grammar", -> expect(tokens[14]).toEqual value: delim, scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', scope, 'punctuation.definition.string.end.js'] expect(tokens[15]).toEqual value: ')', scopes: ['source.js', 'meta.method-call.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] - describe "decorators and annotations", -> - it "tokenizes decorators", -> - {tokens} = grammar.tokenizeLine('@thisIsADecorator(true)') - expect(tokens[0]).toEqual value: '@thisIsADecorator', scopes: ['source.js', 'meta.function.decorator.js', 'entity.name.function.decorator.js'] - expect(tokens[1]).toEqual value: '(', scopes: ['source.js', 'meta.function.decorator.js', 'punctuation.definition.arguments.begin.js'] - expect(tokens[2]).toEqual value: 'true', scopes: ['source.js', 'meta.function.decorator.js', 'meta.function.decorator.arguments.js', 'variable.parameter.function.js'] - expect(tokens[3]).toEqual value: ')', scopes: ['source.js', 'meta.function.decorator.js', 'punctuation.definition.arguments.end.js'] - - it "tokenizes annotations", -> - {tokens} = grammar.tokenizeLine('@thisIsAnAnnotation') - expect(tokens[0]).toEqual value: '@thisIsAnAnnotation', scopes: ['source.js', 'meta.function.annotation.js', 'entity.name.function.annotation.js'] + describe "decorators", -> + it "tokenizes decorators with arguments", -> + {tokens} = grammar.tokenizeLine('@deprecate("nope", true)') + expect(tokens[0]).toEqual value: '@', scopes: ['source.js', 'meta.function.decorator.js', 'punctuation.definition.decorator.js'] + expect(tokens[1]).toEqual value: 'deprecate', scopes: ['source.js', 'meta.function.decorator.js', 'entity.name.function.decorator.js'] + expect(tokens[2]).toEqual value: '(', scopes: ['source.js', 'meta.function.decorator.js', 'meta.arguments.js', 'punctuation.definition.arguments.begin.bracket.round.js'] + expect(tokens[3]).toEqual value: '"', scopes: ['source.js', 'meta.function.decorator.js', 'meta.arguments.js', 'string.quoted.double.js', 'punctuation.definition.string.begin.js'] + expect(tokens[4]).toEqual value: 'nope', scopes: ['source.js', 'meta.function.decorator.js', 'meta.arguments.js', 'string.quoted.double.js'] + expect(tokens[5]).toEqual value: '"', scopes: ['source.js', 'meta.function.decorator.js', 'meta.arguments.js', 'string.quoted.double.js', 'punctuation.definition.string.end.js'] + expect(tokens[6]).toEqual value: ',', scopes: ['source.js', 'meta.function.decorator.js', 'meta.arguments.js', 'meta.delimiter.object.comma.js'] + expect(tokens[8]).toEqual value: 'true', scopes: ['source.js', 'meta.function.decorator.js', 'meta.arguments.js', 'constant.language.boolean.true.js'] + expect(tokens[9]).toEqual value: ')', scopes: ['source.js', 'meta.function.decorator.js', 'meta.arguments.js', 'punctuation.definition.arguments.end.bracket.round.js'] + + it "tokenizes decorators with no arguments", -> + {tokens} = grammar.tokenizeLine('@deprecate') + expect(tokens[0]).toEqual value: '@', scopes: ['source.js', 'meta.function.decorator.js', 'punctuation.definition.decorator.js'] + expect(tokens[1]).toEqual value: 'deprecate', scopes: ['source.js', 'meta.function.decorator.js', 'entity.name.function.decorator.js'] describe "comments", -> it "tokenizes /* */ comments", -> From bd4baab1b1abaf6a3b8c9df1ae10db19398d786d Mon Sep 17 00:00:00 2001 From: Wliu <50Wliu@users.noreply.github.com> Date: Tue, 19 Apr 2016 12:25:11 -0400 Subject: [PATCH 3/4] $ is a valid identifier --- grammars/javascript.cson | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grammars/javascript.cson b/grammars/javascript.cson index 0c66e5be..ec3d5803 100644 --- a/grammars/javascript.cson +++ b/grammars/javascript.cson @@ -689,7 +689,7 @@ 'name': 'meta.class.js' } { - 'begin': '^\\s*(@)\\s*([A-Za-z_$]\\w*)' + 'begin': '^\\s*(@)\\s*([A-Za-z_$][A-Za-z0-9_$]*)' 'beginCaptures': '1': 'name': 'punctuation.definition.decorator.js' From fc937e70d03531a75682bb3bb417eb757123b216 Mon Sep 17 00:00:00 2001 From: Wliu <50Wliu@users.noreply.github.com> Date: Tue, 19 Apr 2016 12:25:53 -0400 Subject: [PATCH 4/4] :art: --- grammars/javascript.cson | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grammars/javascript.cson b/grammars/javascript.cson index ec3d5803..b6505767 100644 --- a/grammars/javascript.cson +++ b/grammars/javascript.cson @@ -689,7 +689,7 @@ 'name': 'meta.class.js' } { - 'begin': '^\\s*(@)\\s*([A-Za-z_$][A-Za-z0-9_$]*)' + 'begin': '^\\s*(@)\\s*([A-Za-z_$][\\w$]*)' 'beginCaptures': '1': 'name': 'punctuation.definition.decorator.js'