diff --git a/grammars/rust.cson b/grammars/rust.cson
index 2b70a7b..89c7f41 100644
--- a/grammars/rust.cson
+++ b/grammars/rust.cson
@@ -25,6 +25,15 @@
{ 'include': '#block_comment' }
]
}
+ 'code_block': {
+ 'comment': 'Code block'
+ 'begin': '[\\{\\(]'
+ 'end': '[\\}\\)]'
+ 'patterns': [
+ { 'include': '#code_block' }
+ { 'include': '$self' }
+ ]
+ }
'line_doc_comment': {
'comment': 'Single-line documentation comment'
'name': 'comment.line.documentation.rust'
@@ -410,10 +419,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' }
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('''