about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors[bot] <bors[bot]@users.noreply.github.com>2019-01-26 10:23:28 +0000
committerbors[bot] <bors[bot]@users.noreply.github.com>2019-01-26 10:23:28 +0000
commit2acaa92c93bcd54d97221d0cede8780ff817476e (patch)
treecb92ecad2475f772d3e392d6cb43ccb84fa50acf
parent8b6dea348fa02a7ce8107a1e73917f0597f2a91d (diff)
parente28bd099d68ee124280eeadefe48c1f2e0ff6c17 (diff)
downloadrust-2acaa92c93bcd54d97221d0cede8780ff817476e.tar.gz
rust-2acaa92c93bcd54d97221d0cede8780ff817476e.zip
Merge #660
660: Support macro calls in type position r=matklad a=regiontog

A [playground](https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=fdc6dd4ddaece92a72fa2a292b75e27c) demonstrating the syntax in question.

Co-authored-by: Erlend Tobiassen <erlend.tobiassen@gmail.com>
-rw-r--r--crates/ra_syntax/src/grammar/types.rs24
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/ok/0117_macro_call_type.rs2
-rw-r--r--crates/ra_syntax/tests/data/parser/inline/ok/0117_macro_call_type.txt43
3 files changed, 68 insertions, 1 deletions
diff --git a/crates/ra_syntax/src/grammar/types.rs b/crates/ra_syntax/src/grammar/types.rs
index 21d89d83bbd..adc189a292d 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 00000000000..edb470c8999
--- /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 00000000000..b2d95451c97
--- /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)