From 2920975637731c9601b9aeefb72531ce0fec042d Mon Sep 17 00:00:00 2001 From: Lionel Flandrin Date: Sun, 9 Aug 2020 00:47:06 +0100 Subject: [PATCH] Rust: allow arrays in function parameters --- .../rust-test_input.d/expected.tags | 1 + .../parser-rust.r/rust-test_input.d/input.rs | 4 ++++ parsers/rust.c | 19 ++++++++++++++++--- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Units/parser-rust.r/rust-test_input.d/expected.tags b/Units/parser-rust.r/rust-test_input.d/expected.tags index 6e0b685172..fc1b571e05 100644 --- a/Units/parser-rust.r/rust-test_input.d/expected.tags +++ b/Units/parser-rust.r/rust-test_input.d/expected.tags @@ -24,6 +24,7 @@ a_anteater input.rs /^ a_anteater(isize),$/;" e enum:Animal a_bear input.rs /^ a_bear(isize),$/;" e enum:Animal a_cat input.rs /^ a_cat(isize),$/;" e enum:Animal a_dog input.rs /^ a_dog(isize),$/;" e enum:Animal +array_param input.rs /^fn array_param(arr: [[u32; 3]; 4])$/;" f signature:(arr: [[u32; 3]; 4]) bar input.rs /^ bar: isize$/;" m struct:A bar input.rs /^ bar: isize$/;" m struct:B do_z input.rs /^ fn do_z(&self) {$/;" P implementation:Foo signature:(&self) diff --git a/Units/parser-rust.r/rust-test_input.d/input.rs b/Units/parser-rust.r/rust-test_input.d/input.rs index dcfa573522..3fcdece6f9 100644 --- a/Units/parser-rust.r/rust-test_input.d/input.rs +++ b/Units/parser-rust.r/rust-test_input.d/input.rs @@ -47,6 +47,10 @@ pub fn where_foo(a: T) where T: Send { } +fn array_param(arr: [[u32; 3]; 4]) +{ +} + /* * fn ignored_in_comment() {} */ diff --git a/parsers/rust.c b/parsers/rust.c index a004153f13..ffb8347108 100644 --- a/parsers/rust.c +++ b/parsers/rust.c @@ -528,6 +528,7 @@ static void parseFn (lexerState *lexer, vString *scope, int parent_kind) unsigned long line; MIOPos pos; int paren_level = 0; + int bracket_level = 0; bool found_paren = false; bool valid_signature = true; @@ -545,9 +546,13 @@ static void parseFn (lexerState *lexer, vString *scope, int parent_kind) /* HACK: This is a bit coarse as far as what tag entry means by * 'arglist'... */ - while (lexer->cur_token != '{' && lexer->cur_token != ';') + while (lexer->cur_token != '{') { - if (lexer->cur_token == '}') + if (lexer->cur_token == ';' && bracket_level == 0) + { + break; + } + else if (lexer->cur_token == '}') { valid_signature = false; break; @@ -566,6 +571,14 @@ static void parseFn (lexerState *lexer, vString *scope, int parent_kind) break; } } + else if (lexer->cur_token == '[') + { + bracket_level++; + } + else if (lexer->cur_token == ']') + { + bracket_level--; + } else if (lexer->cur_token == TOKEN_EOF) { valid_signature = false; @@ -574,7 +587,7 @@ static void parseFn (lexerState *lexer, vString *scope, int parent_kind) writeCurTokenToStr(lexer, arg_list); advanceToken(lexer, false); } - if (!found_paren || paren_level != 0) + if (!found_paren || paren_level != 0 || bracket_level != 0) valid_signature = false; if (valid_signature)