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

Commit c23d591

Browse files
sinkuuKalitaAlexey
authored andcommitted
Support function calls with type arguments (#98)
1 parent 92226cf commit c23d591

File tree

2 files changed

+78
-2
lines changed

2 files changed

+78
-2
lines changed

grammars/rust.cson

+14-2
Original file line numberDiff line numberDiff line change
@@ -322,15 +322,27 @@
322322
}
323323
{
324324
'comment': 'Function call'
325-
'match': '\\b([a-zA-Z_][a-zA-Z0-9_]*)\\s*\\('
325+
'match': '\\b([A-Za-z][A-Za-z0-9_]*|_[A-Za-z0-9_]+)\\s*\\('
326326
'captures': {
327327
'1': { 'name': 'entity.name.function.rust' }
328328
}
329329
}
330+
{
331+
'comment': 'Function call with type parameters'
332+
'begin': '\\b([A-Za-z][A-Za-z0-9_]*|_[A-Za-z0-9_]+)\\s*(::)(?=\\s*<.*>\\s*\\()'
333+
'end': '\\('
334+
'captures': {
335+
'1': { 'name': 'entity.name.function.rust' }
336+
'2': { 'name': 'keyword.operator.misc.rust' }
337+
}
338+
'patterns': [
339+
{ 'include': '#type_params' }
340+
]
341+
}
330342
# Function definition
331343
{
332344
'comment': 'Function definition'
333-
'begin': '\\b(fn)\\s+([a-zA-Z_][a-zA-Z0-9_]*)'
345+
'begin': '\\b(fn)\\s+([A-Za-z][A-Za-z0-9_]*|_[A-Za-z0-9_]+)'
334346
'end': '[\\{;]'
335347
'beginCaptures': {
336348
'1': { 'name': 'keyword.other.fn.rust' }

spec/rust-spec.coffee

+64
Original file line numberDiff line numberDiff line change
@@ -566,3 +566,67 @@ describe 'Rust grammar', ->
566566
expect(tokens[1]).toEqual value: ' ', scopes: ['source.rust']
567567
expect(tokens[2]).toEqual value : 'foo', scopes : [ 'source.rust', 'entity.name.function.rust' ]
568568
expect(tokens[3]).toEqual value : '(fn_x: ()) ', scopes : [ 'source.rust' ]
569+
570+
it 'tokenizes function calls with type arguments', ->
571+
tokens = grammar.tokenizeLines('''
572+
fn main() {
573+
foo::bar::<i32, ()>();
574+
_func::<i32, ()>();
575+
}
576+
''')
577+
expect(tokens[1][0]).toEqual value: 'foo', scopes: ['source.rust']
578+
expect(tokens[1][1]).toEqual value: '::', scopes: ['source.rust', 'keyword.operator.misc.rust']
579+
expect(tokens[1][2]).toEqual value: 'bar', scopes: ['source.rust', 'entity.name.function.rust']
580+
expect(tokens[1][3]).toEqual value: '::', scopes: ['source.rust', 'keyword.operator.misc.rust']
581+
expect(tokens[1][4]).toEqual value: '<', scopes: ['source.rust', 'meta.type_params.rust']
582+
expect(tokens[1][5]).toEqual value: 'i32', scopes: ['source.rust', 'meta.type_params.rust', 'storage.type.core.rust']
583+
expect(tokens[1][6]).toEqual value: ', ()', scopes: ['source.rust', 'meta.type_params.rust']
584+
expect(tokens[1][7]).toEqual value: '>', scopes: ['source.rust', 'meta.type_params.rust']
585+
expect(tokens[1][8]).toEqual value: '(', scopes: ['source.rust']
586+
expect(tokens[1][9]).toEqual value: ');', scopes: ['source.rust']
587+
588+
expect(tokens[2][0]).toEqual value: '_func', scopes: ['source.rust', 'entity.name.function.rust']
589+
expect(tokens[2][1]).toEqual value: '::', scopes: ['source.rust', 'keyword.operator.misc.rust']
590+
expect(tokens[2][2]).toEqual value: '<', scopes: ['source.rust', 'meta.type_params.rust']
591+
expect(tokens[2][3]).toEqual value: 'i32', scopes: ['source.rust', 'meta.type_params.rust', 'storage.type.core.rust']
592+
expect(tokens[2][4]).toEqual value: ', ()', scopes: ['source.rust', 'meta.type_params.rust']
593+
expect(tokens[2][5]).toEqual value: '>', scopes: ['source.rust', 'meta.type_params.rust']
594+
expect(tokens[2][6]).toEqual value: '(', scopes: ['source.rust']
595+
expect(tokens[2][7]).toEqual value: ');', scopes: ['source.rust']
596+
597+
it 'tokenizes function calls without type arguments', ->
598+
tokens = grammar.tokenizeLines('''
599+
fn main() {
600+
foo.call();
601+
}
602+
''')
603+
expect(tokens[1][0]).toEqual value: 'foo.', scopes: ['source.rust']
604+
expect(tokens[1][1]).toEqual value: 'call', scopes: ['source.rust', 'entity.name.function.rust']
605+
expect(tokens[1][2]).toEqual value: '(', scopes: ['source.rust']
606+
expect(tokens[1][3]).toEqual value: ');', scopes: ['source.rust']
607+
608+
it 'tokenizes function names correctly', ->
609+
tokens = grammar.tokenizeLines('''
610+
fn main() {
611+
a();
612+
a1();
613+
a_();
614+
a_1();
615+
a1_();
616+
_a();
617+
_0();
618+
_a0();
619+
_0a();
620+
__();
621+
}
622+
''')
623+
expect(tokens[1][0]).toEqual value: 'a', scopes: ['source.rust', 'entity.name.function.rust']
624+
expect(tokens[2][0]).toEqual value: 'a1', scopes: ['source.rust', 'entity.name.function.rust']
625+
expect(tokens[3][0]).toEqual value: 'a_', scopes: ['source.rust', 'entity.name.function.rust']
626+
expect(tokens[4][0]).toEqual value: 'a_1', scopes: ['source.rust', 'entity.name.function.rust']
627+
expect(tokens[5][0]).toEqual value: 'a1_', scopes: ['source.rust', 'entity.name.function.rust']
628+
expect(tokens[6][0]).toEqual value: '_a', scopes: ['source.rust', 'entity.name.function.rust']
629+
expect(tokens[7][0]).toEqual value: '_0', scopes: ['source.rust', 'entity.name.function.rust']
630+
expect(tokens[8][0]).toEqual value: '_a0', scopes: ['source.rust', 'entity.name.function.rust']
631+
expect(tokens[9][0]).toEqual value: '_0a', scopes: ['source.rust', 'entity.name.function.rust']
632+
expect(tokens[10][0]).toEqual value: '__', scopes: ['source.rust', 'entity.name.function.rust']

0 commit comments

Comments
 (0)