From 3fb58c620ccf93487cc3b9b8718002481826b4c2 Mon Sep 17 00:00:00 2001 From: Evgenii P Date: Wed, 7 Aug 2019 23:42:28 +0700 Subject: Add function parameters attributes --- crates/ra_parser/src/grammar/params.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) (limited to 'crates/ra_parser/src/grammar/params.rs') diff --git a/crates/ra_parser/src/grammar/params.rs b/crates/ra_parser/src/grammar/params.rs index 723b56343..fce9dd218 100644 --- a/crates/ra_parser/src/grammar/params.rs +++ b/crates/ra_parser/src/grammar/params.rs @@ -5,12 +5,15 @@ use super::*; // fn b(x: i32) {} // fn c(x: i32, ) {} // fn d(x: i32, y: ()) {} +// fn g1(#[attr1] #[attr2] pat: Type) {} +// fn g2(#[attr1] x: u8) {} pub(super) fn param_list(p: &mut Parser) { list_(p, Flavor::Normal) } // test param_list_opt_patterns // fn foo)>(){} +// fn foo)>(){} pub(super) fn param_list_opt_patterns(p: &mut Parser) { list_(p, Flavor::OptionalPattern) } @@ -41,9 +44,12 @@ fn list_(p: &mut Parser, flavor: Flavor) { let m = p.start(); p.bump(); if flavor.type_required() { + attributes::outer_attributes(p); opt_self_param(p); } while !p.at(EOF) && !p.at(ket) && !(flavor.type_required() && p.at(T![...])) { + attributes::outer_attributes(p); + if !p.at_ts(VALUE_PARAMETER_FIRST) { p.error("expected value parameter"); break; @@ -55,6 +61,7 @@ fn list_(p: &mut Parser, flavor: Flavor) { } // test param_list_vararg // extern "C" { fn printf(format: *const i8, ...) -> i32; } + // extern "C" { fn printf(#[attr] format: *const i8, ...) -> i32; } if flavor.type_required() { p.eat(T![...]); } @@ -84,6 +91,7 @@ fn value_parameter(p: &mut Parser, flavor: Flavor) { // test trait_fn_placeholder_parameter // trait Foo { // fn bar(_: u64, mut x: i32); + // fn bar(#[attr] _: u64, #[attr] mut x: i32); // } if (la0 == IDENT || la0 == T![_]) && la1 == T![:] || la0 == T![mut] && la1 == IDENT && la2 == T![:] @@ -107,6 +115,12 @@ fn value_parameter(p: &mut Parser, flavor: Flavor) { // fn c(&'a self,) {} // fn d(&'a mut self, x: i32) {} // fn e(mut self) {} +// fn f(#[must_use] self) {} +// fn g1(#[attr] self) {} +// fn g2(#[attr] &self) {} +// fn g3<'a>(#[attr] &mut self) {} +// fn g4<'a>(#[attr] &'a self) {} +// fn g5<'a>(#[attr] &'a mut self) {} // } fn opt_self_param(p: &mut Parser) { let m; @@ -118,6 +132,8 @@ fn opt_self_param(p: &mut Parser) { // impl S { // fn a(self: &Self) {} // fn b(mut self: Box) {} + // fn c(#[attr] self: Self) {} + // fn d(#[attr] self: Rc) {} // } if p.at(T![:]) { types::ascription(p); -- cgit v1.2.3 From 9ea36703d27a850976190f870fa7c6cb086028c7 Mon Sep 17 00:00:00 2001 From: Evgenii P Date: Wed, 7 Aug 2019 23:48:21 +0700 Subject: Fix variadic arg inline test --- crates/ra_parser/src/grammar/params.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'crates/ra_parser/src/grammar/params.rs') diff --git a/crates/ra_parser/src/grammar/params.rs b/crates/ra_parser/src/grammar/params.rs index fce9dd218..c9c2da379 100644 --- a/crates/ra_parser/src/grammar/params.rs +++ b/crates/ra_parser/src/grammar/params.rs @@ -61,7 +61,7 @@ fn list_(p: &mut Parser, flavor: Flavor) { } // test param_list_vararg // extern "C" { fn printf(format: *const i8, ...) -> i32; } - // extern "C" { fn printf(#[attr] format: *const i8, ...) -> i32; } + // extern "C" { fn printf(format: *const i8, #[attr] ...) -> i32; } if flavor.type_required() { p.eat(T![...]); } -- cgit v1.2.3 From 79d4202194ebeb080b1ae283c56a1697aa4a6fcc Mon Sep 17 00:00:00 2001 From: Evgenii P Date: Thu, 8 Aug 2019 00:36:19 +0700 Subject: Fix parser to correctly consume outer attrs before ellipsis param --- crates/ra_parser/src/grammar/params.rs | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'crates/ra_parser/src/grammar/params.rs') diff --git a/crates/ra_parser/src/grammar/params.rs b/crates/ra_parser/src/grammar/params.rs index c9c2da379..34c584c79 100644 --- a/crates/ra_parser/src/grammar/params.rs +++ b/crates/ra_parser/src/grammar/params.rs @@ -50,6 +50,10 @@ fn list_(p: &mut Parser, flavor: Flavor) { while !p.at(EOF) && !p.at(ket) && !(flavor.type_required() && p.at(T![...])) { attributes::outer_attributes(p); + if p.at(T![...]) { + break; + } + if !p.at_ts(VALUE_PARAMETER_FIRST) { p.error("expected value parameter"); break; -- cgit v1.2.3 From 77f4ab3e9bff67d9efbbf1c1be5575630bcbb1d8 Mon Sep 17 00:00:00 2001 From: Evgenii P Date: Thu, 8 Aug 2019 08:58:28 +0700 Subject: Deduplicate while loop break condition --- crates/ra_parser/src/grammar/params.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'crates/ra_parser/src/grammar/params.rs') diff --git a/crates/ra_parser/src/grammar/params.rs b/crates/ra_parser/src/grammar/params.rs index 34c584c79..834d80b52 100644 --- a/crates/ra_parser/src/grammar/params.rs +++ b/crates/ra_parser/src/grammar/params.rs @@ -47,10 +47,10 @@ fn list_(p: &mut Parser, flavor: Flavor) { attributes::outer_attributes(p); opt_self_param(p); } - while !p.at(EOF) && !p.at(ket) && !(flavor.type_required() && p.at(T![...])) { + while !p.at(EOF) && !p.at(ket) { attributes::outer_attributes(p); - if p.at(T![...]) { + if flavor.type_required() && p.at(T![...]) { break; } -- cgit v1.2.3 From 6fa2d8214784b6ecfc3fbcd98778d4e58fa8664e Mon Sep 17 00:00:00 2001 From: Evgenii P Date: Thu, 8 Aug 2019 09:12:07 +0700 Subject: Fix parser tests according to review --- crates/ra_parser/src/grammar/params.rs | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) (limited to 'crates/ra_parser/src/grammar/params.rs') diff --git a/crates/ra_parser/src/grammar/params.rs b/crates/ra_parser/src/grammar/params.rs index 834d80b52..0b09f1874 100644 --- a/crates/ra_parser/src/grammar/params.rs +++ b/crates/ra_parser/src/grammar/params.rs @@ -5,15 +5,12 @@ use super::*; // fn b(x: i32) {} // fn c(x: i32, ) {} // fn d(x: i32, y: ()) {} -// fn g1(#[attr1] #[attr2] pat: Type) {} -// fn g2(#[attr1] x: u8) {} pub(super) fn param_list(p: &mut Parser) { list_(p, Flavor::Normal) } // test param_list_opt_patterns // fn foo)>(){} -// fn foo)>(){} pub(super) fn param_list_opt_patterns(p: &mut Parser) { list_(p, Flavor::OptionalPattern) } @@ -44,10 +41,14 @@ fn list_(p: &mut Parser, flavor: Flavor) { let m = p.start(); p.bump(); if flavor.type_required() { + // test self_param_outer_attr + // fn f(#[must_use] self) {} attributes::outer_attributes(p); opt_self_param(p); } while !p.at(EOF) && !p.at(ket) { + // test param_outer_arg + // fn f(#[attr1] pat: Type) {} attributes::outer_attributes(p); if flavor.type_required() && p.at(T![...]) { @@ -65,7 +66,6 @@ fn list_(p: &mut Parser, flavor: Flavor) { } // test param_list_vararg // extern "C" { fn printf(format: *const i8, ...) -> i32; } - // extern "C" { fn printf(format: *const i8, #[attr] ...) -> i32; } if flavor.type_required() { p.eat(T![...]); } @@ -95,7 +95,6 @@ fn value_parameter(p: &mut Parser, flavor: Flavor) { // test trait_fn_placeholder_parameter // trait Foo { // fn bar(_: u64, mut x: i32); - // fn bar(#[attr] _: u64, #[attr] mut x: i32); // } if (la0 == IDENT || la0 == T![_]) && la1 == T![:] || la0 == T![mut] && la1 == IDENT && la2 == T![:] @@ -119,12 +118,6 @@ fn value_parameter(p: &mut Parser, flavor: Flavor) { // fn c(&'a self,) {} // fn d(&'a mut self, x: i32) {} // fn e(mut self) {} -// fn f(#[must_use] self) {} -// fn g1(#[attr] self) {} -// fn g2(#[attr] &self) {} -// fn g3<'a>(#[attr] &mut self) {} -// fn g4<'a>(#[attr] &'a self) {} -// fn g5<'a>(#[attr] &'a mut self) {} // } fn opt_self_param(p: &mut Parser) { let m; @@ -136,8 +129,6 @@ fn opt_self_param(p: &mut Parser) { // impl S { // fn a(self: &Self) {} // fn b(mut self: Box) {} - // fn c(#[attr] self: Self) {} - // fn d(#[attr] self: Rc) {} // } if p.at(T![:]) { types::ascription(p); -- cgit v1.2.3