From ab9277aa0e2cc68583ddb6c56fddde2cd540bd39 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Wed, 2 Dec 2015 20:27:19 +0300 Subject: [PATCH 01/18] Tokenize punctuation --- grammars/c.cson | 26 +++++++++++++++++ spec/c-spec.coffee | 71 +++++++++++++++++++++++++++++++++------------- 2 files changed, 77 insertions(+), 20 deletions(-) diff --git a/grammars/c.cson b/grammars/c.cson index 572eab8..02ea5be 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -262,6 +262,9 @@ { 'include': '#line_continuation_character' } + { + 'include': '#punctuation' + } ] 'repository': 'access': @@ -699,6 +702,29 @@ 'include': '#block_innards' } ] + 'punctuation': + 'patterns': [ + { + 'match': '\\(|\\)' + 'name': 'punctuation.other.bracket.round.c' + } + { + 'match': '\\[|\\]' + 'name': 'punctuation.other.bracket.square.c' + } + { + 'match': ',' + 'name': 'punctuation.other.comma.c' + } + { + 'match': '\\.' + 'name': 'punctuation.other.period.c' + } + { + 'match': ';' + 'name': 'punctuation.other.terminator.c' + } + ] 'sizeof': 'match': '\\b(sizeof)\\b' 'name': 'keyword.operator.sizeof.c' diff --git a/spec/c-spec.coffee b/spec/c-spec.coffee index c3a2bea..93fd983 100644 --- a/spec/c-spec.coffee +++ b/spec/c-spec.coffee @@ -89,6 +89,21 @@ describe "Language-C", -> {tokens} = grammar.tokenizeLine '*/*' expect(tokens[0]).toEqual value: '*/*', scopes: ['source.c', 'invalid.illegal.stray-comment-end.c'] + describe "punctuation", -> + it "tokenizes punctuation marks", -> + punctuation = + '(': 'punctuation.other.bracket.round.c' + ')': 'punctuation.other.bracket.round.c' + ']': 'punctuation.other.bracket.square.c' + '[': 'punctuation.other.bracket.square.c' + ',': 'punctuation.other.comma.c' + '.': 'punctuation.other.period.c' + ';': 'punctuation.other.terminator.c' + + for token, scope of punctuation + {tokens} = grammar.tokenizeLine token + expect(tokens[0]).toEqual value: token, scopes: ['source.c', scope] + describe "preprocessor directives", -> it "tokenizes '#line'", -> {tokens} = grammar.tokenizeLine '#line 151 "copy.c"' @@ -149,11 +164,11 @@ describe "Language-C", -> expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c', 'punctuation.definition.directive.c'] expect(tokens[1]).toEqual value: 'define', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c'] expect(tokens[3]).toEqual value: 'PI_PLUS_ONE', scopes: ['source.c', 'meta.preprocessor.macro.c', 'entity.name.function.preprocessor.c'] - expect(tokens[4]).toEqual value: ' (', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[5]).toEqual value: '3.14', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] - expect(tokens[6]).toEqual value: ' + ', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[7]).toEqual value: '1', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] - expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(tokens[5]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.other.bracket.round.c'] + expect(tokens[6]).toEqual value: '3.14', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] + expect(tokens[7]).toEqual value: ' + ', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(tokens[8]).toEqual value: '1', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] + expect(tokens[9]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.other.bracket.round.c'] describe "macros", -> it "tokenizes them", -> @@ -175,7 +190,13 @@ describe "Language-C", -> expect(tokens[6]).toEqual value: ',', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c', 'punctuation.separator.parameters.c'] expect(tokens[7]).toEqual value: ' y', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.c'] - expect(tokens[9]).toEqual value: ' (x) * (y)', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(tokens[10]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.other.bracket.round.c'] + expect(tokens[11]).toEqual value: 'x', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(tokens[12]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.other.bracket.round.c'] + expect(tokens[13]).toEqual value: ' * ', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(tokens[14]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.other.bracket.round.c'] + expect(tokens[15]).toEqual value: 'y', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(tokens[16]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.other.bracket.round.c'] {tokens} = grammar.tokenizeLine '#define SWAP(a, b) do { a ^= b; b ^= a; a ^= b; } while ( 0 )' expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c', 'punctuation.definition.directive.c'] @@ -188,19 +209,26 @@ describe "Language-C", -> expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.c'] expect(tokens[10]).toEqual value: 'do', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.c'] expect(tokens[12]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.begin.c'] - expect(tokens[13]).toEqual value: ' a ^= b; b ^= a; a ^= b; ', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] - expect(tokens[14]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.end.c'] - expect(tokens[16]).toEqual value: 'while', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.c'] - expect(tokens[17]).toEqual value: ' ( ', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[18]).toEqual value: '0', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] - expect(tokens[19]).toEqual value: ' )', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(tokens[13]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] + expect(tokens[14]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.other.terminator.c'] + expect(tokens[15]).toEqual value: ' b ^= a', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] + expect(tokens[16]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.other.terminator.c'] + expect(tokens[17]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] + expect(tokens[18]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.other.terminator.c'] + expect(tokens[20]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.end.c'] + expect(tokens[22]).toEqual value: 'while', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.c'] + expect(tokens[24]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.other.bracket.round.c'] + expect(tokens[26]).toEqual value: '0', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] + expect(tokens[28]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.other.bracket.round.c'] it "tokenizes multiline macros", -> lines = grammar.tokenizeLines ''' #define max(a,b) (a>b)? \\ a:b ''' - expect(lines[0][10]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.character.escape.line-continuation.c'] + expect(lines[0][10]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.other.bracket.round.c'] + expect(lines[0][12]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.other.bracket.round.c'] + expect(lines[0][14]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.character.escape.line-continuation.c'] lines = grammar.tokenizeLines ''' #define SWAP(a, b) { \\ @@ -219,12 +247,15 @@ describe "Language-C", -> expect(lines[0][8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.c'] expect(lines[0][10]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.begin.c'] expect(lines[0][12]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] - expect(lines[1][0]).toEqual value: ' a ^= b; ', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] - expect(lines[1][1]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] - expect(lines[2][0]).toEqual value: ' b ^= a; ', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] - expect(lines[2][1]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] - expect(lines[3][0]).toEqual value: ' a ^= b; ', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] - expect(lines[3][1]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] + expect(lines[1][0]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] + expect(lines[1][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.other.terminator.c'] + expect(lines[1][3]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] + expect(lines[2][0]).toEqual value: ' b ^= a', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] + expect(lines[2][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.other.terminator.c'] + expect(lines[2][3]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] + expect(lines[3][0]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] + expect(lines[3][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.other.terminator.c'] + expect(lines[3][3]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] expect(lines[4][0]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.end.c'] describe "includes", -> @@ -244,7 +275,7 @@ describe "Language-C", -> expect(tokens[4]).toEqual value: '>', scopes: ['source.c', 'meta.preprocessor.include.c', 'string.quoted.other.lt-gt.include.c', 'punctuation.definition.string.end.c'] {tokens} = grammar.tokenizeLine '#include_' - expect(tokens[0]).toEqual value: '#include_', scopes: ['source.c'] + expect(tokens[1]).toEqual value: '.', scopes: ['source.c', 'punctuation.other.period.c'] {tokens} = grammar.tokenizeLine '#include "file"' expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.include.c', 'keyword.control.directive.include.c', 'punctuation.definition.directive.c'] From e98b1c0165bd03b0a0ce963eeb4a26ffda9b62a1 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Wed, 2 Dec 2015 20:31:49 +0300 Subject: [PATCH 02/18] Add 'definition' subscope --- grammars/c++.cson | 12 ++++++------ grammars/c.cson | 8 ++++---- spec/c-spec.coffee | 38 +++++++++++++++++++------------------- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/grammars/c++.cson b/grammars/c++.cson index 413b074..9f3b39e 100644 --- a/grammars/c++.cson +++ b/grammars/c++.cson @@ -129,11 +129,11 @@ 'begin': '\\{' 'beginCaptures': '0': - 'name': 'punctuation.section.block.begin.c' + 'name': 'punctuation.definition.section.block.begin.c' 'end': '\\}' 'endCaptures': '0': - 'name': 'punctuation.section.block.end.c' + 'name': 'punctuation.definition.section.block.end.c' 'name': 'meta.block.cpp' 'patterns': [ { @@ -272,11 +272,11 @@ 'begin': '\\{' 'beginCaptures': '0': - 'name': 'punctuation.section.block.begin.cpp' + 'name': 'punctuation.definition.section.block.begin.cpp' 'end': '(\\})(\\s*\\n)?' 'endCaptures': '1': - 'name': 'punctuation.section.block.end.cpp' + 'name': 'punctuation.definition.section.block.end.cpp' '2': 'name': 'invalid.illegal.you-forgot-semicolon.cpp' 'patterns': [ @@ -308,11 +308,11 @@ 'begin': '\\{' 'beginCaptures': '0': - 'name': 'punctuation.section.block.begin.c' + 'name': 'punctuation.definition.section.block.begin.c' 'end': '\\}|(?=\\s*#\\s*endif\\b)' 'endCaptures': '0': - 'name': 'punctuation.section.block.end.c' + 'name': 'punctuation.definition.section.block.end.c' 'patterns': [ { 'include': '#special_block' diff --git a/grammars/c.cson b/grammars/c.cson index 02ea5be..56bff28 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -280,11 +280,11 @@ 'begin': '\\{' 'beginCaptures': '0': - 'name': 'punctuation.section.block.begin.c' + 'name': 'punctuation.definition.section.block.begin.c' 'end': '\\}|(?=\\s*#\\s*endif\\b)' 'endCaptures': '0': - 'name': 'punctuation.section.block.end.c' + 'name': 'punctuation.definition.section.block.end.c' 'name': 'meta.block.c' 'patterns': [ { @@ -435,11 +435,11 @@ 'begin': '\\(' 'beginCaptures': '0': - 'name': 'punctuation.section.parens.begin.c' + 'name': 'punctuation.definition.section.parens.begin.c' 'end': '\\)' 'endCaptures': '0': - 'name': 'punctuation.section.parens.end.c' + 'name': 'punctuation.definition.section.parens.end.c' 'name': 'meta.parens.c' 'patterns': [ { diff --git a/spec/c-spec.coffee b/spec/c-spec.coffee index 93fd983..1febf2c 100644 --- a/spec/c-spec.coffee +++ b/spec/c-spec.coffee @@ -29,13 +29,13 @@ describe "Language-C", -> ''' expect(lines[0][0]).toEqual value: 'int', scopes: ['source.c', 'storage.type.c'] expect(lines[0][2]).toEqual value: 'something', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[0][3]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] + expect(lines[0][3]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.definition.section.parens.begin.c'] expect(lines[0][4]).toEqual value: 'int', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'storage.type.c'] - expect(lines[0][6]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] - expect(lines[0][8]).toEqual value: '{', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'punctuation.section.block.begin.c'] + expect(lines[0][6]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.definition.section.parens.end.c'] + expect(lines[0][8]).toEqual value: '{', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'punctuation.definition.section.block.begin.c'] expect(lines[1][1]).toEqual value: 'return', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'keyword.control.c'] expect(lines[1][3]).toEqual value: '0', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'constant.numeric.c'] - expect(lines[2][0]).toEqual value: '}', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'punctuation.section.block.end.c'] + expect(lines[2][0]).toEqual value: '}', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'punctuation.definition.section.block.end.c'] it "tokenizes various _t types", -> {tokens} = grammar.tokenizeLine 'size_t var;' @@ -156,9 +156,9 @@ describe "Language-C", -> expect(tokens[3]).toEqual value: 'ABC', scopes: ['source.c', 'meta.preprocessor.macro.c', 'entity.name.function.preprocessor.c'] expect(tokens[4]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'punctuation.whitespace.function.leading.c'] expect(tokens[5]).toEqual value: 'XYZ', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'entity.name.function.c'] - expect(tokens[6]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] + expect(tokens[6]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'meta.parens.c', 'punctuation.definition.section.parens.begin.c'] expect(tokens[7]).toEqual value: '1', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'meta.parens.c', 'constant.numeric.c'] - expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] + expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'meta.parens.c', 'punctuation.definition.section.parens.end.c'] {tokens} = grammar.tokenizeLine '#define PI_PLUS_ONE (3.14 + 1)' expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c', 'punctuation.definition.directive.c'] @@ -208,14 +208,14 @@ describe "Language-C", -> expect(tokens[7]).toEqual value: ' b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.c'] expect(tokens[10]).toEqual value: 'do', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.c'] - expect(tokens[12]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.begin.c'] + expect(tokens[12]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.definition.section.block.begin.c'] expect(tokens[13]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] expect(tokens[14]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.other.terminator.c'] expect(tokens[15]).toEqual value: ' b ^= a', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] expect(tokens[16]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.other.terminator.c'] expect(tokens[17]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] expect(tokens[18]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.other.terminator.c'] - expect(tokens[20]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.end.c'] + expect(tokens[20]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.definition.section.block.end.c'] expect(tokens[22]).toEqual value: 'while', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.c'] expect(tokens[24]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.other.bracket.round.c'] expect(tokens[26]).toEqual value: '0', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] @@ -245,7 +245,7 @@ describe "Language-C", -> expect(lines[0][6]).toEqual value: ',', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c', 'punctuation.separator.parameters.c'] expect(lines[0][7]).toEqual value: ' b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] expect(lines[0][8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.c'] - expect(lines[0][10]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.begin.c'] + expect(lines[0][10]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.definition.section.block.begin.c'] expect(lines[0][12]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] expect(lines[1][0]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] expect(lines[1][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.other.terminator.c'] @@ -256,7 +256,7 @@ describe "Language-C", -> expect(lines[3][0]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] expect(lines[3][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.other.terminator.c'] expect(lines[3][3]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] - expect(lines[4][0]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.section.block.end.c'] + expect(lines[4][0]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.definition.section.block.end.c'] describe "includes", -> it "tokenizes '#include'", -> @@ -320,19 +320,19 @@ describe "Language-C", -> expect(lines[0][1]).toEqual value: 'if', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[0][2]).toEqual value: ' defined(CREDIT)', scopes: ['source.c', 'meta.preprocessor.c'] expect(lines[1][1]).toEqual value: 'credit', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[1][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] - expect(lines[1][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] + expect(lines[1][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.definition.section.parens.begin.c'] + expect(lines[1][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.definition.section.parens.end.c'] expect(lines[2][0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[2][1]).toEqual value: 'elif', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[2][2]).toEqual value: ' defined(DEBIT)', scopes: ['source.c', 'meta.preprocessor.c'] expect(lines[3][1]).toEqual value: 'debit', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[3][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] - expect(lines[3][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] + expect(lines[3][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.definition.section.parens.begin.c'] + expect(lines[3][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.definition.section.parens.end.c'] expect(lines[4][0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[4][1]).toEqual value: 'else', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[5][1]).toEqual value: 'printerror', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[5][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.section.parens.begin.c'] - expect(lines[5][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.section.parens.end.c'] + expect(lines[5][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.definition.section.parens.begin.c'] + expect(lines[5][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.definition.section.parens.end.c'] expect(lines[6][0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[6][1]).toEqual value: 'endif', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] @@ -558,13 +558,13 @@ describe "Language-C", -> expect(lines[0][2]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c', 'punctuation.definition.string.begin.c'] expect(lines[0][3]).toEqual value: 'C', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c'] expect(lines[0][4]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c', 'punctuation.definition.string.end.c'] - expect(lines[0][6]).toEqual value: '{', scopes: ['source.cpp', 'meta.extern-block.cpp', 'punctuation.section.block.begin.c'] + expect(lines[0][6]).toEqual value: '{', scopes: ['source.cpp', 'meta.extern-block.cpp', 'punctuation.definition.section.block.begin.c'] expect(lines[1][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'keyword.control.directive.include.c', 'punctuation.definition.directive.c'] expect(lines[1][1]).toEqual value: 'include', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'keyword.control.directive.include.c'] expect(lines[1][3]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'string.quoted.double.include.c', 'punctuation.definition.string.begin.c'] expect(lines[1][4]).toEqual value: 'legacy_C_header.h', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'string.quoted.double.include.c'] expect(lines[1][5]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'string.quoted.double.include.c', 'punctuation.definition.string.end.c'] - expect(lines[2][0]).toEqual value: '}', scopes: ['source.cpp', 'meta.extern-block.cpp', 'punctuation.section.block.end.c'] + expect(lines[2][0]).toEqual value: '}', scopes: ['source.cpp', 'meta.extern-block.cpp', 'punctuation.definition.section.block.end.c'] lines = grammar.tokenizeLines ''' #ifdef __cplusplus @@ -582,7 +582,7 @@ describe "Language-C", -> expect(lines[1][2]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c', 'punctuation.definition.string.begin.c'] expect(lines[1][3]).toEqual value: 'C', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c'] expect(lines[1][4]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c', 'punctuation.definition.string.end.c'] - expect(lines[1][6]).toEqual value: '{', scopes: ['source.cpp', 'meta.extern-block.cpp', 'punctuation.section.block.begin.c'] + expect(lines[1][6]).toEqual value: '{', scopes: ['source.cpp', 'meta.extern-block.cpp', 'punctuation.definition.section.block.begin.c'] expect(lines[2][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[2][1]).toEqual value: 'endif', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[3][1]).toEqual value: '//', scopes: ['source.cpp', 'comment.line.double-slash.c++', 'punctuation.definition.comment.c++'] From 6ffdb052e72c8a7e5c659e9c285c1621e68b2557 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Thu, 3 Dec 2015 16:00:28 +0300 Subject: [PATCH 03/18] Tokenize ';' as 'punctuation.terminator.statement' --- grammars/c.cson | 2 +- spec/c-spec.coffee | 14 +++++++------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/grammars/c.cson b/grammars/c.cson index 56bff28..bb67c21 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -722,7 +722,7 @@ } { 'match': ';' - 'name': 'punctuation.other.terminator.c' + 'name': 'punctuation.terminator.statement.c' } ] 'sizeof': diff --git a/spec/c-spec.coffee b/spec/c-spec.coffee index 1febf2c..5d9e0a6 100644 --- a/spec/c-spec.coffee +++ b/spec/c-spec.coffee @@ -98,7 +98,7 @@ describe "Language-C", -> '[': 'punctuation.other.bracket.square.c' ',': 'punctuation.other.comma.c' '.': 'punctuation.other.period.c' - ';': 'punctuation.other.terminator.c' + ';': 'punctuation.terminator.statement.c' for token, scope of punctuation {tokens} = grammar.tokenizeLine token @@ -210,11 +210,11 @@ describe "Language-C", -> expect(tokens[10]).toEqual value: 'do', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.c'] expect(tokens[12]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.definition.section.block.begin.c'] expect(tokens[13]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] - expect(tokens[14]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.other.terminator.c'] + expect(tokens[14]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.terminator.statement.c'] expect(tokens[15]).toEqual value: ' b ^= a', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] - expect(tokens[16]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.other.terminator.c'] + expect(tokens[16]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.terminator.statement.c'] expect(tokens[17]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] - expect(tokens[18]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.other.terminator.c'] + expect(tokens[18]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.terminator.statement.c'] expect(tokens[20]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.definition.section.block.end.c'] expect(tokens[22]).toEqual value: 'while', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.c'] expect(tokens[24]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.other.bracket.round.c'] @@ -248,13 +248,13 @@ describe "Language-C", -> expect(lines[0][10]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.definition.section.block.begin.c'] expect(lines[0][12]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] expect(lines[1][0]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] - expect(lines[1][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.other.terminator.c'] + expect(lines[1][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.terminator.statement.c'] expect(lines[1][3]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] expect(lines[2][0]).toEqual value: ' b ^= a', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] - expect(lines[2][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.other.terminator.c'] + expect(lines[2][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.terminator.statement.c'] expect(lines[2][3]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] expect(lines[3][0]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] - expect(lines[3][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.other.terminator.c'] + expect(lines[3][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.terminator.statement.c'] expect(lines[3][3]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] expect(lines[4][0]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.definition.section.block.end.c'] From 6b175ffa26d8d132192ae9ba8b7a1407c47dfdf6 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Fri, 11 Dec 2015 14:18:38 +0300 Subject: [PATCH 04/18] Drop 'other' subscope --- grammars/c.cson | 8 ++++---- spec/c-spec.coffee | 34 +++++++++++++++++----------------- 2 files changed, 21 insertions(+), 21 deletions(-) diff --git a/grammars/c.cson b/grammars/c.cson index bb67c21..9a654ad 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -706,19 +706,19 @@ 'patterns': [ { 'match': '\\(|\\)' - 'name': 'punctuation.other.bracket.round.c' + 'name': 'punctuation.bracket.round.c' } { 'match': '\\[|\\]' - 'name': 'punctuation.other.bracket.square.c' + 'name': 'punctuation.bracket.square.c' } { 'match': ',' - 'name': 'punctuation.other.comma.c' + 'name': 'punctuation.comma.c' } { 'match': '\\.' - 'name': 'punctuation.other.period.c' + 'name': 'punctuation.period.c' } { 'match': ';' diff --git a/spec/c-spec.coffee b/spec/c-spec.coffee index 5d9e0a6..7dbc69d 100644 --- a/spec/c-spec.coffee +++ b/spec/c-spec.coffee @@ -92,12 +92,12 @@ describe "Language-C", -> describe "punctuation", -> it "tokenizes punctuation marks", -> punctuation = - '(': 'punctuation.other.bracket.round.c' - ')': 'punctuation.other.bracket.round.c' - ']': 'punctuation.other.bracket.square.c' - '[': 'punctuation.other.bracket.square.c' - ',': 'punctuation.other.comma.c' - '.': 'punctuation.other.period.c' + '(': 'punctuation.bracket.round.c' + ')': 'punctuation.bracket.round.c' + ']': 'punctuation.bracket.square.c' + '[': 'punctuation.bracket.square.c' + ',': 'punctuation.comma.c' + '.': 'punctuation.period.c' ';': 'punctuation.terminator.statement.c' for token, scope of punctuation @@ -164,11 +164,11 @@ describe "Language-C", -> expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c', 'punctuation.definition.directive.c'] expect(tokens[1]).toEqual value: 'define', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c'] expect(tokens[3]).toEqual value: 'PI_PLUS_ONE', scopes: ['source.c', 'meta.preprocessor.macro.c', 'entity.name.function.preprocessor.c'] - expect(tokens[5]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.other.bracket.round.c'] + expect(tokens[5]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] expect(tokens[6]).toEqual value: '3.14', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] expect(tokens[7]).toEqual value: ' + ', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(tokens[8]).toEqual value: '1', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] - expect(tokens[9]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.other.bracket.round.c'] + expect(tokens[9]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] describe "macros", -> it "tokenizes them", -> @@ -190,13 +190,13 @@ describe "Language-C", -> expect(tokens[6]).toEqual value: ',', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c', 'punctuation.separator.parameters.c'] expect(tokens[7]).toEqual value: ' y', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.c'] - expect(tokens[10]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.other.bracket.round.c'] + expect(tokens[10]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] expect(tokens[11]).toEqual value: 'x', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[12]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.other.bracket.round.c'] + expect(tokens[12]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] expect(tokens[13]).toEqual value: ' * ', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[14]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.other.bracket.round.c'] + expect(tokens[14]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] expect(tokens[15]).toEqual value: 'y', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[16]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.other.bracket.round.c'] + expect(tokens[16]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] {tokens} = grammar.tokenizeLine '#define SWAP(a, b) do { a ^= b; b ^= a; a ^= b; } while ( 0 )' expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c', 'punctuation.definition.directive.c'] @@ -217,17 +217,17 @@ describe "Language-C", -> expect(tokens[18]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.terminator.statement.c'] expect(tokens[20]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.definition.section.block.end.c'] expect(tokens[22]).toEqual value: 'while', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.c'] - expect(tokens[24]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.other.bracket.round.c'] + expect(tokens[24]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] expect(tokens[26]).toEqual value: '0', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] - expect(tokens[28]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.other.bracket.round.c'] + expect(tokens[28]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] it "tokenizes multiline macros", -> lines = grammar.tokenizeLines ''' #define max(a,b) (a>b)? \\ a:b ''' - expect(lines[0][10]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.other.bracket.round.c'] - expect(lines[0][12]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.other.bracket.round.c'] + expect(lines[0][10]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] + expect(lines[0][12]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] expect(lines[0][14]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.character.escape.line-continuation.c'] lines = grammar.tokenizeLines ''' @@ -275,7 +275,7 @@ describe "Language-C", -> expect(tokens[4]).toEqual value: '>', scopes: ['source.c', 'meta.preprocessor.include.c', 'string.quoted.other.lt-gt.include.c', 'punctuation.definition.string.end.c'] {tokens} = grammar.tokenizeLine '#include_' - expect(tokens[1]).toEqual value: '.', scopes: ['source.c', 'punctuation.other.period.c'] + expect(tokens[1]).toEqual value: '.', scopes: ['source.c', 'punctuation.period.c'] {tokens} = grammar.tokenizeLine '#include "file"' expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.include.c', 'keyword.control.directive.include.c', 'punctuation.definition.directive.c'] From 0d8b6347bad97638701cedc8b58f156a592e0503 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Fri, 25 Dec 2015 15:38:47 +0300 Subject: [PATCH 05/18] Improve parameters, arguments matching --- grammars/c.cson | 98 +++++++++++++++++----------- spec/c-spec.coffee | 156 ++++++++++++++++++++++++++++----------------- 2 files changed, 159 insertions(+), 95 deletions(-) diff --git a/grammars/c.cson b/grammars/c.cson index 9a654ad..324cb7f 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -239,23 +239,11 @@ 'name': 'punctuation.whitespace.function.leading.c' '3': 'name': 'entity.name.function.c' - '4': - 'name': 'punctuation.definition.parameters.c' - 'end': '(?<=\\})|(?=#)|(;)' + 'end': '(?!\\G)' 'name': 'meta.function.c' 'patterns': [ { - 'include': '#comments' - } - { - 'include': '#parens' - } - { - 'match': '\\b(const|override|final)\\b' - 'name': 'storage.modifier.c' - } - { - 'include': '#block' + 'include': '#function_params' } ] } @@ -314,7 +302,7 @@ 'include': '#libc' } { - 'include': '#c_function_call' + 'include': '#function_call' } { 'captures': @@ -332,16 +320,28 @@ 'include': '$base' } ] - 'c_function_call': - 'captures': + 'function_call': + 'begin': '''(?x) + (?: (?= \\s ) (?:(?<=else|new|return) | (? ''' expect(lines[0][0]).toEqual value: 'int', scopes: ['source.c', 'storage.type.c'] expect(lines[0][2]).toEqual value: 'something', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[0][3]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.definition.section.parens.begin.c'] - expect(lines[0][4]).toEqual value: 'int', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'storage.type.c'] - expect(lines[0][6]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.definition.section.parens.end.c'] - expect(lines[0][8]).toEqual value: '{', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'punctuation.definition.section.block.begin.c'] - expect(lines[1][1]).toEqual value: 'return', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'keyword.control.c'] - expect(lines[1][3]).toEqual value: '0', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'constant.numeric.c'] - expect(lines[2][0]).toEqual value: '}', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'punctuation.definition.section.block.end.c'] + expect(lines[0][3]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.begin.c'] + expect(lines[0][4]).toEqual value: 'int', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'storage.type.c'] + expect(lines[0][6]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.end.c'] + expect(lines[0][8]).toEqual value: '{', scopes: ['source.c', 'meta.block.c', 'punctuation.definition.section.block.begin.c'] + expect(lines[1][1]).toEqual value: 'return', scopes: ['source.c', 'meta.block.c', 'keyword.control.c'] + expect(lines[1][3]).toEqual value: '0', scopes: ['source.c', 'meta.block.c', 'constant.numeric.c'] + expect(lines[2][0]).toEqual value: '}', scopes: ['source.c', 'meta.block.c', 'punctuation.definition.section.block.end.c'] + + lines = grammar.tokenizeLines ''' + int fn ( + int p1, /* comment */ + int * p2 + ); + ''' + expect(lines[0][0]).toEqual value: 'int', scopes: ['source.c', 'storage.type.c'] + expect(lines[0][2]).toEqual value: 'fn', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] + expect(lines[0][4]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.begin.c'] + expect(lines[1][1]).toEqual value: 'int', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'storage.type.c'] + expect(lines[1][2]).toEqual value: ' p1', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c'] + expect(lines[1][3]).toEqual value: ',', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.comma.c'] + expect(lines[1][5]).toEqual value: '/*', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'comment.block.c', 'punctuation.definition.comment.begin.c'] + expect(lines[1][6]).toEqual value: ' comment ', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'comment.block.c'] + expect(lines[1][7]).toEqual value: '*/', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'comment.block.c', 'punctuation.definition.comment.end.c'] + expect(lines[2][1]).toEqual value: 'int', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'storage.type.c'] + expect(lines[2][2]).toEqual value: ' * p2', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c'] + expect(lines[3][0]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.end.c'] + expect(lines[3][1]).toEqual value: ';', scopes: ['source.c', 'punctuation.terminator.statement.c'] + + it "tokenizes function calls", -> + {tokens} = grammar.tokenizeLine('{ fn(arg1, "arg2", 123 /* comment */) }') + expect(tokens[2]).toEqual value: 'fn', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'support.function.any-method.c'] + expect(tokens[3]).toEqual value: '(', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.begin.c'] + expect(tokens[4]).toEqual value: 'arg1', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c'] + expect(tokens[5]).toEqual value: ',', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.comma.c'] + expect(tokens[7]).toEqual value: '"', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'string.quoted.double.c', 'punctuation.definition.string.begin.c'] + expect(tokens[8]).toEqual value: 'arg2', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'string.quoted.double.c'] + expect(tokens[9]).toEqual value: '"', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'string.quoted.double.c', 'punctuation.definition.string.end.c'] + expect(tokens[10]).toEqual value: ',', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.comma.c'] + expect(tokens[12]).toEqual value: '123', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'constant.numeric.c'] + expect(tokens[14]).toEqual value: '/*', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'comment.block.c', 'punctuation.definition.comment.begin.c'] + expect(tokens[15]).toEqual value: ' comment ', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'comment.block.c'] + expect(tokens[16]).toEqual value: '*/', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'comment.block.c', 'punctuation.definition.comment.end.c'] + expect(tokens[17]).toEqual value: ')', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.end.c'] it "tokenizes various _t types", -> {tokens} = grammar.tokenizeLine 'size_t var;' @@ -92,8 +128,6 @@ describe "Language-C", -> describe "punctuation", -> it "tokenizes punctuation marks", -> punctuation = - '(': 'punctuation.bracket.round.c' - ')': 'punctuation.bracket.round.c' ']': 'punctuation.bracket.square.c' '[': 'punctuation.bracket.square.c' ',': 'punctuation.comma.c' @@ -104,6 +138,10 @@ describe "Language-C", -> {tokens} = grammar.tokenizeLine token expect(tokens[0]).toEqual value: token, scopes: ['source.c', scope] + {tokens} = grammar.tokenizeLine '()' + expect(tokens[0]).toEqual value: '(', scopes: ['source.c', 'punctuation.bracket.round.c'] + expect(tokens[1]).toEqual value: ')', scopes: ['source.c', 'punctuation.bracket.round.c'] + describe "preprocessor directives", -> it "tokenizes '#line'", -> {tokens} = grammar.tokenizeLine '#line 151 "copy.c"' @@ -156,9 +194,9 @@ describe "Language-C", -> expect(tokens[3]).toEqual value: 'ABC', scopes: ['source.c', 'meta.preprocessor.macro.c', 'entity.name.function.preprocessor.c'] expect(tokens[4]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'punctuation.whitespace.function.leading.c'] expect(tokens[5]).toEqual value: 'XYZ', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'entity.name.function.c'] - expect(tokens[6]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'meta.parens.c', 'punctuation.definition.section.parens.begin.c'] - expect(tokens[7]).toEqual value: '1', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'meta.parens.c', 'constant.numeric.c'] - expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'meta.parens.c', 'punctuation.definition.section.parens.end.c'] + expect(tokens[6]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.begin.c'] + expect(tokens[7]).toEqual value: '1', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'meta.parameters.c', 'constant.numeric.c'] + expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.end.c'] {tokens} = grammar.tokenizeLine '#define PI_PLUS_ONE (3.14 + 1)' expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c', 'punctuation.definition.directive.c'] @@ -308,33 +346,35 @@ describe "Language-C", -> describe "conditionals", -> it "tokenizes if-elif-else preprocessor blocks", -> lines = grammar.tokenizeLines ''' - #if defined(CREDIT) - credit(); - #elif defined(DEBIT) - debit(); - #else - printerror(); - #endif + int something() { + #if defined(CREDIT) + credit(); + #elif defined(DEBIT) + debit(); + #else + printerror(); + #endif + } ''' - expect(lines[0][0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[0][1]).toEqual value: 'if', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[0][2]).toEqual value: ' defined(CREDIT)', scopes: ['source.c', 'meta.preprocessor.c'] - expect(lines[1][1]).toEqual value: 'credit', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[1][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.definition.section.parens.begin.c'] - expect(lines[1][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.definition.section.parens.end.c'] - expect(lines[2][0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[2][1]).toEqual value: 'elif', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[2][2]).toEqual value: ' defined(DEBIT)', scopes: ['source.c', 'meta.preprocessor.c'] - expect(lines[3][1]).toEqual value: 'debit', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[3][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.definition.section.parens.begin.c'] - expect(lines[3][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.definition.section.parens.end.c'] - expect(lines[4][0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[4][1]).toEqual value: 'else', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[5][1]).toEqual value: 'printerror', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[5][2]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.definition.section.parens.begin.c'] - expect(lines[5][3]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parens.c', 'punctuation.definition.section.parens.end.c'] - expect(lines[6][0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[6][1]).toEqual value: 'endif', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[1][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[1][2]).toEqual value: 'if', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[1][3]).toEqual value: ' defined(CREDIT)', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c'] + expect(lines[2][1]).toEqual value: 'credit', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'support.function.any-method.c'] + expect(lines[2][2]).toEqual value: '(', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.begin.c'] + expect(lines[2][3]).toEqual value: ')', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.end.c'] + expect(lines[3][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[3][2]).toEqual value: 'elif', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[3][3]).toEqual value: ' defined(DEBIT)', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c'] + expect(lines[4][1]).toEqual value: 'debit', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'support.function.any-method.c'] + expect(lines[4][2]).toEqual value: '(', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.begin.c'] + expect(lines[4][3]).toEqual value: ')', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.end.c'] + expect(lines[5][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[5][2]).toEqual value: 'else', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[6][1]).toEqual value: 'printerror', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'support.function.any-method.c'] + expect(lines[6][2]).toEqual value: '(', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.begin.c'] + expect(lines[6][3]).toEqual value: ')', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.end.c'] + expect(lines[7][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[7][2]).toEqual value: 'endif', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] it "tokenizes if-true-else blocks", -> lines = grammar.tokenizeLines ''' @@ -357,16 +397,16 @@ describe "Language-C", -> expect(lines[0][3]).toEqual value: '1', scopes: ['source.c', 'meta.preprocessor.c', 'constant.numeric.preprocessor.c'] expect(lines[1][0]).toEqual value: 'int', scopes: ['source.c', 'storage.type.c'] expect(lines[1][2]).toEqual value: 'something', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[2][1]).toEqual value: '#', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[2][2]).toEqual value: 'if', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[2][4]).toEqual value: '1', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'constant.numeric.preprocessor.c'] - expect(lines[3][1]).toEqual value: 'return', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'keyword.control.c'] - expect(lines[3][3]).toEqual value: '1', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'constant.numeric.c'] - expect(lines[4][1]).toEqual value: '#', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[4][2]).toEqual value: 'else', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[5][0]).toEqual value: ' return 0;', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'comment.block.preprocessor.else-branch.in-block'] - expect(lines[6][1]).toEqual value: '#', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[6][2]).toEqual value: 'endif', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[2][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[2][2]).toEqual value: 'if', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[2][4]).toEqual value: '1', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'constant.numeric.preprocessor.c'] + expect(lines[3][1]).toEqual value: 'return', scopes: ['source.c', 'meta.block.c', 'keyword.control.c'] + expect(lines[3][3]).toEqual value: '1', scopes: ['source.c', 'meta.block.c', 'constant.numeric.c'] + expect(lines[4][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[4][2]).toEqual value: 'else', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[5][0]).toEqual value: ' return 0;', scopes: ['source.c', 'meta.block.c', 'comment.block.preprocessor.else-branch.in-block'] + expect(lines[6][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[6][2]).toEqual value: 'endif', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[8][0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[8][1]).toEqual value: 'else', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[9][0]).toEqual value: 'int something() {', scopes: ['source.c', 'comment.block.preprocessor.else-branch'] @@ -385,16 +425,16 @@ describe "Language-C", -> ''' expect(lines[0][0]).toEqual value: 'int', scopes: ['source.c', 'storage.type.c'] expect(lines[0][2]).toEqual value: 'something', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[1][1]).toEqual value: '#', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[1][2]).toEqual value: 'if', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[1][4]).toEqual value: '0', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'constant.numeric.preprocessor.c'] - expect(lines[2][0]).toEqual value: ' return 1;', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'comment.block.preprocessor.if-branch.in-block'] - expect(lines[3][1]).toEqual value: '#', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[3][2]).toEqual value: 'else', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[4][1]).toEqual value: 'return', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'keyword.control.c'] - expect(lines[4][3]).toEqual value: '0', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'constant.numeric.c'] - expect(lines[5][1]).toEqual value: '#', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[5][2]).toEqual value: 'endif', scopes: ['source.c', 'meta.function.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[1][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[1][2]).toEqual value: 'if', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[1][4]).toEqual value: '0', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'constant.numeric.preprocessor.c'] + expect(lines[2][0]).toEqual value: ' return 1;', scopes: ['source.c', 'meta.block.c', 'comment.block.preprocessor.if-branch.in-block'] + expect(lines[3][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[3][2]).toEqual value: 'else', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[4][1]).toEqual value: 'return', scopes: ['source.c', 'meta.block.c', 'keyword.control.c'] + expect(lines[4][3]).toEqual value: '0', scopes: ['source.c', 'meta.block.c', 'constant.numeric.c'] + expect(lines[5][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[5][2]).toEqual value: 'endif', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] lines = grammar.tokenizeLines ''' #if 0 From 15fdd4485e110518e9a8cef2240b2649cbb44d91 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Thu, 4 Feb 2016 07:39:33 +0300 Subject: [PATCH 06/18] :art: --- grammars/c++.cson | 20 ++++++++++---------- grammars/c.cson | 20 +++++++++++--------- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/grammars/c++.cson b/grammars/c++.cson index 9f3b39e..3ca2ddd 100644 --- a/grammars/c++.cson +++ b/grammars/c++.cson @@ -126,11 +126,11 @@ } ] 'block': - 'begin': '\\{' + 'begin': '{' 'beginCaptures': '0': 'name': 'punctuation.definition.section.block.begin.c' - 'end': '\\}' + 'end': '}' 'endCaptures': '0': 'name': 'punctuation.definition.section.block.end.c' @@ -174,7 +174,7 @@ 'beginCaptures': '1': 'name': 'punctuation.definition.parameters.c' - 'end': '(?=\\{)' + 'end': '(?={)' 'name': 'meta.function.constructor.initializer-list.cpp' 'patterns': [ { @@ -211,15 +211,15 @@ 'captures': '1': 'name': 'keyword.control.namespace.$2' - 'end': '(?<=\\})|(?=(;|,|\\(|\\)|>|\\[|\\]|=))' + 'end': '(?<=})|(?=(;|,|\\(|\\)|>|\\[|\\]|=))' 'name': 'meta.namespace-block.cpp' 'patterns': [ { - 'begin': '\\{' + 'begin': '{' 'beginCaptures': '0': 'name': 'punctuation.definition.scope.cpp' - 'end': '\\}' + 'end': '}' 'endCaptures': '0': 'name': 'punctuation.definition.scope.cpp' @@ -269,11 +269,11 @@ 'include': '#angle_brackets' } { - 'begin': '\\{' + 'begin': '{' 'beginCaptures': '0': 'name': 'punctuation.definition.section.block.begin.cpp' - 'end': '(\\})(\\s*\\n)?' + 'end': '}(\\s*\\n)?' 'endCaptures': '1': 'name': 'punctuation.definition.section.block.end.cpp' @@ -305,11 +305,11 @@ 'name': 'meta.extern-block.cpp' 'patterns': [ { - 'begin': '\\{' + 'begin': '{' 'beginCaptures': '0': 'name': 'punctuation.definition.section.block.begin.c' - 'end': '\\}|(?=\\s*#\\s*endif\\b)' + 'end': '}|(?=\\s*#\\s*endif\\b)' 'endCaptures': '0': 'name': 'punctuation.definition.section.block.end.c' diff --git a/grammars/c.cson b/grammars/c.cson index 324cb7f..1e46eeb 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -265,11 +265,11 @@ 'block': 'patterns': [ { - 'begin': '\\{' + 'begin': '{' 'beginCaptures': '0': 'name': 'punctuation.definition.section.block.begin.c' - 'end': '\\}|(?=\\s*#\\s*endif\\b)' + 'end': '}|(?=\\s*#\\s*endif\\b)' 'endCaptures': '0': 'name': 'punctuation.definition.section.block.end.c' @@ -322,11 +322,11 @@ ] 'function_call': 'begin': '''(?x) - (?: (?= \\s ) (?:(?<=else|new|return) | (? Date: Thu, 4 Feb 2016 10:08:39 +0300 Subject: [PATCH 07/18] :fire: Don't scope the entire block as `meta.block` Fixes #113 --- grammars/c++.cson | 1 - grammars/c.cson | 1 - spec/c-spec.coffee | 152 ++++++++++++++++++++++----------------------- 3 files changed, 76 insertions(+), 78 deletions(-) diff --git a/grammars/c++.cson b/grammars/c++.cson index 3ca2ddd..4e2a755 100644 --- a/grammars/c++.cson +++ b/grammars/c++.cson @@ -134,7 +134,6 @@ 'endCaptures': '0': 'name': 'punctuation.definition.section.block.end.c' - 'name': 'meta.block.cpp' 'patterns': [ { 'captures': diff --git a/grammars/c.cson b/grammars/c.cson index 1e46eeb..1f3ae4f 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -273,7 +273,6 @@ 'endCaptures': '0': 'name': 'punctuation.definition.section.block.end.c' - 'name': 'meta.block.c' 'patterns': [ { 'include': '#block_innards' diff --git a/spec/c-spec.coffee b/spec/c-spec.coffee index b1072fe..55d22f7 100644 --- a/spec/c-spec.coffee +++ b/spec/c-spec.coffee @@ -32,10 +32,10 @@ describe "Language-C", -> expect(lines[0][3]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.begin.c'] expect(lines[0][4]).toEqual value: 'int', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'storage.type.c'] expect(lines[0][6]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.end.c'] - expect(lines[0][8]).toEqual value: '{', scopes: ['source.c', 'meta.block.c', 'punctuation.definition.section.block.begin.c'] - expect(lines[1][1]).toEqual value: 'return', scopes: ['source.c', 'meta.block.c', 'keyword.control.c'] - expect(lines[1][3]).toEqual value: '0', scopes: ['source.c', 'meta.block.c', 'constant.numeric.c'] - expect(lines[2][0]).toEqual value: '}', scopes: ['source.c', 'meta.block.c', 'punctuation.definition.section.block.end.c'] + expect(lines[0][8]).toEqual value: '{', scopes: ['source.c', 'punctuation.definition.section.block.begin.c'] + expect(lines[1][1]).toEqual value: 'return', scopes: ['source.c', 'keyword.control.c'] + expect(lines[1][3]).toEqual value: '0', scopes: ['source.c', 'constant.numeric.c'] + expect(lines[2][0]).toEqual value: '}', scopes: ['source.c', 'punctuation.definition.section.block.end.c'] lines = grammar.tokenizeLines ''' int fn ( @@ -59,19 +59,19 @@ describe "Language-C", -> it "tokenizes function calls", -> {tokens} = grammar.tokenizeLine('{ fn(arg1, "arg2", 123 /* comment */) }') - expect(tokens[2]).toEqual value: 'fn', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'support.function.any-method.c'] - expect(tokens[3]).toEqual value: '(', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.begin.c'] - expect(tokens[4]).toEqual value: 'arg1', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c'] - expect(tokens[5]).toEqual value: ',', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.comma.c'] - expect(tokens[7]).toEqual value: '"', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'string.quoted.double.c', 'punctuation.definition.string.begin.c'] - expect(tokens[8]).toEqual value: 'arg2', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'string.quoted.double.c'] - expect(tokens[9]).toEqual value: '"', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'string.quoted.double.c', 'punctuation.definition.string.end.c'] - expect(tokens[10]).toEqual value: ',', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.comma.c'] - expect(tokens[12]).toEqual value: '123', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'constant.numeric.c'] - expect(tokens[14]).toEqual value: '/*', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'comment.block.c', 'punctuation.definition.comment.begin.c'] - expect(tokens[15]).toEqual value: ' comment ', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'comment.block.c'] - expect(tokens[16]).toEqual value: '*/', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'comment.block.c', 'punctuation.definition.comment.end.c'] - expect(tokens[17]).toEqual value: ')', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.end.c'] + expect(tokens[2]).toEqual value: 'fn', scopes: ['source.c', 'meta.function-call.c', 'support.function.any-method.c'] + expect(tokens[3]).toEqual value: '(', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.begin.c'] + expect(tokens[4]).toEqual value: 'arg1', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c'] + expect(tokens[5]).toEqual value: ',', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.comma.c'] + expect(tokens[7]).toEqual value: '"', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'string.quoted.double.c', 'punctuation.definition.string.begin.c'] + expect(tokens[8]).toEqual value: 'arg2', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'string.quoted.double.c'] + expect(tokens[9]).toEqual value: '"', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'string.quoted.double.c', 'punctuation.definition.string.end.c'] + expect(tokens[10]).toEqual value: ',', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.comma.c'] + expect(tokens[12]).toEqual value: '123', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'constant.numeric.c'] + expect(tokens[14]).toEqual value: '/*', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'comment.block.c', 'punctuation.definition.comment.begin.c'] + expect(tokens[15]).toEqual value: ' comment ', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'comment.block.c'] + expect(tokens[16]).toEqual value: '*/', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'comment.block.c', 'punctuation.definition.comment.end.c'] + expect(tokens[17]).toEqual value: ')', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.end.c'] it "tokenizes various _t types", -> {tokens} = grammar.tokenizeLine 'size_t var;' @@ -246,14 +246,14 @@ describe "Language-C", -> expect(tokens[7]).toEqual value: ' b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.c'] expect(tokens[10]).toEqual value: 'do', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.c'] - expect(tokens[12]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.definition.section.block.begin.c'] - expect(tokens[13]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] - expect(tokens[14]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.terminator.statement.c'] - expect(tokens[15]).toEqual value: ' b ^= a', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] - expect(tokens[16]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.terminator.statement.c'] - expect(tokens[17]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] - expect(tokens[18]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.terminator.statement.c'] - expect(tokens[20]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.definition.section.block.end.c'] + expect(tokens[12]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.section.block.begin.c'] + expect(tokens[13]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(tokens[14]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.terminator.statement.c'] + expect(tokens[15]).toEqual value: ' b ^= a', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(tokens[16]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.terminator.statement.c'] + expect(tokens[17]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(tokens[18]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.terminator.statement.c'] + expect(tokens[20]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.section.block.end.c'] expect(tokens[22]).toEqual value: 'while', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.c'] expect(tokens[24]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] expect(tokens[26]).toEqual value: '0', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] @@ -283,18 +283,18 @@ describe "Language-C", -> expect(lines[0][6]).toEqual value: ',', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c', 'punctuation.separator.parameters.c'] expect(lines[0][7]).toEqual value: ' b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] expect(lines[0][8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.c'] - expect(lines[0][10]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.definition.section.block.begin.c'] - expect(lines[0][12]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] - expect(lines[1][0]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] - expect(lines[1][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.terminator.statement.c'] - expect(lines[1][3]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] - expect(lines[2][0]).toEqual value: ' b ^= a', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] - expect(lines[2][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.terminator.statement.c'] - expect(lines[2][3]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] - expect(lines[3][0]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c'] - expect(lines[3][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.terminator.statement.c'] - expect(lines[3][3]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'constant.character.escape.line-continuation.c'] - expect(lines[4][0]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.block.c', 'punctuation.definition.section.block.end.c'] + expect(lines[0][10]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.section.block.begin.c'] + expect(lines[0][12]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.character.escape.line-continuation.c'] + expect(lines[1][0]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(lines[1][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.terminator.statement.c'] + expect(lines[1][3]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.character.escape.line-continuation.c'] + expect(lines[2][0]).toEqual value: ' b ^= a', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(lines[2][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.terminator.statement.c'] + expect(lines[2][3]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.character.escape.line-continuation.c'] + expect(lines[3][0]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c'] + expect(lines[3][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.terminator.statement.c'] + expect(lines[3][3]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.character.escape.line-continuation.c'] + expect(lines[4][0]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.section.block.end.c'] describe "includes", -> it "tokenizes '#include'", -> @@ -356,25 +356,25 @@ describe "Language-C", -> #endif } ''' - expect(lines[1][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[1][2]).toEqual value: 'if', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[1][3]).toEqual value: ' defined(CREDIT)', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c'] - expect(lines[2][1]).toEqual value: 'credit', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'support.function.any-method.c'] - expect(lines[2][2]).toEqual value: '(', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.begin.c'] - expect(lines[2][3]).toEqual value: ')', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.end.c'] - expect(lines[3][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[3][2]).toEqual value: 'elif', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[3][3]).toEqual value: ' defined(DEBIT)', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c'] - expect(lines[4][1]).toEqual value: 'debit', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'support.function.any-method.c'] - expect(lines[4][2]).toEqual value: '(', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.begin.c'] - expect(lines[4][3]).toEqual value: ')', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.end.c'] - expect(lines[5][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[5][2]).toEqual value: 'else', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[6][1]).toEqual value: 'printerror', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'support.function.any-method.c'] - expect(lines[6][2]).toEqual value: '(', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.begin.c'] - expect(lines[6][3]).toEqual value: ')', scopes: ['source.c', 'meta.block.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.end.c'] - expect(lines[7][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[7][2]).toEqual value: 'endif', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[1][1]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[1][2]).toEqual value: 'if', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[1][3]).toEqual value: ' defined(CREDIT)', scopes: ['source.c', 'meta.preprocessor.c'] + expect(lines[2][1]).toEqual value: 'credit', scopes: ['source.c', 'meta.function-call.c', 'support.function.any-method.c'] + expect(lines[2][2]).toEqual value: '(', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.begin.c'] + expect(lines[2][3]).toEqual value: ')', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.end.c'] + expect(lines[3][1]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[3][2]).toEqual value: 'elif', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[3][3]).toEqual value: ' defined(DEBIT)', scopes: ['source.c', 'meta.preprocessor.c'] + expect(lines[4][1]).toEqual value: 'debit', scopes: ['source.c', 'meta.function-call.c', 'support.function.any-method.c'] + expect(lines[4][2]).toEqual value: '(', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.begin.c'] + expect(lines[4][3]).toEqual value: ')', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.end.c'] + expect(lines[5][1]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[5][2]).toEqual value: 'else', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[6][1]).toEqual value: 'printerror', scopes: ['source.c', 'meta.function-call.c', 'support.function.any-method.c'] + expect(lines[6][2]).toEqual value: '(', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.begin.c'] + expect(lines[6][3]).toEqual value: ')', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.end.c'] + expect(lines[7][1]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[7][2]).toEqual value: 'endif', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] it "tokenizes if-true-else blocks", -> lines = grammar.tokenizeLines ''' @@ -397,16 +397,16 @@ describe "Language-C", -> expect(lines[0][3]).toEqual value: '1', scopes: ['source.c', 'meta.preprocessor.c', 'constant.numeric.preprocessor.c'] expect(lines[1][0]).toEqual value: 'int', scopes: ['source.c', 'storage.type.c'] expect(lines[1][2]).toEqual value: 'something', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[2][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[2][2]).toEqual value: 'if', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[2][4]).toEqual value: '1', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'constant.numeric.preprocessor.c'] - expect(lines[3][1]).toEqual value: 'return', scopes: ['source.c', 'meta.block.c', 'keyword.control.c'] - expect(lines[3][3]).toEqual value: '1', scopes: ['source.c', 'meta.block.c', 'constant.numeric.c'] - expect(lines[4][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[4][2]).toEqual value: 'else', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[5][0]).toEqual value: ' return 0;', scopes: ['source.c', 'meta.block.c', 'comment.block.preprocessor.else-branch.in-block'] - expect(lines[6][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[6][2]).toEqual value: 'endif', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[2][1]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[2][2]).toEqual value: 'if', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[2][4]).toEqual value: '1', scopes: ['source.c', 'meta.preprocessor.c', 'constant.numeric.preprocessor.c'] + expect(lines[3][1]).toEqual value: 'return', scopes: ['source.c', 'keyword.control.c'] + expect(lines[3][3]).toEqual value: '1', scopes: ['source.c', 'constant.numeric.c'] + expect(lines[4][1]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[4][2]).toEqual value: 'else', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[5][0]).toEqual value: ' return 0;', scopes: ['source.c', 'comment.block.preprocessor.else-branch.in-block'] + expect(lines[6][1]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[6][2]).toEqual value: 'endif', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[8][0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[8][1]).toEqual value: 'else', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[9][0]).toEqual value: 'int something() {', scopes: ['source.c', 'comment.block.preprocessor.else-branch'] @@ -425,16 +425,16 @@ describe "Language-C", -> ''' expect(lines[0][0]).toEqual value: 'int', scopes: ['source.c', 'storage.type.c'] expect(lines[0][2]).toEqual value: 'something', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[1][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[1][2]).toEqual value: 'if', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[1][4]).toEqual value: '0', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'constant.numeric.preprocessor.c'] - expect(lines[2][0]).toEqual value: ' return 1;', scopes: ['source.c', 'meta.block.c', 'comment.block.preprocessor.if-branch.in-block'] - expect(lines[3][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[3][2]).toEqual value: 'else', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[4][1]).toEqual value: 'return', scopes: ['source.c', 'meta.block.c', 'keyword.control.c'] - expect(lines[4][3]).toEqual value: '0', scopes: ['source.c', 'meta.block.c', 'constant.numeric.c'] - expect(lines[5][1]).toEqual value: '#', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[5][2]).toEqual value: 'endif', scopes: ['source.c', 'meta.block.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[1][1]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[1][2]).toEqual value: 'if', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[1][4]).toEqual value: '0', scopes: ['source.c', 'meta.preprocessor.c', 'constant.numeric.preprocessor.c'] + expect(lines[2][0]).toEqual value: ' return 1;', scopes: ['source.c', 'comment.block.preprocessor.if-branch.in-block'] + expect(lines[3][1]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[3][2]).toEqual value: 'else', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[4][1]).toEqual value: 'return', scopes: ['source.c', 'keyword.control.c'] + expect(lines[4][3]).toEqual value: '0', scopes: ['source.c', 'constant.numeric.c'] + expect(lines[5][1]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[5][2]).toEqual value: 'endif', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] lines = grammar.tokenizeLines ''' #if 0 From da8ee72df360e56ebec425ef0d55cc0b98c6d503 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Thu, 4 Feb 2016 10:36:07 +0300 Subject: [PATCH 08/18] :bug: Tokenize unmatched curly bracket --- grammars/c.cson | 4 ++++ spec/c-spec.coffee | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/grammars/c.cson b/grammars/c.cson index 1f3ae4f..a99d982 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -216,6 +216,10 @@ { 'include': '#block' } + { + 'match': '}' + 'name': 'punctuation.definition.section.block.end.c' + } { 'begin': '''(?x) (?: diff --git a/spec/c-spec.coffee b/spec/c-spec.coffee index 55d22f7..5bd6da6 100644 --- a/spec/c-spec.coffee +++ b/spec/c-spec.coffee @@ -629,7 +629,7 @@ describe "Language-C", -> expect(lines[3][2]).toEqual value: ' legacy C code here', scopes: ['source.cpp', 'comment.line.double-slash.c++'] expect(lines[4][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[4][1]).toEqual value: 'ifdef', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[5][0]).toEqual value: '}', scopes: ['source.cpp'] + expect(lines[5][0]).toEqual value: '}', scopes: ['source.cpp', 'punctuation.definition.section.block.end.c'] expect(lines[6][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[6][1]).toEqual value: 'endif', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] From 8ef80ceb4119f7c4f34b3de5a1fc648efe3ab28b Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Thu, 4 Feb 2016 11:22:42 +0300 Subject: [PATCH 09/18] Wrap brackets with `meta.brace` e.g. Solarized styles it --- grammars/c++.cson | 30 +++++++++++++++++++--------- grammars/c.cson | 34 ++++++++++++++++++++++--------- spec/c-spec.coffee | 50 ++++++++++++++++++++++++---------------------- 3 files changed, 72 insertions(+), 42 deletions(-) diff --git a/grammars/c++.cson b/grammars/c++.cson index 4e2a755..0168595 100644 --- a/grammars/c++.cson +++ b/grammars/c++.cson @@ -126,13 +126,17 @@ } ] 'block': - 'begin': '{' + 'begin': '({)' 'beginCaptures': '0': + 'name': 'meta.brace.curly.scope-is-for-back-capability.c' + '1': 'name': 'punctuation.definition.section.block.begin.c' - 'end': '}' + 'end': '(})' 'endCaptures': '0': + 'name': 'meta.brace.curly.scope-is-for-back-capability.c' + '1': 'name': 'punctuation.definition.section.block.end.c' 'patterns': [ { @@ -268,15 +272,19 @@ 'include': '#angle_brackets' } { - 'begin': '{' + 'begin': '({)' 'beginCaptures': '0': - 'name': 'punctuation.definition.section.block.begin.cpp' - 'end': '}(\\s*\\n)?' + 'name': 'meta.brace.curly.scope-is-for-back-capability.c' + '1': + 'name': 'punctuation.definition.section.block.begin.c' + 'end': '((}))(\\s*\\n)?' 'endCaptures': '1': - 'name': 'punctuation.definition.section.block.end.cpp' + 'name': 'meta.brace.curly.scope-is-for-back-capability.c' '2': + 'name': 'punctuation.definition.section.block.begin.c' + '3': 'name': 'invalid.illegal.you-forgot-semicolon.cpp' 'patterns': [ { @@ -304,13 +312,17 @@ 'name': 'meta.extern-block.cpp' 'patterns': [ { - 'begin': '{' + 'begin': '({)' 'beginCaptures': '0': + 'name': 'meta.brace.curly.scope-is-for-back-capability.c' + '1': 'name': 'punctuation.definition.section.block.begin.c' - 'end': '}|(?=\\s*#\\s*endif\\b)' + 'end': '((}))|(?=\\s*#\\s*endif\\b)' 'endCaptures': - '0': + '1': + 'name': 'meta.brace.curly.scope-is-for-back-capability.c' + '2': 'name': 'punctuation.definition.section.block.end.c' 'patterns': [ { diff --git a/grammars/c.cson b/grammars/c.cson index a99d982..17fbf48 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -217,8 +217,12 @@ 'include': '#block' } { - 'match': '}' - 'name': 'punctuation.definition.section.block.end.c' + 'match': '(})' + 'captures': + '0': + 'name': 'meta.brace.curly.scope-is-for-back-capability.c' + '1': + 'name': 'punctuation.definition.section.block.end.c' } { 'begin': '''(?x) @@ -269,13 +273,17 @@ 'block': 'patterns': [ { - 'begin': '{' + 'begin': '({)' 'beginCaptures': '0': + 'name': 'meta.brace.curly.scope-is-for-back-capability.c' + '1': 'name': 'punctuation.definition.section.block.begin.c' - 'end': '}|(?=\\s*#\\s*endif\\b)' + 'end': '((}))|(?=\\s*#\\s*endif\\b)' 'endCaptures': - '0': + '1': + 'name': 'meta.brace.curly.scope-is-for-back-capability.c' + '2': 'name': 'punctuation.definition.section.block.end.c' 'patterns': [ { @@ -723,13 +731,17 @@ 'punctuation': 'patterns': [ { - 'begin': '\\(' + 'begin': '(\\()' 'beginCaptures': '0': + 'name': 'meta.brace.round.scope-is-for-back-capability.c' + '1': 'name': 'punctuation.bracket.round.c' - 'end': '\\)' + 'end': '(\\))' 'endCaptures': '0': + 'name': 'meta.brace.round.scope-is-for-back-capability.c' + '1': 'name': 'punctuation.bracket.round.c' 'patterns': [ { @@ -738,8 +750,12 @@ ] } { - 'match': '\\[|\\]' - 'name': 'punctuation.bracket.square.c' + 'match': '(\\[|\\])' + 'captures': + '0': + 'name': 'meta.brace.square.scope-is-for-back-capability.c' + '1': + 'name': 'punctuation.bracket.square.c' } { 'match': ',' diff --git a/spec/c-spec.coffee b/spec/c-spec.coffee index 5bd6da6..871c181 100644 --- a/spec/c-spec.coffee +++ b/spec/c-spec.coffee @@ -32,10 +32,10 @@ describe "Language-C", -> expect(lines[0][3]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.begin.c'] expect(lines[0][4]).toEqual value: 'int', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'storage.type.c'] expect(lines[0][6]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.end.c'] - expect(lines[0][8]).toEqual value: '{', scopes: ['source.c', 'punctuation.definition.section.block.begin.c'] + expect(lines[0][8]).toEqual value: '{', scopes: ['source.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.begin.c'] expect(lines[1][1]).toEqual value: 'return', scopes: ['source.c', 'keyword.control.c'] expect(lines[1][3]).toEqual value: '0', scopes: ['source.c', 'constant.numeric.c'] - expect(lines[2][0]).toEqual value: '}', scopes: ['source.c', 'punctuation.definition.section.block.end.c'] + expect(lines[2][0]).toEqual value: '}', scopes: ['source.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.end.c'] lines = grammar.tokenizeLines ''' int fn ( @@ -128,8 +128,6 @@ describe "Language-C", -> describe "punctuation", -> it "tokenizes punctuation marks", -> punctuation = - ']': 'punctuation.bracket.square.c' - '[': 'punctuation.bracket.square.c' ',': 'punctuation.comma.c' '.': 'punctuation.period.c' ';': 'punctuation.terminator.statement.c' @@ -139,8 +137,12 @@ describe "Language-C", -> expect(tokens[0]).toEqual value: token, scopes: ['source.c', scope] {tokens} = grammar.tokenizeLine '()' - expect(tokens[0]).toEqual value: '(', scopes: ['source.c', 'punctuation.bracket.round.c'] - expect(tokens[1]).toEqual value: ')', scopes: ['source.c', 'punctuation.bracket.round.c'] + expect(tokens[0]).toEqual value: '(', scopes: ['source.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] + expect(tokens[1]).toEqual value: ')', scopes: ['source.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] + + {tokens} = grammar.tokenizeLine '[]' + expect(tokens[0]).toEqual value: '[', scopes: ['source.c', 'meta.brace.square.scope-is-for-back-capability.c', 'punctuation.bracket.square.c'] + expect(tokens[1]).toEqual value: ']', scopes: ['source.c', 'meta.brace.square.scope-is-for-back-capability.c', 'punctuation.bracket.square.c'] describe "preprocessor directives", -> it "tokenizes '#line'", -> @@ -202,11 +204,11 @@ describe "Language-C", -> expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c', 'punctuation.definition.directive.c'] expect(tokens[1]).toEqual value: 'define', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c'] expect(tokens[3]).toEqual value: 'PI_PLUS_ONE', scopes: ['source.c', 'meta.preprocessor.macro.c', 'entity.name.function.preprocessor.c'] - expect(tokens[5]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] + expect(tokens[5]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] expect(tokens[6]).toEqual value: '3.14', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] expect(tokens[7]).toEqual value: ' + ', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(tokens[8]).toEqual value: '1', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] - expect(tokens[9]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] + expect(tokens[9]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] describe "macros", -> it "tokenizes them", -> @@ -228,13 +230,13 @@ describe "Language-C", -> expect(tokens[6]).toEqual value: ',', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c', 'punctuation.separator.parameters.c'] expect(tokens[7]).toEqual value: ' y', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.c'] - expect(tokens[10]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] + expect(tokens[10]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] expect(tokens[11]).toEqual value: 'x', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[12]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] + expect(tokens[12]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] expect(tokens[13]).toEqual value: ' * ', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[14]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] + expect(tokens[14]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] expect(tokens[15]).toEqual value: 'y', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[16]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] + expect(tokens[16]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] {tokens} = grammar.tokenizeLine '#define SWAP(a, b) do { a ^= b; b ^= a; a ^= b; } while ( 0 )' expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c', 'punctuation.definition.directive.c'] @@ -246,26 +248,26 @@ describe "Language-C", -> expect(tokens[7]).toEqual value: ' b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.c'] expect(tokens[10]).toEqual value: 'do', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.c'] - expect(tokens[12]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.section.block.begin.c'] + expect(tokens[12]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.begin.c'] expect(tokens[13]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(tokens[14]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.terminator.statement.c'] expect(tokens[15]).toEqual value: ' b ^= a', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(tokens[16]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.terminator.statement.c'] expect(tokens[17]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(tokens[18]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.terminator.statement.c'] - expect(tokens[20]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.section.block.end.c'] + expect(tokens[20]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.end.c'] expect(tokens[22]).toEqual value: 'while', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.c'] - expect(tokens[24]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] + expect(tokens[24]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] expect(tokens[26]).toEqual value: '0', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] - expect(tokens[28]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] + expect(tokens[28]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] it "tokenizes multiline macros", -> lines = grammar.tokenizeLines ''' #define max(a,b) (a>b)? \\ a:b ''' - expect(lines[0][10]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] - expect(lines[0][12]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] + expect(lines[0][10]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] + expect(lines[0][12]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] expect(lines[0][14]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.character.escape.line-continuation.c'] lines = grammar.tokenizeLines ''' @@ -283,7 +285,7 @@ describe "Language-C", -> expect(lines[0][6]).toEqual value: ',', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c', 'punctuation.separator.parameters.c'] expect(lines[0][7]).toEqual value: ' b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] expect(lines[0][8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.c'] - expect(lines[0][10]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.section.block.begin.c'] + expect(lines[0][10]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.begin.c'] expect(lines[0][12]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.character.escape.line-continuation.c'] expect(lines[1][0]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(lines[1][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.terminator.statement.c'] @@ -294,7 +296,7 @@ describe "Language-C", -> expect(lines[3][0]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(lines[3][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.terminator.statement.c'] expect(lines[3][3]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.character.escape.line-continuation.c'] - expect(lines[4][0]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.section.block.end.c'] + expect(lines[4][0]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.end.c'] describe "includes", -> it "tokenizes '#include'", -> @@ -598,13 +600,13 @@ describe "Language-C", -> expect(lines[0][2]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c', 'punctuation.definition.string.begin.c'] expect(lines[0][3]).toEqual value: 'C', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c'] expect(lines[0][4]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c', 'punctuation.definition.string.end.c'] - expect(lines[0][6]).toEqual value: '{', scopes: ['source.cpp', 'meta.extern-block.cpp', 'punctuation.definition.section.block.begin.c'] + expect(lines[0][6]).toEqual value: '{', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.begin.c'] expect(lines[1][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'keyword.control.directive.include.c', 'punctuation.definition.directive.c'] expect(lines[1][1]).toEqual value: 'include', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'keyword.control.directive.include.c'] expect(lines[1][3]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'string.quoted.double.include.c', 'punctuation.definition.string.begin.c'] expect(lines[1][4]).toEqual value: 'legacy_C_header.h', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'string.quoted.double.include.c'] expect(lines[1][5]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'string.quoted.double.include.c', 'punctuation.definition.string.end.c'] - expect(lines[2][0]).toEqual value: '}', scopes: ['source.cpp', 'meta.extern-block.cpp', 'punctuation.definition.section.block.end.c'] + expect(lines[2][0]).toEqual value: '}', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.end.c'] lines = grammar.tokenizeLines ''' #ifdef __cplusplus @@ -622,14 +624,14 @@ describe "Language-C", -> expect(lines[1][2]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c', 'punctuation.definition.string.begin.c'] expect(lines[1][3]).toEqual value: 'C', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c'] expect(lines[1][4]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c', 'punctuation.definition.string.end.c'] - expect(lines[1][6]).toEqual value: '{', scopes: ['source.cpp', 'meta.extern-block.cpp', 'punctuation.definition.section.block.begin.c'] + expect(lines[1][6]).toEqual value: '{', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.begin.c'] expect(lines[2][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[2][1]).toEqual value: 'endif', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[3][1]).toEqual value: '//', scopes: ['source.cpp', 'comment.line.double-slash.c++', 'punctuation.definition.comment.c++'] expect(lines[3][2]).toEqual value: ' legacy C code here', scopes: ['source.cpp', 'comment.line.double-slash.c++'] expect(lines[4][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[4][1]).toEqual value: 'ifdef', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[5][0]).toEqual value: '}', scopes: ['source.cpp', 'punctuation.definition.section.block.end.c'] + expect(lines[5][0]).toEqual value: '}', scopes: ['source.cpp', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.end.c'] expect(lines[6][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[6][1]).toEqual value: 'endif', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] From eaf7b00a1768b9c34b2653f811f15c2ec7223982 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Thu, 4 Feb 2016 11:33:38 +0300 Subject: [PATCH 10/18] Add `bracket.curly/round/square` subscopes Allows to style all brackets with `.bracket` selector --- grammars/c++.cson | 20 +++++++++---------- grammars/c.cson | 16 ++++++++-------- spec/c-spec.coffee | 48 +++++++++++++++++++++++----------------------- 3 files changed, 42 insertions(+), 42 deletions(-) diff --git a/grammars/c++.cson b/grammars/c++.cson index 0168595..5cbbce6 100644 --- a/grammars/c++.cson +++ b/grammars/c++.cson @@ -81,11 +81,11 @@ '1': 'name': 'entity.name.function.cpp' '2': - 'name': 'punctuation.definition.parameters.begin.c' + 'name': 'punctuation.definition.parameters.begin.bracket.round.c' 'end': '\\)' 'endCaptures': '0': - 'name': 'punctuation.definition.parameters.end.c' + 'name': 'punctuation.definition.parameters.end.bracket.round.c' 'name': 'meta.function.destructor.cpp' 'patterns': [ { @@ -99,11 +99,11 @@ '1': 'name': 'entity.name.function.cpp' '2': - 'name': 'punctuation.definition.parameters.begin.c' + 'name': 'punctuation.definition.parameters.begin.bracket.round.c' 'end': '\\)' 'endCaptures': '0': - 'name': 'punctuation.definition.parameters.end.c' + 'name': 'punctuation.definition.parameters.end.bracket.round.c' 'name': 'meta.function.destructor.prototype.cpp' 'patterns': [ { @@ -131,13 +131,13 @@ '0': 'name': 'meta.brace.curly.scope-is-for-back-capability.c' '1': - 'name': 'punctuation.definition.section.block.begin.c' + 'name': 'punctuation.definition.section.block.begin.bracket.curly.c' 'end': '(})' 'endCaptures': '0': 'name': 'meta.brace.curly.scope-is-for-back-capability.c' '1': - 'name': 'punctuation.definition.section.block.end.c' + 'name': 'punctuation.definition.section.block.end.bracket.curly.c' 'patterns': [ { 'captures': @@ -277,13 +277,13 @@ '0': 'name': 'meta.brace.curly.scope-is-for-back-capability.c' '1': - 'name': 'punctuation.definition.section.block.begin.c' + 'name': 'punctuation.definition.section.block.begin.bracket.curly.c' 'end': '((}))(\\s*\\n)?' 'endCaptures': '1': 'name': 'meta.brace.curly.scope-is-for-back-capability.c' '2': - 'name': 'punctuation.definition.section.block.begin.c' + 'name': 'punctuation.definition.section.block.begin.bracket.curly.c' '3': 'name': 'invalid.illegal.you-forgot-semicolon.cpp' 'patterns': [ @@ -317,13 +317,13 @@ '0': 'name': 'meta.brace.curly.scope-is-for-back-capability.c' '1': - 'name': 'punctuation.definition.section.block.begin.c' + 'name': 'punctuation.definition.section.block.begin.bracket.curly.c' 'end': '((}))|(?=\\s*#\\s*endif\\b)' 'endCaptures': '1': 'name': 'meta.brace.curly.scope-is-for-back-capability.c' '2': - 'name': 'punctuation.definition.section.block.end.c' + 'name': 'punctuation.definition.section.block.end.bracket.curly.c' 'patterns': [ { 'include': '#special_block' diff --git a/grammars/c.cson b/grammars/c.cson index 17fbf48..c583a91 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -78,13 +78,13 @@ '3': 'name': 'entity.name.function.preprocessor.c' '5': - 'name': 'punctuation.definition.parameters.begin.c' + 'name': 'punctuation.definition.parameters.begin.bracket.round.c' '6': 'name': 'variable.parameter.preprocessor.c' '8': 'name': 'punctuation.separator.parameters.c' '9': - 'name': 'punctuation.definition.parameters.end.c' + 'name': 'punctuation.definition.parameters.end.bracket.round.c' 'end': '(?=(?://|/\\*))|(?=+!]+ | \\(\\) | \\[\\] ) ) # if it is a C++ operator\n\t\t\t)\n\t\t\t \\s*(\\()' 'name': 'meta.initialization.c' } @@ -438,11 +438,11 @@ 'begin': '(\\()' 'beginCaptures': '1': - 'name': 'punctuation.definition.parameters.begin.c' + 'name': 'punctuation.definition.parameters.begin.bracket.round.c' 'end': '(\\))' 'endCaptures': '1': - 'name': 'punctuation.definition.parameters.end.c' + 'name': 'punctuation.definition.parameters.end.bracket.round.c' 'name': 'meta.parameters.c' 'patterns': [ { diff --git a/spec/c-spec.coffee b/spec/c-spec.coffee index 871c181..e2da63b 100644 --- a/spec/c-spec.coffee +++ b/spec/c-spec.coffee @@ -29,13 +29,13 @@ describe "Language-C", -> ''' expect(lines[0][0]).toEqual value: 'int', scopes: ['source.c', 'storage.type.c'] expect(lines[0][2]).toEqual value: 'something', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[0][3]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.begin.c'] + expect(lines[0][3]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.begin.bracket.round.c'] expect(lines[0][4]).toEqual value: 'int', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'storage.type.c'] - expect(lines[0][6]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.end.c'] - expect(lines[0][8]).toEqual value: '{', scopes: ['source.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.begin.c'] + expect(lines[0][6]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.end.bracket.round.c'] + expect(lines[0][8]).toEqual value: '{', scopes: ['source.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.begin.bracket.curly.c'] expect(lines[1][1]).toEqual value: 'return', scopes: ['source.c', 'keyword.control.c'] expect(lines[1][3]).toEqual value: '0', scopes: ['source.c', 'constant.numeric.c'] - expect(lines[2][0]).toEqual value: '}', scopes: ['source.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.end.c'] + expect(lines[2][0]).toEqual value: '}', scopes: ['source.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.end.bracket.curly.c'] lines = grammar.tokenizeLines ''' int fn ( @@ -45,7 +45,7 @@ describe "Language-C", -> ''' expect(lines[0][0]).toEqual value: 'int', scopes: ['source.c', 'storage.type.c'] expect(lines[0][2]).toEqual value: 'fn', scopes: ['source.c', 'meta.function.c', 'entity.name.function.c'] - expect(lines[0][4]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.begin.c'] + expect(lines[0][4]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.begin.bracket.round.c'] expect(lines[1][1]).toEqual value: 'int', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'storage.type.c'] expect(lines[1][2]).toEqual value: ' p1', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c'] expect(lines[1][3]).toEqual value: ',', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.comma.c'] @@ -54,7 +54,7 @@ describe "Language-C", -> expect(lines[1][7]).toEqual value: '*/', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'comment.block.c', 'punctuation.definition.comment.end.c'] expect(lines[2][1]).toEqual value: 'int', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'storage.type.c'] expect(lines[2][2]).toEqual value: ' * p2', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c'] - expect(lines[3][0]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.end.c'] + expect(lines[3][0]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.end.bracket.round.c'] expect(lines[3][1]).toEqual value: ';', scopes: ['source.c', 'punctuation.terminator.statement.c'] it "tokenizes function calls", -> @@ -196,9 +196,9 @@ describe "Language-C", -> expect(tokens[3]).toEqual value: 'ABC', scopes: ['source.c', 'meta.preprocessor.macro.c', 'entity.name.function.preprocessor.c'] expect(tokens[4]).toEqual value: ' ', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'punctuation.whitespace.function.leading.c'] expect(tokens[5]).toEqual value: 'XYZ', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'entity.name.function.c'] - expect(tokens[6]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.begin.c'] + expect(tokens[6]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.begin.bracket.round.c'] expect(tokens[7]).toEqual value: '1', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'meta.parameters.c', 'constant.numeric.c'] - expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.end.c'] + expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.end.bracket.round.c'] {tokens} = grammar.tokenizeLine '#define PI_PLUS_ONE (3.14 + 1)' expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c', 'punctuation.definition.directive.c'] @@ -216,20 +216,20 @@ describe "Language-C", -> expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c', 'punctuation.definition.directive.c'] expect(tokens[1]).toEqual value: 'define', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c'] expect(tokens[3]).toEqual value: 'INCREMENT', scopes: ['source.c', 'meta.preprocessor.macro.c', 'entity.name.function.preprocessor.c'] - expect(tokens[4]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.begin.c'] + expect(tokens[4]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.begin.bracket.round.c'] expect(tokens[5]).toEqual value: 'x', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] - expect(tokens[6]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.c'] + expect(tokens[6]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.bracket.round.c'] expect(tokens[7]).toEqual value: ' x++', scopes: ['source.c', 'meta.preprocessor.macro.c'] {tokens} = grammar.tokenizeLine '#define MULT(x, y) (x) * (y)' expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c', 'punctuation.definition.directive.c'] expect(tokens[1]).toEqual value: 'define', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c'] expect(tokens[3]).toEqual value: 'MULT', scopes: ['source.c', 'meta.preprocessor.macro.c', 'entity.name.function.preprocessor.c'] - expect(tokens[4]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.begin.c'] + expect(tokens[4]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.begin.bracket.round.c'] expect(tokens[5]).toEqual value: 'x', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] expect(tokens[6]).toEqual value: ',', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c', 'punctuation.separator.parameters.c'] expect(tokens[7]).toEqual value: ' y', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] - expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.c'] + expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.bracket.round.c'] expect(tokens[10]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] expect(tokens[11]).toEqual value: 'x', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(tokens[12]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] @@ -242,20 +242,20 @@ describe "Language-C", -> expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c', 'punctuation.definition.directive.c'] expect(tokens[1]).toEqual value: 'define', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c'] expect(tokens[3]).toEqual value: 'SWAP', scopes: ['source.c', 'meta.preprocessor.macro.c', 'entity.name.function.preprocessor.c'] - expect(tokens[4]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.begin.c'] + expect(tokens[4]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.begin.bracket.round.c'] expect(tokens[5]).toEqual value: 'a', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] expect(tokens[6]).toEqual value: ',', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c', 'punctuation.separator.parameters.c'] expect(tokens[7]).toEqual value: ' b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] - expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.c'] + expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.bracket.round.c'] expect(tokens[10]).toEqual value: 'do', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.c'] - expect(tokens[12]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.begin.c'] + expect(tokens[12]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.begin.bracket.curly.c'] expect(tokens[13]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(tokens[14]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.terminator.statement.c'] expect(tokens[15]).toEqual value: ' b ^= a', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(tokens[16]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.terminator.statement.c'] expect(tokens[17]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(tokens[18]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.terminator.statement.c'] - expect(tokens[20]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.end.c'] + expect(tokens[20]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.end.bracket.curly.c'] expect(tokens[22]).toEqual value: 'while', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.c'] expect(tokens[24]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] expect(tokens[26]).toEqual value: '0', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] @@ -280,12 +280,12 @@ describe "Language-C", -> expect(lines[0][0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c', 'punctuation.definition.directive.c'] expect(lines[0][1]).toEqual value: 'define', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c'] expect(lines[0][3]).toEqual value: 'SWAP', scopes: ['source.c', 'meta.preprocessor.macro.c', 'entity.name.function.preprocessor.c'] - expect(lines[0][4]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.begin.c'] + expect(lines[0][4]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.begin.bracket.round.c'] expect(lines[0][5]).toEqual value: 'a', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] expect(lines[0][6]).toEqual value: ',', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c', 'punctuation.separator.parameters.c'] expect(lines[0][7]).toEqual value: ' b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] - expect(lines[0][8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.c'] - expect(lines[0][10]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.begin.c'] + expect(lines[0][8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.bracket.round.c'] + expect(lines[0][10]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.begin.bracket.curly.c'] expect(lines[0][12]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.character.escape.line-continuation.c'] expect(lines[1][0]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(lines[1][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.terminator.statement.c'] @@ -296,7 +296,7 @@ describe "Language-C", -> expect(lines[3][0]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(lines[3][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.terminator.statement.c'] expect(lines[3][3]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.character.escape.line-continuation.c'] - expect(lines[4][0]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.end.c'] + expect(lines[4][0]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.end.bracket.curly.c'] describe "includes", -> it "tokenizes '#include'", -> @@ -600,13 +600,13 @@ describe "Language-C", -> expect(lines[0][2]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c', 'punctuation.definition.string.begin.c'] expect(lines[0][3]).toEqual value: 'C', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c'] expect(lines[0][4]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c', 'punctuation.definition.string.end.c'] - expect(lines[0][6]).toEqual value: '{', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.begin.c'] + expect(lines[0][6]).toEqual value: '{', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.begin.bracket.curly.c'] expect(lines[1][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'keyword.control.directive.include.c', 'punctuation.definition.directive.c'] expect(lines[1][1]).toEqual value: 'include', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'keyword.control.directive.include.c'] expect(lines[1][3]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'string.quoted.double.include.c', 'punctuation.definition.string.begin.c'] expect(lines[1][4]).toEqual value: 'legacy_C_header.h', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'string.quoted.double.include.c'] expect(lines[1][5]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'string.quoted.double.include.c', 'punctuation.definition.string.end.c'] - expect(lines[2][0]).toEqual value: '}', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.end.c'] + expect(lines[2][0]).toEqual value: '}', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.end.bracket.curly.c'] lines = grammar.tokenizeLines ''' #ifdef __cplusplus @@ -624,14 +624,14 @@ describe "Language-C", -> expect(lines[1][2]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c', 'punctuation.definition.string.begin.c'] expect(lines[1][3]).toEqual value: 'C', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c'] expect(lines[1][4]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c', 'punctuation.definition.string.end.c'] - expect(lines[1][6]).toEqual value: '{', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.begin.c'] + expect(lines[1][6]).toEqual value: '{', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.begin.bracket.curly.c'] expect(lines[2][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[2][1]).toEqual value: 'endif', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[3][1]).toEqual value: '//', scopes: ['source.cpp', 'comment.line.double-slash.c++', 'punctuation.definition.comment.c++'] expect(lines[3][2]).toEqual value: ' legacy C code here', scopes: ['source.cpp', 'comment.line.double-slash.c++'] expect(lines[4][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[4][1]).toEqual value: 'ifdef', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[5][0]).toEqual value: '}', scopes: ['source.cpp', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.end.c'] + expect(lines[5][0]).toEqual value: '}', scopes: ['source.cpp', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.end.bracket.curly.c'] expect(lines[6][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[6][1]).toEqual value: 'endif', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] From f7160dcbedef9a8d2b785aa5d926f6d7bee3b110 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Thu, 4 Feb 2016 11:35:25 +0300 Subject: [PATCH 11/18] Rename 'punctuation.comma/period' -> 'punctuation.separator.comma/period' --- grammars/c.cson | 4 ++-- spec/c-spec.coffee | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/grammars/c.cson b/grammars/c.cson index c583a91..375b05f 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -759,11 +759,11 @@ } { 'match': ',' - 'name': 'punctuation.comma.c' + 'name': 'punctuation.separator.comma.c' } { 'match': '\\.' - 'name': 'punctuation.period.c' + 'name': 'punctuation.separator.period.c' } { 'match': ';' diff --git a/spec/c-spec.coffee b/spec/c-spec.coffee index e2da63b..95eab89 100644 --- a/spec/c-spec.coffee +++ b/spec/c-spec.coffee @@ -48,7 +48,7 @@ describe "Language-C", -> expect(lines[0][4]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.begin.bracket.round.c'] expect(lines[1][1]).toEqual value: 'int', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'storage.type.c'] expect(lines[1][2]).toEqual value: ' p1', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c'] - expect(lines[1][3]).toEqual value: ',', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.comma.c'] + expect(lines[1][3]).toEqual value: ',', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.separator.comma.c'] expect(lines[1][5]).toEqual value: '/*', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'comment.block.c', 'punctuation.definition.comment.begin.c'] expect(lines[1][6]).toEqual value: ' comment ', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'comment.block.c'] expect(lines[1][7]).toEqual value: '*/', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'comment.block.c', 'punctuation.definition.comment.end.c'] @@ -62,11 +62,11 @@ describe "Language-C", -> expect(tokens[2]).toEqual value: 'fn', scopes: ['source.c', 'meta.function-call.c', 'support.function.any-method.c'] expect(tokens[3]).toEqual value: '(', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.begin.c'] expect(tokens[4]).toEqual value: 'arg1', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c'] - expect(tokens[5]).toEqual value: ',', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.comma.c'] + expect(tokens[5]).toEqual value: ',', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.separator.comma.c'] expect(tokens[7]).toEqual value: '"', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'string.quoted.double.c', 'punctuation.definition.string.begin.c'] expect(tokens[8]).toEqual value: 'arg2', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'string.quoted.double.c'] expect(tokens[9]).toEqual value: '"', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'string.quoted.double.c', 'punctuation.definition.string.end.c'] - expect(tokens[10]).toEqual value: ',', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.comma.c'] + expect(tokens[10]).toEqual value: ',', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.separator.comma.c'] expect(tokens[12]).toEqual value: '123', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'constant.numeric.c'] expect(tokens[14]).toEqual value: '/*', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'comment.block.c', 'punctuation.definition.comment.begin.c'] expect(tokens[15]).toEqual value: ' comment ', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'comment.block.c'] @@ -128,8 +128,8 @@ describe "Language-C", -> describe "punctuation", -> it "tokenizes punctuation marks", -> punctuation = - ',': 'punctuation.comma.c' - '.': 'punctuation.period.c' + ',': 'punctuation.separator.comma.c' + '.': 'punctuation.separator.period.c' ';': 'punctuation.terminator.statement.c' for token, scope of punctuation @@ -315,7 +315,7 @@ describe "Language-C", -> expect(tokens[4]).toEqual value: '>', scopes: ['source.c', 'meta.preprocessor.include.c', 'string.quoted.other.lt-gt.include.c', 'punctuation.definition.string.end.c'] {tokens} = grammar.tokenizeLine '#include_' - expect(tokens[1]).toEqual value: '.', scopes: ['source.c', 'punctuation.period.c'] + expect(tokens[1]).toEqual value: '.', scopes: ['source.c', 'punctuation.separator.period.c'] {tokens} = grammar.tokenizeLine '#include "file"' expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.include.c', 'keyword.control.directive.include.c', 'punctuation.definition.directive.c'] From 57ec9ef0e25608310ff39236be8ffccb82269f13 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Thu, 4 Feb 2016 14:42:36 +0300 Subject: [PATCH 12/18] Revert 'Wrap brackets with `meta.brace`' --- grammars/c++.cson | 26 +++++++----------------- grammars/c.cson | 28 +++++++------------------- spec/c-spec.coffee | 50 ++++++++++++++++++++++------------------------ 3 files changed, 38 insertions(+), 66 deletions(-) diff --git a/grammars/c++.cson b/grammars/c++.cson index 5cbbce6..e4185c2 100644 --- a/grammars/c++.cson +++ b/grammars/c++.cson @@ -126,17 +126,13 @@ } ] 'block': - 'begin': '({)' + 'begin': '{' 'beginCaptures': '0': - 'name': 'meta.brace.curly.scope-is-for-back-capability.c' - '1': 'name': 'punctuation.definition.section.block.begin.bracket.curly.c' - 'end': '(})' + 'end': '}' 'endCaptures': '0': - 'name': 'meta.brace.curly.scope-is-for-back-capability.c' - '1': 'name': 'punctuation.definition.section.block.end.bracket.curly.c' 'patterns': [ { @@ -272,19 +268,15 @@ 'include': '#angle_brackets' } { - 'begin': '({)' + 'begin': '{' 'beginCaptures': '0': - 'name': 'meta.brace.curly.scope-is-for-back-capability.c' - '1': 'name': 'punctuation.definition.section.block.begin.bracket.curly.c' - 'end': '((}))(\\s*\\n)?' + 'end': '(})(\\s*\\n)?' 'endCaptures': '1': - 'name': 'meta.brace.curly.scope-is-for-back-capability.c' - '2': 'name': 'punctuation.definition.section.block.begin.bracket.curly.c' - '3': + '2': 'name': 'invalid.illegal.you-forgot-semicolon.cpp' 'patterns': [ { @@ -312,17 +304,13 @@ 'name': 'meta.extern-block.cpp' 'patterns': [ { - 'begin': '({)' + 'begin': '{' 'beginCaptures': '0': - 'name': 'meta.brace.curly.scope-is-for-back-capability.c' - '1': 'name': 'punctuation.definition.section.block.begin.bracket.curly.c' - 'end': '((}))|(?=\\s*#\\s*endif\\b)' + 'end': '(})|(?=\\s*#\\s*endif\\b)' 'endCaptures': '1': - 'name': 'meta.brace.curly.scope-is-for-back-capability.c' - '2': 'name': 'punctuation.definition.section.block.end.bracket.curly.c' 'patterns': [ { diff --git a/grammars/c.cson b/grammars/c.cson index 375b05f..5b5f664 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -217,11 +217,9 @@ 'include': '#block' } { - 'match': '(})' + 'match': '}' 'captures': '0': - 'name': 'meta.brace.curly.scope-is-for-back-capability.c' - '1': 'name': 'punctuation.definition.section.block.end.bracket.curly.c' } { @@ -273,17 +271,13 @@ 'block': 'patterns': [ { - 'begin': '({)' + 'begin': '{' 'beginCaptures': '0': - 'name': 'meta.brace.curly.scope-is-for-back-capability.c' - '1': 'name': 'punctuation.definition.section.block.begin.bracket.curly.c' - 'end': '((}))|(?=\\s*#\\s*endif\\b)' + 'end': '(})|(?=\\s*#\\s*endif\\b)' 'endCaptures': '1': - 'name': 'meta.brace.curly.scope-is-for-back-capability.c' - '2': 'name': 'punctuation.definition.section.block.end.bracket.curly.c' 'patterns': [ { @@ -731,17 +725,13 @@ 'punctuation': 'patterns': [ { - 'begin': '(\\()' + 'begin': '\\(' 'beginCaptures': '0': - 'name': 'meta.brace.round.scope-is-for-back-capability.c' - '1': 'name': 'punctuation.bracket.round.c' - 'end': '(\\))' + 'end': '\\)' 'endCaptures': '0': - 'name': 'meta.brace.round.scope-is-for-back-capability.c' - '1': 'name': 'punctuation.bracket.round.c' 'patterns': [ { @@ -750,12 +740,8 @@ ] } { - 'match': '(\\[|\\])' - 'captures': - '0': - 'name': 'meta.brace.square.scope-is-for-back-capability.c' - '1': - 'name': 'punctuation.bracket.square.c' + 'match': '\\[|\\]' + 'name': 'punctuation.bracket.square.c' } { 'match': ',' diff --git a/spec/c-spec.coffee b/spec/c-spec.coffee index 95eab89..831d1cf 100644 --- a/spec/c-spec.coffee +++ b/spec/c-spec.coffee @@ -32,10 +32,10 @@ describe "Language-C", -> expect(lines[0][3]).toEqual value: '(', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.begin.bracket.round.c'] expect(lines[0][4]).toEqual value: 'int', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'storage.type.c'] expect(lines[0][6]).toEqual value: ')', scopes: ['source.c', 'meta.function.c', 'meta.parameters.c', 'punctuation.definition.parameters.end.bracket.round.c'] - expect(lines[0][8]).toEqual value: '{', scopes: ['source.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.begin.bracket.curly.c'] + expect(lines[0][8]).toEqual value: '{', scopes: ['source.c', 'punctuation.definition.section.block.begin.bracket.curly.c'] expect(lines[1][1]).toEqual value: 'return', scopes: ['source.c', 'keyword.control.c'] expect(lines[1][3]).toEqual value: '0', scopes: ['source.c', 'constant.numeric.c'] - expect(lines[2][0]).toEqual value: '}', scopes: ['source.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.end.bracket.curly.c'] + expect(lines[2][0]).toEqual value: '}', scopes: ['source.c', 'punctuation.definition.section.block.end.bracket.curly.c'] lines = grammar.tokenizeLines ''' int fn ( @@ -131,18 +131,16 @@ describe "Language-C", -> ',': 'punctuation.separator.comma.c' '.': 'punctuation.separator.period.c' ';': 'punctuation.terminator.statement.c' + '[': 'punctuation.bracket.square.c' + ']': 'punctuation.bracket.square.c' for token, scope of punctuation {tokens} = grammar.tokenizeLine token expect(tokens[0]).toEqual value: token, scopes: ['source.c', scope] {tokens} = grammar.tokenizeLine '()' - expect(tokens[0]).toEqual value: '(', scopes: ['source.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] - expect(tokens[1]).toEqual value: ')', scopes: ['source.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] - - {tokens} = grammar.tokenizeLine '[]' - expect(tokens[0]).toEqual value: '[', scopes: ['source.c', 'meta.brace.square.scope-is-for-back-capability.c', 'punctuation.bracket.square.c'] - expect(tokens[1]).toEqual value: ']', scopes: ['source.c', 'meta.brace.square.scope-is-for-back-capability.c', 'punctuation.bracket.square.c'] + expect(tokens[0]).toEqual value: '(', scopes: ['source.c', 'punctuation.bracket.round.c'] + expect(tokens[1]).toEqual value: ')', scopes: ['source.c', 'punctuation.bracket.round.c'] describe "preprocessor directives", -> it "tokenizes '#line'", -> @@ -204,11 +202,11 @@ describe "Language-C", -> expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c', 'punctuation.definition.directive.c'] expect(tokens[1]).toEqual value: 'define', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c'] expect(tokens[3]).toEqual value: 'PI_PLUS_ONE', scopes: ['source.c', 'meta.preprocessor.macro.c', 'entity.name.function.preprocessor.c'] - expect(tokens[5]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] + expect(tokens[5]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] expect(tokens[6]).toEqual value: '3.14', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] expect(tokens[7]).toEqual value: ' + ', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(tokens[8]).toEqual value: '1', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] - expect(tokens[9]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] + expect(tokens[9]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] describe "macros", -> it "tokenizes them", -> @@ -230,13 +228,13 @@ describe "Language-C", -> expect(tokens[6]).toEqual value: ',', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c', 'punctuation.separator.parameters.c'] expect(tokens[7]).toEqual value: ' y', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.bracket.round.c'] - expect(tokens[10]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] + expect(tokens[10]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] expect(tokens[11]).toEqual value: 'x', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[12]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] + expect(tokens[12]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] expect(tokens[13]).toEqual value: ' * ', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[14]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] + expect(tokens[14]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] expect(tokens[15]).toEqual value: 'y', scopes: ['source.c', 'meta.preprocessor.macro.c'] - expect(tokens[16]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] + expect(tokens[16]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] {tokens} = grammar.tokenizeLine '#define SWAP(a, b) do { a ^= b; b ^= a; a ^= b; } while ( 0 )' expect(tokens[0]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.directive.define.c', 'punctuation.definition.directive.c'] @@ -248,26 +246,26 @@ describe "Language-C", -> expect(tokens[7]).toEqual value: ' b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] expect(tokens[8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.bracket.round.c'] expect(tokens[10]).toEqual value: 'do', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.c'] - expect(tokens[12]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.begin.bracket.curly.c'] + expect(tokens[12]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.section.block.begin.bracket.curly.c'] expect(tokens[13]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(tokens[14]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.terminator.statement.c'] expect(tokens[15]).toEqual value: ' b ^= a', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(tokens[16]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.terminator.statement.c'] expect(tokens[17]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(tokens[18]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.terminator.statement.c'] - expect(tokens[20]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.end.bracket.curly.c'] + expect(tokens[20]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.section.block.end.bracket.curly.c'] expect(tokens[22]).toEqual value: 'while', scopes: ['source.c', 'meta.preprocessor.macro.c', 'keyword.control.c'] - expect(tokens[24]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] + expect(tokens[24]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] expect(tokens[26]).toEqual value: '0', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.numeric.c'] - expect(tokens[28]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] + expect(tokens[28]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] it "tokenizes multiline macros", -> lines = grammar.tokenizeLines ''' #define max(a,b) (a>b)? \\ a:b ''' - expect(lines[0][10]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] - expect(lines[0][12]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.round.scope-is-for-back-capability.c', 'punctuation.bracket.round.c'] + expect(lines[0][10]).toEqual value: '(', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] + expect(lines[0][12]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.bracket.round.c'] expect(lines[0][14]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.character.escape.line-continuation.c'] lines = grammar.tokenizeLines ''' @@ -285,7 +283,7 @@ describe "Language-C", -> expect(lines[0][6]).toEqual value: ',', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c', 'punctuation.separator.parameters.c'] expect(lines[0][7]).toEqual value: ' b', scopes: ['source.c', 'meta.preprocessor.macro.c', 'variable.parameter.preprocessor.c'] expect(lines[0][8]).toEqual value: ')', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.parameters.end.bracket.round.c'] - expect(lines[0][10]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.begin.bracket.curly.c'] + expect(lines[0][10]).toEqual value: '{', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.section.block.begin.bracket.curly.c'] expect(lines[0][12]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.character.escape.line-continuation.c'] expect(lines[1][0]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(lines[1][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.terminator.statement.c'] @@ -296,7 +294,7 @@ describe "Language-C", -> expect(lines[3][0]).toEqual value: ' a ^= b', scopes: ['source.c', 'meta.preprocessor.macro.c'] expect(lines[3][1]).toEqual value: ';', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.terminator.statement.c'] expect(lines[3][3]).toEqual value: '\\', scopes: ['source.c', 'meta.preprocessor.macro.c', 'constant.character.escape.line-continuation.c'] - expect(lines[4][0]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.end.bracket.curly.c'] + expect(lines[4][0]).toEqual value: '}', scopes: ['source.c', 'meta.preprocessor.macro.c', 'punctuation.definition.section.block.end.bracket.curly.c'] describe "includes", -> it "tokenizes '#include'", -> @@ -600,13 +598,13 @@ describe "Language-C", -> expect(lines[0][2]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c', 'punctuation.definition.string.begin.c'] expect(lines[0][3]).toEqual value: 'C', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c'] expect(lines[0][4]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c', 'punctuation.definition.string.end.c'] - expect(lines[0][6]).toEqual value: '{', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.begin.bracket.curly.c'] + expect(lines[0][6]).toEqual value: '{', scopes: ['source.cpp', 'meta.extern-block.cpp', 'punctuation.definition.section.block.begin.bracket.curly.c'] expect(lines[1][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'keyword.control.directive.include.c', 'punctuation.definition.directive.c'] expect(lines[1][1]).toEqual value: 'include', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'keyword.control.directive.include.c'] expect(lines[1][3]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'string.quoted.double.include.c', 'punctuation.definition.string.begin.c'] expect(lines[1][4]).toEqual value: 'legacy_C_header.h', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'string.quoted.double.include.c'] expect(lines[1][5]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.include.c', 'string.quoted.double.include.c', 'punctuation.definition.string.end.c'] - expect(lines[2][0]).toEqual value: '}', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.end.bracket.curly.c'] + expect(lines[2][0]).toEqual value: '}', scopes: ['source.cpp', 'meta.extern-block.cpp', 'punctuation.definition.section.block.end.bracket.curly.c'] lines = grammar.tokenizeLines ''' #ifdef __cplusplus @@ -624,14 +622,14 @@ describe "Language-C", -> expect(lines[1][2]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c', 'punctuation.definition.string.begin.c'] expect(lines[1][3]).toEqual value: 'C', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c'] expect(lines[1][4]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c', 'punctuation.definition.string.end.c'] - expect(lines[1][6]).toEqual value: '{', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.begin.bracket.curly.c'] + expect(lines[1][6]).toEqual value: '{', scopes: ['source.cpp', 'meta.extern-block.cpp', 'punctuation.definition.section.block.begin.bracket.curly.c'] expect(lines[2][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[2][1]).toEqual value: 'endif', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[3][1]).toEqual value: '//', scopes: ['source.cpp', 'comment.line.double-slash.c++', 'punctuation.definition.comment.c++'] expect(lines[3][2]).toEqual value: ' legacy C code here', scopes: ['source.cpp', 'comment.line.double-slash.c++'] expect(lines[4][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[4][1]).toEqual value: 'ifdef', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[5][0]).toEqual value: '}', scopes: ['source.cpp', 'meta.brace.curly.scope-is-for-back-capability.c', 'punctuation.definition.section.block.end.bracket.curly.c'] + expect(lines[5][0]).toEqual value: '}', scopes: ['source.cpp', 'punctuation.definition.section.block.end.bracket.curly.c'] expect(lines[6][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[6][1]).toEqual value: 'endif', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] From 7c23f8340fdb402b032b9c07bb10629969440084 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Fri, 5 Feb 2016 12:47:04 +0300 Subject: [PATCH 13/18] :bug: Don't use begin/end capture for preprocessor rules --- grammars/c++.cson | 7 +++--- grammars/c.cson | 59 +++------------------------------------------- spec/c-spec.coffee | 14 +++++------ 3 files changed, 14 insertions(+), 66 deletions(-) diff --git a/grammars/c++.cson b/grammars/c++.cson index e4185c2..0fbef00 100644 --- a/grammars/c++.cson +++ b/grammars/c++.cson @@ -296,11 +296,12 @@ ] } { + # extern "C" {} 'begin': '\\b(extern)(?=\\s*")' 'beginCaptures': '1': 'name': 'storage.modifier.cpp' - 'end': '(?<=\\})|(?=\\w)|(?=\\s*#\\s*endif\\b)' + 'end': '(?<=})' 'name': 'meta.extern-block.cpp' 'patterns': [ { @@ -308,9 +309,9 @@ 'beginCaptures': '0': 'name': 'punctuation.definition.section.block.begin.bracket.curly.c' - 'end': '(})|(?=\\s*#\\s*endif\\b)' + 'end': '}' 'endCaptures': - '1': + '0': 'name': 'punctuation.definition.section.block.end.bracket.curly.c' 'patterns': [ { diff --git a/grammars/c.cson b/grammars/c.cson index 5b5f664..6d5ff7a 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -12,9 +12,6 @@ { 'include': '#preprocessor-rule-disabled' } - { - 'include': '#preprocessor-rule-other' - } { 'include': '#comments' } @@ -170,7 +167,7 @@ ] } { - 'begin': '^\\s*(?:((#)\\s*(?:elif|else|if|ifdef|ifndef))|((#)\\s*(pragma|undef)))\\b' + 'begin': '^\\s*(?:((#)\\s*(?:elif|else|if|ifdef|ifndef|endif))|((#)\\s*(pragma|undef)))\\b' 'beginCaptures': '1': 'name': 'keyword.control.directive.conditional.c' @@ -216,12 +213,6 @@ { 'include': '#block' } - { - 'match': '}' - 'captures': - '0': - 'name': 'punctuation.definition.section.block.end.bracket.curly.c' - } { 'begin': '''(?x) (?: @@ -275,9 +266,9 @@ 'beginCaptures': '0': 'name': 'punctuation.definition.section.block.begin.bracket.curly.c' - 'end': '(})|(?=\\s*#\\s*endif\\b)' + 'end': '}' 'endCaptures': - '1': + '0': 'name': 'punctuation.definition.section.block.end.bracket.curly.c' 'patterns': [ { @@ -678,50 +669,6 @@ ] } ] - 'preprocessor-rule-other': - 'begin': '^\\s*(((#)\\s*if(n?def)?)\\b.*?(?:(?=(?://|/\\*))|$))' - 'beginCaptures': - '1': - 'name': 'meta.preprocessor.c' - '2': - 'name': 'keyword.control.directive.conditional.c' - '3': - 'name': 'punctuation.definition.directive.c' - 'end': '^\\s*(((#)\\s*(endif))\\b)' - 'endCaptures': - '1': - 'name': 'meta.preprocessor.c' - '2': - 'name': 'keyword.control.directive.conditional.c' - '3': - 'name': 'punctuation.definition.directive.c' - 'patterns': [ - { - 'include': '$base' - } - ] - 'preprocessor-rule-other-block': - 'begin': '^\\s*(((#)\\s*if(n?def)?)\\b.*?(?:(?=(?://|/\\*))|$))' - 'beginCaptures': - '1': - 'name': 'meta.preprocessor.c' - '2': - 'name': 'keyword.control.directive.conditional.c' - '3': - 'name': 'punctuation.definition.directive.c' - 'end': '^\\s*(((#)\\s*endif)\\b)' - 'endCaptures': - '1': - 'name': 'meta.preprocessor.c' - '2': - 'name': 'keyword.control.directive.conditional.c' - '3': - 'name': 'punctuation.definition.directive.c' - 'patterns': [ - { - 'include': '#block_innards' - } - ] 'punctuation': 'patterns': [ { diff --git a/spec/c-spec.coffee b/spec/c-spec.coffee index 831d1cf..e45e2b0 100644 --- a/spec/c-spec.coffee +++ b/spec/c-spec.coffee @@ -623,13 +623,13 @@ describe "Language-C", -> expect(lines[1][3]).toEqual value: 'C', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c'] expect(lines[1][4]).toEqual value: '"', scopes: ['source.cpp', 'meta.extern-block.cpp', 'string.quoted.double.c', 'punctuation.definition.string.end.c'] expect(lines[1][6]).toEqual value: '{', scopes: ['source.cpp', 'meta.extern-block.cpp', 'punctuation.definition.section.block.begin.bracket.curly.c'] - expect(lines[2][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[2][1]).toEqual value: 'endif', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[3][1]).toEqual value: '//', scopes: ['source.cpp', 'comment.line.double-slash.c++', 'punctuation.definition.comment.c++'] - expect(lines[3][2]).toEqual value: ' legacy C code here', scopes: ['source.cpp', 'comment.line.double-slash.c++'] - expect(lines[4][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] - expect(lines[4][1]).toEqual value: 'ifdef', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] - expect(lines[5][0]).toEqual value: '}', scopes: ['source.cpp', 'punctuation.definition.section.block.end.bracket.curly.c'] + expect(lines[2][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[2][1]).toEqual value: 'endif', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[3][1]).toEqual value: '//', scopes: ['source.cpp', 'meta.extern-block.cpp', 'comment.line.double-slash.c++', 'punctuation.definition.comment.c++'] + expect(lines[3][2]).toEqual value: ' legacy C code here', scopes: ['source.cpp', 'meta.extern-block.cpp', 'comment.line.double-slash.c++'] + expect(lines[4][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] + expect(lines[4][1]).toEqual value: 'ifdef', scopes: ['source.cpp', 'meta.extern-block.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] + expect(lines[5][0]).toEqual value: '}', scopes: ['source.cpp', 'meta.extern-block.cpp', 'punctuation.definition.section.block.end.bracket.curly.c'] expect(lines[6][0]).toEqual value: '#', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[6][1]).toEqual value: 'endif', scopes: ['source.cpp', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] From c18d8e1678718fe081cdba5b263d679717376587 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Fri, 5 Feb 2016 12:50:31 +0300 Subject: [PATCH 14/18] Add missing `bracket.round` --- grammars/c.cson | 4 ++-- spec/c-spec.coffee | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/grammars/c.cson b/grammars/c.cson index 6d5ff7a..20a4286 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -408,11 +408,11 @@ 'begin': '\\(' 'beginCaptures': '0': - 'name': 'punctuation.definition.arguments.begin.c' + 'name': 'punctuation.definition.arguments.bracket.round.begin.c' 'end': '\\)' 'endCaptures': '0': - 'name': 'punctuation.definition.arguments.end.c' + 'name': 'punctuation.definition.arguments.bracket.round.end.c' 'name': 'meta.arguments.c' 'patterns': [ { diff --git a/spec/c-spec.coffee b/spec/c-spec.coffee index e45e2b0..a7fa5e6 100644 --- a/spec/c-spec.coffee +++ b/spec/c-spec.coffee @@ -60,7 +60,7 @@ describe "Language-C", -> it "tokenizes function calls", -> {tokens} = grammar.tokenizeLine('{ fn(arg1, "arg2", 123 /* comment */) }') expect(tokens[2]).toEqual value: 'fn', scopes: ['source.c', 'meta.function-call.c', 'support.function.any-method.c'] - expect(tokens[3]).toEqual value: '(', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.begin.c'] + expect(tokens[3]).toEqual value: '(', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.bracket.round.begin.c'] expect(tokens[4]).toEqual value: 'arg1', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c'] expect(tokens[5]).toEqual value: ',', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.separator.comma.c'] expect(tokens[7]).toEqual value: '"', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'string.quoted.double.c', 'punctuation.definition.string.begin.c'] @@ -71,7 +71,7 @@ describe "Language-C", -> expect(tokens[14]).toEqual value: '/*', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'comment.block.c', 'punctuation.definition.comment.begin.c'] expect(tokens[15]).toEqual value: ' comment ', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'comment.block.c'] expect(tokens[16]).toEqual value: '*/', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'comment.block.c', 'punctuation.definition.comment.end.c'] - expect(tokens[17]).toEqual value: ')', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.end.c'] + expect(tokens[17]).toEqual value: ')', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.bracket.round.end.c'] it "tokenizes various _t types", -> {tokens} = grammar.tokenizeLine 'size_t var;' @@ -360,19 +360,19 @@ describe "Language-C", -> expect(lines[1][2]).toEqual value: 'if', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[1][3]).toEqual value: ' defined(CREDIT)', scopes: ['source.c', 'meta.preprocessor.c'] expect(lines[2][1]).toEqual value: 'credit', scopes: ['source.c', 'meta.function-call.c', 'support.function.any-method.c'] - expect(lines[2][2]).toEqual value: '(', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.begin.c'] - expect(lines[2][3]).toEqual value: ')', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.end.c'] + expect(lines[2][2]).toEqual value: '(', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.bracket.round.begin.c'] + expect(lines[2][3]).toEqual value: ')', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.bracket.round.end.c'] expect(lines[3][1]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[3][2]).toEqual value: 'elif', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[3][3]).toEqual value: ' defined(DEBIT)', scopes: ['source.c', 'meta.preprocessor.c'] expect(lines[4][1]).toEqual value: 'debit', scopes: ['source.c', 'meta.function-call.c', 'support.function.any-method.c'] - expect(lines[4][2]).toEqual value: '(', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.begin.c'] - expect(lines[4][3]).toEqual value: ')', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.end.c'] + expect(lines[4][2]).toEqual value: '(', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.bracket.round.begin.c'] + expect(lines[4][3]).toEqual value: ')', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.bracket.round.end.c'] expect(lines[5][1]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[5][2]).toEqual value: 'else', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] expect(lines[6][1]).toEqual value: 'printerror', scopes: ['source.c', 'meta.function-call.c', 'support.function.any-method.c'] - expect(lines[6][2]).toEqual value: '(', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.begin.c'] - expect(lines[6][3]).toEqual value: ')', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.end.c'] + expect(lines[6][2]).toEqual value: '(', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.bracket.round.begin.c'] + expect(lines[6][3]).toEqual value: ')', scopes: ['source.c', 'meta.function-call.c', 'meta.arguments.c', 'punctuation.definition.arguments.bracket.round.end.c'] expect(lines[7][1]).toEqual value: '#', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c', 'punctuation.definition.directive.c'] expect(lines[7][2]).toEqual value: 'endif', scopes: ['source.c', 'meta.preprocessor.c', 'keyword.control.directive.conditional.c'] From 578203981d49e931b73347746714d936062a4628 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Fri, 5 Feb 2016 12:51:15 +0300 Subject: [PATCH 15/18] :art: --- grammars/c.cson | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/grammars/c.cson b/grammars/c.cson index 20a4286..d9b2bd5 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -420,13 +420,13 @@ } ] 'function_params': - 'begin': '(\\()' + 'begin': '\\(' 'beginCaptures': - '1': + '0': 'name': 'punctuation.definition.parameters.begin.bracket.round.c' - 'end': '(\\))' + 'end': '\\)' 'endCaptures': - '1': + '0': 'name': 'punctuation.definition.parameters.end.bracket.round.c' 'name': 'meta.parameters.c' 'patterns': [ From 00fc6a5614e35934ecaf8228495d4f7f74410ce9 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Fri, 5 Feb 2016 13:55:11 +0300 Subject: [PATCH 16/18] Tokenize unmatched brackets as illegal --- grammars/c.cson | 19 +++++++++++++++++-- spec/c-spec.coffee | 9 +++++++-- 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/grammars/c.cson b/grammars/c.cson index 086664a..583e855 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -687,8 +687,23 @@ ] } { - 'match': '\\[|\\]' - 'name': 'punctuation.bracket.square.c' + 'begin': '\\[' + 'beginCaptures': + '0': + 'name': 'punctuation.bracket.square.c' + 'end': '\\]' + 'endCaptures': + '0': + 'name': 'punctuation.bracket.square.c' + 'patterns': [ + { + 'include': '$base' + } + ] + } + { + 'match': '\\)|}|\\]' + 'name': 'invalid.illegal.unmatched-bracket.c' } { 'match': ',' diff --git a/spec/c-spec.coffee b/spec/c-spec.coffee index 54ce6e9..d5bb964 100644 --- a/spec/c-spec.coffee +++ b/spec/c-spec.coffee @@ -131,8 +131,9 @@ describe "Language-C", -> ',': 'punctuation.separator.comma.c' '.': 'punctuation.separator.period.c' ';': 'punctuation.terminator.statement.c' - '[': 'punctuation.bracket.square.c' - ']': 'punctuation.bracket.square.c' + ']': 'invalid.illegal.unmatched-bracket.c' + '}': 'invalid.illegal.unmatched-bracket.c' + ')': 'invalid.illegal.unmatched-bracket.c' for token, scope of punctuation {tokens} = grammar.tokenizeLine token @@ -142,6 +143,10 @@ describe "Language-C", -> expect(tokens[0]).toEqual value: '(', scopes: ['source.c', 'punctuation.bracket.round.c'] expect(tokens[1]).toEqual value: ')', scopes: ['source.c', 'punctuation.bracket.round.c'] + {tokens} = grammar.tokenizeLine '[]' + expect(tokens[0]).toEqual value: '[', scopes: ['source.c', 'punctuation.bracket.square.c'] + expect(tokens[1]).toEqual value: ']', scopes: ['source.c', 'punctuation.bracket.square.c'] + describe "preprocessor directives", -> it "tokenizes '#line'", -> {tokens} = grammar.tokenizeLine '#line 151 "copy.c"' From b0b23050a650746ec8d1b03d858f63b25b621ef7 Mon Sep 17 00:00:00 2001 From: Maxim Sokolov Date: Sun, 7 Feb 2016 13:05:32 +0300 Subject: [PATCH 17/18] Rename 'function_call' -> 'function_calls' --- grammars/c.cson | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/grammars/c.cson b/grammars/c.cson index 583e855..5203e4c 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -298,7 +298,7 @@ 'include': '#libc' } { - 'include': '#function_call' + 'include': '#function_calls' } { 'captures': @@ -316,7 +316,7 @@ 'include': '$base' } ] - 'function_call': + 'function_calls': 'begin': '''(?x) (?:(?=\\s)(?:(?<=else|new|return)|(? Date: Sun, 7 Feb 2016 13:12:14 +0300 Subject: [PATCH 18/18] :fire: Remove legacy code --- grammars/c.cson | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grammars/c.cson b/grammars/c.cson index 5203e4c..c2edea6 100644 --- a/grammars/c.cson +++ b/grammars/c.cson @@ -320,7 +320,7 @@ 'begin': '''(?x) (?:(?=\\s)(?:(?<=else|new|return)|(?