From e28bd099d68ee124280eeadefe48c1f2e0ff6c17 Mon Sep 17 00:00:00 2001 From: Erlend Tobiassen Date: Fri, 25 Jan 2019 23:56:31 +0100 Subject: Support macro calls in type position --- crates/ra_syntax/src/grammar/types.rs | 24 +++++++++++- .../data/parser/inline/ok/0117_macro_call_type.rs | 2 + .../data/parser/inline/ok/0117_macro_call_type.txt | 43 ++++++++++++++++++++++ 3 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 crates/ra_syntax/tests/data/parser/inline/ok/0117_macro_call_type.rs create mode 100644 crates/ra_syntax/tests/data/parser/inline/ok/0117_macro_call_type.txt (limited to 'crates') diff --git a/crates/ra_syntax/src/grammar/types.rs b/crates/ra_syntax/src/grammar/types.rs index 21d89d83b..adc189a29 100644 --- a/crates/ra_syntax/src/grammar/types.rs +++ b/crates/ra_syntax/src/grammar/types.rs @@ -29,7 +29,7 @@ fn type_with_bounds_cond(p: &mut Parser, allow_bounds: bool) { DYN_KW => dyn_trait_type(p), // Some path types are not allowed to have bounds (no plus) L_ANGLE => path_type_(p, allow_bounds), - _ if paths::is_path_start(p) => path_type_(p, allow_bounds), + _ if paths::is_path_start(p) => path_or_macro_type_(p, allow_bounds), _ => { p.err_recover("expected type", TYPE_RECOVERY_SET); } @@ -243,6 +243,28 @@ pub(super) fn path_type(p: &mut Parser) { path_type_(p, true) } +// test macro_call_type +// type A = foo!(); +// type B = crate::foo!(); +fn path_or_macro_type_(p: &mut Parser, allow_bounds: bool) { + assert!(paths::is_path_start(p) || p.at(L_ANGLE)); + let m = p.start(); + paths::type_path(p); + + let kind = if p.at(EXCL) { + items::macro_call_after_excl(p); + MACRO_CALL + } else { + PATH_TYPE + }; + + if allow_bounds && p.eat(PLUS) { + type_params::bounds_without_colon(p); + } + + m.complete(p, kind); +} + pub(super) fn path_type_(p: &mut Parser, allow_bounds: bool) { assert!(paths::is_path_start(p) || p.at(L_ANGLE)); let m = p.start(); diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0117_macro_call_type.rs b/crates/ra_syntax/tests/data/parser/inline/ok/0117_macro_call_type.rs new file mode 100644 index 000000000..edb470c89 --- /dev/null +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0117_macro_call_type.rs @@ -0,0 +1,2 @@ +type A = foo!(); +type B = crate::foo!(); diff --git a/crates/ra_syntax/tests/data/parser/inline/ok/0117_macro_call_type.txt b/crates/ra_syntax/tests/data/parser/inline/ok/0117_macro_call_type.txt new file mode 100644 index 000000000..b2d95451c --- /dev/null +++ b/crates/ra_syntax/tests/data/parser/inline/ok/0117_macro_call_type.txt @@ -0,0 +1,43 @@ +SOURCE_FILE@[0; 41) + TYPE_DEF@[0; 16) + TYPE_KW@[0; 4) + WHITESPACE@[4; 5) + NAME@[5; 6) + IDENT@[5; 6) "A" + WHITESPACE@[6; 7) + EQ@[7; 8) + WHITESPACE@[8; 9) + MACRO_CALL@[9; 15) + PATH@[9; 12) + PATH_SEGMENT@[9; 12) + NAME_REF@[9; 12) + IDENT@[9; 12) "foo" + EXCL@[12; 13) + TOKEN_TREE@[13; 15) + L_PAREN@[13; 14) + R_PAREN@[14; 15) + SEMI@[15; 16) + WHITESPACE@[16; 17) + TYPE_DEF@[17; 40) + TYPE_KW@[17; 21) + WHITESPACE@[21; 22) + NAME@[22; 23) + IDENT@[22; 23) "B" + WHITESPACE@[23; 24) + EQ@[24; 25) + WHITESPACE@[25; 26) + MACRO_CALL@[26; 39) + PATH@[26; 36) + PATH@[26; 31) + PATH_SEGMENT@[26; 31) + CRATE_KW@[26; 31) + COLONCOLON@[31; 33) + PATH_SEGMENT@[33; 36) + NAME_REF@[33; 36) + IDENT@[33; 36) "foo" + EXCL@[36; 37) + TOKEN_TREE@[37; 39) + L_PAREN@[37; 38) + R_PAREN@[38; 39) + SEMI@[39; 40) + WHITESPACE@[40; 41) -- cgit v1.2.3