]> git.lizzy.rs Git - rust.git/commitdiff
fix: Add trait alias grammar to rust.ungram
authorLukas Wirth <lukastw97@gmail.com>
Fri, 11 Nov 2022 14:25:15 +0000 (15:25 +0100)
committerLukas Wirth <lukastw97@gmail.com>
Fri, 11 Nov 2022 14:25:15 +0000 (15:25 +0100)
crates/hir-def/src/data.rs
crates/hir-def/src/item_tree.rs
crates/hir-def/src/item_tree/lower.rs
crates/hir-def/src/item_tree/pretty.rs
crates/syntax/rust.ungram
crates/syntax/src/ast/generated/nodes.rs

index 2dc69b00ace00d12659f844b1ceafee85a2b4957..9c76969086485b2aecafdd7a36f436c4802d8136 100644 (file)
@@ -236,11 +236,19 @@ pub(crate) fn trait_data_with_diagnostics_query(
             .by_key("rustc_skip_array_during_method_dispatch")
             .exists();
 
-        let mut collector =
-            AssocItemCollector::new(db, module_id, tree_id.file_id(), ItemContainerId::TraitId(tr));
-        collector.collect(&item_tree, tree_id.tree_id(), &tr_def.items);
-        let (items, attribute_calls, diagnostics) = collector.finish();
-
+        let (items, attribute_calls, diagnostics) = match &tr_def.items {
+            Some(items) => {
+                let mut collector = AssocItemCollector::new(
+                    db,
+                    module_id,
+                    tree_id.file_id(),
+                    ItemContainerId::TraitId(tr),
+                );
+                collector.collect(&item_tree, tree_id.tree_id(), items);
+                collector.finish()
+            }
+            None => Default::default(),
+        };
         (
             Arc::new(TraitData {
                 name,
index 570344596def80a2c62711c72ba2b1fa11358dbf..0aa531eff71f6f5e02e12f003c947e25c1dddf5e 100644 (file)
@@ -666,7 +666,8 @@ pub struct Trait {
     pub generic_params: Interned<GenericParams>,
     pub is_auto: bool,
     pub is_unsafe: bool,
-    pub items: Box<[AssocItem]>,
+    /// This is [`None`] if this Trait is a trait alias.
+    pub items: Option<Box<[AssocItem]>>,
     pub ast_id: FileAstId<ast::Trait>,
 }
 
index 79249757d9e9bb407aee638c8338e489b58c7842..b25274bccc9a4aa6dbe507dc946376af735ab181 100644 (file)
@@ -451,15 +451,7 @@ fn lower_trait(&mut self, trait_def: &ast::Trait) -> Option<FileItemTreeId<Trait
                 .collect()
         });
         let ast_id = self.source_ast_id_map.ast_id(trait_def);
-        let res = Trait {
-            name,
-            visibility,
-            generic_params,
-            is_auto,
-            is_unsafe,
-            items: items.unwrap_or_default(),
-            ast_id,
-        };
+        let res = Trait { name, visibility, generic_params, is_auto, is_unsafe, items, ast_id };
         Some(id(self.data().traits.alloc(res)))
     }
 
index da1643152c2fe09f3683aeb495b67f3371e3c4ff..48c40df22ff5f2ff319405cbb352739af61aafb1 100644 (file)
@@ -375,12 +375,21 @@ fn print_mod_item(&mut self, item: ModItem) {
                 }
                 w!(self, "trait {}", name);
                 self.print_generic_params(generic_params);
-                self.print_where_clause_and_opening_brace(generic_params);
-                self.indented(|this| {
-                    for item in &**items {
-                        this.print_mod_item((*item).into());
+                match items {
+                    Some(items) => {
+                        self.print_where_clause_and_opening_brace(generic_params);
+                        self.indented(|this| {
+                            for item in &**items {
+                                this.print_mod_item((*item).into());
+                            }
+                        });
                     }
-                });
+                    None => {
+                        w!(self, " = ");
+                        // FIXME: Print the aliased traits
+                        self.print_where_clause_and_opening_brace(generic_params);
+                    }
+                }
                 wln!(self, "}}");
             }
             ModItem::Impl(it) => {
index 5379732ac6c377d3e5fbf23d5c801afd2dd4c960..0a0cb0290d6cb5b0a55bc683a8fb8292f64fae63 100644 (file)
@@ -239,8 +239,11 @@ Static =
 Trait =
   Attr* Visibility?
   'unsafe'? 'auto'?
-  'trait' Name GenericParamList? (':' TypeBoundList?)? WhereClause?
-  AssocItemList
+  'trait' Name GenericParamList?
+  (
+    (':' TypeBoundList?)? WhereClause? AssocItemList
+    | '=' TypeBoundList? WhereClause? ';'
+  )
 
 AssocItemList =
   '{' Attr* AssocItem* '}'
index 6cfb98d92fcf289c5a69c4504e69f10e6d31202d..2ea715f47fb23753089a3be6e96ac55425697d52 100644 (file)
@@ -407,6 +407,8 @@ pub fn unsafe_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax,
     pub fn auto_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![auto]) }
     pub fn trait_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![trait]) }
     pub fn assoc_item_list(&self) -> Option<AssocItemList> { support::child(&self.syntax) }
+    pub fn eq_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![=]) }
+    pub fn semicolon_token(&self) -> Option<SyntaxToken> { support::token(&self.syntax, T![;]) }
 }
 
 #[derive(Debug, Clone, PartialEq, Eq, Hash)]