aboutsummaryrefslogtreecommitdiff
path: root/crates/hir/src/code_model.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/hir/src/code_model.rs')
-rw-r--r--crates/hir/src/code_model.rs53
1 files changed, 38 insertions, 15 deletions
diff --git a/crates/hir/src/code_model.rs b/crates/hir/src/code_model.rs
index 31d5276b0..3254f316b 100644
--- a/crates/hir/src/code_model.rs
+++ b/crates/hir/src/code_model.rs
@@ -666,23 +666,11 @@ impl Function {
666 db.function_data(self.id).name.clone() 666 db.function_data(self.id).name.clone()
667 } 667 }
668 668
669 pub fn has_self_param(self, db: &dyn HirDatabase) -> bool { 669 pub fn self_param(self, db: &dyn HirDatabase) -> Option<SelfParam> {
670 db.function_data(self.id).has_self_param 670 if !db.function_data(self.id).has_self_param {
671 }
672
673 pub fn mutability_of_self_param(self, db: &dyn HirDatabase) -> Option<Mutability> {
674 let func_data = db.function_data(self.id);
675 if !func_data.has_self_param {
676 return None; 671 return None;
677 } 672 }
678 673 Some(SelfParam { func: self.id })
679 func_data.params.first().and_then(|param| {
680 if let TypeRef::Reference(_, mutability) = param {
681 Some(*mutability)
682 } else {
683 None
684 }
685 })
686 } 674 }
687 675
688 pub fn params(self, db: &dyn HirDatabase) -> Vec<TypeRef> { 676 pub fn params(self, db: &dyn HirDatabase) -> Vec<TypeRef> {
@@ -698,6 +686,41 @@ impl Function {
698 } 686 }
699} 687}
700 688
689// Note: logically, this belongs to `hir_ty`, but we are not using it there yet.
690pub enum Access {
691 Shared,
692 Exclusive,
693 Owned,
694}
695
696impl From<Mutability> for Access {
697 fn from(mutability: Mutability) -> Access {
698 match mutability {
699 Mutability::Shared => Access::Shared,
700 Mutability::Mut => Access::Exclusive,
701 }
702 }
703}
704
705#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
706pub struct SelfParam {
707 func: FunctionId,
708}
709
710impl SelfParam {
711 pub fn access(self, db: &dyn HirDatabase) -> Access {
712 let func_data = db.function_data(self.func);
713 func_data
714 .params
715 .first()
716 .map(|param| match *param {
717 TypeRef::Reference(_, mutability) => mutability.into(),
718 _ => Access::Owned,
719 })
720 .unwrap_or(Access::Owned)
721 }
722}
723
701impl HasVisibility for Function { 724impl HasVisibility for Function {
702 fn visibility(&self, db: &dyn HirDatabase) -> Visibility { 725 fn visibility(&self, db: &dyn HirDatabase) -> Visibility {
703 let function_data = db.function_data(self.id); 726 let function_data = db.function_data(self.id);