From 6c913d8fa700c8ab58cf386dc958707a248f1379 Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Tue, 23 Apr 2019 11:10:41 +0800 Subject: Add `...` parsing for fn pointer type --- crates/ra_parser/src/grammar/params.rs | 4 +- crates/ra_parser/src/grammar/types.rs | 1 + .../data/parser/inline/ok/0032_fn_pointer_type.rs | 1 + .../data/parser/inline/ok/0032_fn_pointer_type.txt | 44 +++++++++++++++++++++- 4 files changed, 47 insertions(+), 3 deletions(-) (limited to 'crates') diff --git a/crates/ra_parser/src/grammar/params.rs b/crates/ra_parser/src/grammar/params.rs index d027578b6..3d3bd4cc1 100644 --- a/crates/ra_parser/src/grammar/params.rs +++ b/crates/ra_parser/src/grammar/params.rs @@ -43,7 +43,7 @@ fn list_(p: &mut Parser, flavor: Flavor) { if flavor.type_required() { opt_self_param(p); } - while !p.at(EOF) && !p.at(ket) && !(flavor == Flavor::Normal && p.at(DOTDOTDOT)) { + while !p.at(EOF) && !p.at(ket) && !(flavor.type_required() && p.at(DOTDOTDOT)) { if !p.at_ts(VALUE_PARAMETER_FIRST) { p.error("expected value parameter"); break; @@ -55,7 +55,7 @@ fn list_(p: &mut Parser, flavor: Flavor) { } // test param_list_vararg // extern "C" { fn printf(format: *const i8, ...) -> i32; } - if flavor == Flavor::Normal { + if flavor.type_required() { p.eat(DOTDOTDOT); } p.expect(ket); diff --git a/crates/ra_parser/src/grammar/types.rs b/crates/ra_parser/src/grammar/types.rs index a46da9b44..686c80f3c 100644 --- a/crates/ra_parser/src/grammar/types.rs +++ b/crates/ra_parser/src/grammar/types.rs @@ -166,6 +166,7 @@ fn placeholder_type(p: &mut Parser) { // type A = fn(); // type B = unsafe fn(); // type C = unsafe extern "C" fn(); +// type D = extern "C" fn ( u8 , ... ) -> u8; fn fn_pointer_type(p: &mut Parser) { let m = p.start(); p.eat(UNSAFE_KW); diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0032_fn_pointer_type.rs b/crates/ra_syntax/tests/data/parser/inline/ok/0032_fn_pointer_type.rs index c9bf3bdb4..9493da83d 100644 --- a/crates/ra_syntax/tests/data/parser/inline/ok/0032_fn_pointer_type.rs +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0032_fn_pointer_type.rs @@ -1,3 +1,4 @@ type A = fn(); type B = unsafe fn(); type C = unsafe extern "C" fn(); +type D = extern "C" fn ( u8 , ... ) -> u8; diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0032_fn_pointer_type.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0032_fn_pointer_type.txt index 89cf543e7..a0a8aea76 100644 --- a/crates/ra_syntax/tests/data/parser/inline/ok/0032_fn_pointer_type.txt +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0032_fn_pointer_type.txt @@ -1,4 +1,4 @@ -SOURCE_FILE@[0; 70) +SOURCE_FILE@[0; 113) TYPE_ALIAS_DEF@[0; 14) TYPE_KW@[0; 4) "type" WHITESPACE@[4; 5) " " @@ -53,3 +53,45 @@ SOURCE_FILE@[0; 70) R_PAREN@[67; 68) ")" SEMI@[68; 69) ";" WHITESPACE@[69; 70) "\n" + TYPE_ALIAS_DEF@[70; 112) + TYPE_KW@[70; 74) "type" + WHITESPACE@[74; 75) " " + NAME@[75; 76) + IDENT@[75; 76) "D" + WHITESPACE@[76; 77) " " + EQ@[77; 78) "=" + WHITESPACE@[78; 79) " " + FN_POINTER_TYPE@[79; 111) + ABI@[79; 89) + EXTERN_KW@[79; 85) "extern" + WHITESPACE@[85; 86) " " + STRING@[86; 89) "\"C\"" + WHITESPACE@[89; 90) " " + FN_KW@[90; 92) "fn" + WHITESPACE@[92; 93) " " + PARAM_LIST@[93; 105) + L_PAREN@[93; 94) "(" + WHITESPACE@[94; 95) " " + PARAM@[95; 97) + PATH_TYPE@[95; 97) + PATH@[95; 97) + PATH_SEGMENT@[95; 97) + NAME_REF@[95; 97) + IDENT@[95; 97) "u8" + WHITESPACE@[97; 98) " " + COMMA@[98; 99) "," + WHITESPACE@[99; 100) " " + DOTDOTDOT@[100; 103) "..." + WHITESPACE@[103; 104) " " + R_PAREN@[104; 105) ")" + WHITESPACE@[105; 106) " " + RET_TYPE@[106; 111) + THIN_ARROW@[106; 108) "->" + WHITESPACE@[108; 109) " " + PATH_TYPE@[109; 111) + PATH@[109; 111) + PATH_SEGMENT@[109; 111) + NAME_REF@[109; 111) + IDENT@[109; 111) "u8" + SEMI@[111; 112) ";" + WHITESPACE@[112; 113) "\n" -- cgit v1.2.3