Skip to content
This repository was archived by the owner on Jan 25, 2022. It is now read-only.

Fix where on struct declarations #137

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 46 additions & 1 deletion grammars/rust.cson
Original file line number Diff line number Diff line change
Expand Up @@ -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'
Expand Down Expand Up @@ -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' }
Expand Down
32 changes: 32 additions & 0 deletions spec/rust-spec.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -421,6 +421,19 @@ describe 'Rust grammar', ->
two: Option<'a, MyEnum>,
three: &'foo i32,
}

pub struct MyStruct<A> (
A
)
where
A: Copy;

pub struct MyStruct<A>
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']
Expand All @@ -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);')
Expand Down Expand Up @@ -632,13 +662,15 @@ describe 'Rust grammar', ->
fn foo<A, B> -> C where text { }
struct Foo<A, B> where text { }
trait Foo<A, B> : C where { }
pub struct Foo<A> (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']
expect(tokens[3][8]).toEqual value: 'where', scopes: ['source.rust', 'keyword.other.where.rust']
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('''
Expand Down