]> git.lizzy.rs Git - rust.git/commitdiff
Make it possible to retrieve `hir::Function`'s return type
authorArnaud <arnaud.golfouse@free.fr>
Mon, 4 Jan 2021 17:58:42 +0000 (18:58 +0100)
committerArnaud <arnaud.golfouse@free.fr>
Mon, 4 Jan 2021 18:14:44 +0000 (19:14 +0100)
This is done by adding a `ret_type` method to `hir::Function`.
I followed `assoc_fn_params` convention by creating a new `RetType` type,
that contains the actual return type accessible via a `ty` method.

crates/hir/src/code_model.rs

index 071e553a88b7aaa9c3964d9ba8398829aec56cb8..e783e0ababe7135b6f9f42071fc1c5e054c8d430 100644 (file)
@@ -743,6 +743,18 @@ pub fn name(self, db: &dyn HirDatabase) -> Name {
         db.function_data(self.id).name.clone()
     }
 
+    pub fn ret_type(self, db: &dyn HirDatabase) -> RetType {
+        let resolver = self.id.resolver(db.upcast());
+        let ret_type = &db.function_data(self.id).ret_type;
+        let ctx = hir_ty::TyLoweringContext::new(db, &resolver);
+        let environment = TraitEnvironment::lower(db, &resolver);
+        let ty = Type {
+            krate: self.id.lookup(db.upcast()).container.module(db.upcast()).krate,
+            ty: InEnvironment { value: Ty::from_hir_ext(&ctx, ret_type).0, environment },
+        };
+        RetType { ty }
+    }
+
     pub fn self_param(self, db: &dyn HirDatabase) -> Option<SelfParam> {
         if !db.function_data(self.id).has_self_param {
             return None;
@@ -826,6 +838,17 @@ fn from(mutability: Mutability) -> Access {
     }
 }
 
+#[derive(Debug)]
+pub struct RetType {
+    ty: Type,
+}
+
+impl RetType {
+    pub fn ty(&self) -> &Type {
+        &self.ty
+    }
+}
+
 #[derive(Debug)]
 pub struct Param {
     ty: Type,