From f8501e936ba409bcf5b38151ad651ed6ce6abd39 Mon Sep 17 00:00:00 2001 From: GraemeWilde Date: Tue, 26 Jun 2018 00:21:46 -0400 Subject: [PATCH 1/4] Fix where on struct declarations Add dedicated struct declaration that fixes `where` clause at the end of tuple structs. Also adds type highlighting to `where` on normal structs to match `where` on `impl`. --- grammars/rust.cson | 48 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 47 insertions(+), 1 deletion(-) diff --git a/grammars/rust.cson b/grammars/rust.cson index 2b70a7b..5e013c2 100644 --- a/grammars/rust.cson +++ b/grammars/rust.cson @@ -25,6 +25,16 @@ { 'include': '#block_comment' } ] } + 'code_block': { + 'comment': 'Code block' + 'name': 'code.block.rust' + 'begin': '[\\{\\(]' + 'end': '(?=[\\}\\)])' + 'patterns': [ + { 'include': '#code_block' } + { 'include': '$self' } + ] + } 'line_doc_comment': { 'comment': 'Single-line documentation comment' 'name': 'comment.line.documentation.rust' @@ -410,10 +420,46 @@ } ] } + # Struct type declaration + { + 'comment': 'Struct type declaration' + 'begin': '\\b(struct)\\s+([a-zA-Z_][a-zA-Z0-9_]*)' + 'end': '[\\};]' + 'beginCaptures': { + '1': { 'name': 'storage.type.rust' } + '2': { 'name': 'entity.name.type.rust' } + } + 'patterns': [ + { 'include': '#code_block' } + { + 'comment': 'Tuple struct where' + 'begin': '\\)' + 'end': '(?=;)' + 'patterns': [ + { 'include': '#block_comment' } + { 'include': '#line_comment' } + { 'include': '#core_traits' } + { 'include': '#std_traits' } + { 'include': '#type_params' } + { 'include': '#core_types' } + { 'include': '#where' } + { 'include': '#type' } + ] + } + { 'include': '#block_comment' } + { 'include': '#line_comment' } + { 'include': '#core_traits' } + { 'include': '#std_traits' } + { 'include': '#type_params' } + { 'include': '#core_types' } + { 'include': '#where' } + { 'include': '#type' } + ] + } # Type declaration { 'comment': 'Type declaration' - 'begin': '\\b(enum|struct|trait|union)\\s+([a-zA-Z_][a-zA-Z0-9_]*)' + 'begin': '\\b(enum|trait|union)\\s+([a-zA-Z_][a-zA-Z0-9_]*)' 'end': '[\\{\\(;]' 'beginCaptures': { '1': { 'name': 'storage.type.rust' } From 4ce553cd6adf41c46de5500d2a7ac47a3f463b69 Mon Sep 17 00:00:00 2001 From: GraemeWilde Date: Tue, 26 Jun 2018 01:05:06 -0400 Subject: [PATCH 2/4] Remove `name` from `code_block` so that it passes tests --- grammars/rust.cson | 1 - 1 file changed, 1 deletion(-) diff --git a/grammars/rust.cson b/grammars/rust.cson index 5e013c2..ffa3a4e 100644 --- a/grammars/rust.cson +++ b/grammars/rust.cson @@ -27,7 +27,6 @@ } 'code_block': { 'comment': 'Code block' - 'name': 'code.block.rust' 'begin': '[\\{\\(]' 'end': '(?=[\\}\\)])' 'patterns': [ From 635c06163724d3688fed96e415b9c775c7be4096 Mon Sep 17 00:00:00 2001 From: GraemeWilde Date: Tue, 26 Jun 2018 01:54:46 -0400 Subject: [PATCH 3/4] Add some tests for new struct stuff --- spec/rust-spec.coffee | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/spec/rust-spec.coffee b/spec/rust-spec.coffee index 0b736bf..59281c7 100644 --- a/spec/rust-spec.coffee +++ b/spec/rust-spec.coffee @@ -421,6 +421,19 @@ describe 'Rust grammar', -> two: Option<'a, MyEnum>, three: &'foo i32, } + + pub struct MyStruct ( + A + ) + where + A: Copy; + + pub struct MyStruct + where + A: Copy + { + pub a: A + } ''') expect(tokens[0][0]).toEqual value: 'pub', scopes: ['source.rust', 'storage.modifier.visibility.rust'] expect(tokens[0][2]).toEqual value: 'struct', scopes: ['source.rust', 'storage.type.rust'] @@ -433,6 +446,23 @@ describe 'Rust grammar', -> expect(tokens[2][4]).toEqual value: 'a', scopes: ['source.rust', 'storage.modifier.lifetime.rust', 'entity.name.lifetime.rust'] expect(tokens[3][2]).toEqual value: '\'', scopes: ['source.rust', 'storage.modifier.lifetime.rust'] expect(tokens[3][3]).toEqual value: 'foo', scopes: ['source.rust', 'storage.modifier.lifetime.rust', 'entity.name.lifetime.rust'] + expect(tokens[6][0]).toEqual value: 'pub', scopes: ['source.rust', 'storage.modifier.visibility.rust'] + expect(tokens[6][2]).toEqual value: 'struct', scopes: ['source.rust', 'storage.type.rust'] + expect(tokens[6][4]).toEqual value: 'MyStruct', scopes: ['source.rust', 'entity.name.type.rust'] + expect(tokens[9][0]).toEqual value: 'where', scopes: ['source.rust', 'keyword.other.where.rust'] + expect(tokens[10][1]).toEqual value: 'A', scopes: ['source.rust', 'entity.name.type.rust'] + expect(tokens[10][3]).toEqual value: 'Copy', scopes: ['source.rust', 'entity.name.type.rust'] + expect(tokens[12][0]).toEqual value: 'pub', scopes: ['source.rust', 'storage.modifier.visibility.rust'] + expect(tokens[12][2]).toEqual value: 'struct', scopes: ['source.rust', 'storage.type.rust'] + expect(tokens[12][4]).toEqual value: 'MyStruct', scopes: ['source.rust', 'entity.name.type.rust'] + expect(tokens[12][5]).toEqual value: '<', scopes: ['source.rust', 'meta.type_params.rust'] + expect(tokens[12][6]).toEqual value: 'A', scopes: ['source.rust', 'meta.type_params.rust'] + expect(tokens[12][7]).toEqual value: '>', scopes: ['source.rust', 'meta.type_params.rust'] + expect(tokens[13][0]).toEqual value: 'where', scopes: ['source.rust', 'keyword.other.where.rust'] + expect(tokens[14][1]).toEqual value: 'A', scopes: ['source.rust', 'entity.name.type.rust'] + expect(tokens[14][3]).toEqual value: 'Copy', scopes: ['source.rust', 'entity.name.type.rust'] + expect(tokens[16][1]).toEqual value: 'pub', scopes: ['source.rust', 'storage.modifier.visibility.rust'] + it 'tokenizes tuple structs', -> {tokens} = grammar.tokenizeLine('pub struct MyTupleStruct(pub i32, u32);') @@ -632,6 +662,7 @@ describe 'Rust grammar', -> fn foo -> C where text { } struct Foo where text { } trait Foo : C where { } + pub struct Foo (A) where A: Copy; ''') expect(tokens[0][7]).toEqual value: 'where', scopes: ['source.rust', 'keyword.other.where.rust'] expect(tokens[1][11]).toEqual value: 'where', scopes: ['source.rust', 'keyword.other.where.rust'] @@ -639,6 +670,7 @@ describe 'Rust grammar', -> expect(tokens[5][7]).toEqual value: 'where', scopes: ['source.rust', 'keyword.other.where.rust'] expect(tokens[6][7]).toEqual value: 'where', scopes: ['source.rust', 'keyword.other.where.rust'] expect(tokens[7][7]).toEqual value: 'where', scopes: ['source.rust', 'keyword.other.where.rust'] + expect(tokens[8][13]).toEqual value: 'where', scopes: ['source.rust', 'keyword.other.where.rust'] it 'tokenizes comments in attributes (issue \\#95)', -> tokens = grammar.tokenizeLines(''' From b7ae9beace9d5b2c082b0f2339abf60030edcf3b Mon Sep 17 00:00:00 2001 From: GraemeWilde Date: Tue, 26 Jun 2018 18:10:02 -0400 Subject: [PATCH 4/4] Fix issue with nested code blocks all ending on one close brace --- grammars/rust.cson | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/grammars/rust.cson b/grammars/rust.cson index ffa3a4e..89c7f41 100644 --- a/grammars/rust.cson +++ b/grammars/rust.cson @@ -28,7 +28,7 @@ 'code_block': { 'comment': 'Code block' 'begin': '[\\{\\(]' - 'end': '(?=[\\}\\)])' + 'end': '[\\}\\)]' 'patterns': [ { 'include': '#code_block' } { 'include': '$self' } @@ -423,7 +423,7 @@ { 'comment': 'Struct type declaration' 'begin': '\\b(struct)\\s+([a-zA-Z_][a-zA-Z0-9_]*)' - 'end': '[\\};]' + 'end': '(?<=\\})|;' 'beginCaptures': { '1': { 'name': 'storage.type.rust' } '2': { 'name': 'entity.name.type.rust' }