diff options
author | Aleksey Kladov <[email protected]> | 2020-08-19 14:16:24 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2020-08-19 14:16:24 +0100 |
commit | b9b4693ce3bf0229ea40f09e6404fad3e7823321 (patch) | |
tree | 5ef5dceeeafb7105f41b6fe12bb1563f424f2e87 /crates/hir/src/code_model.rs | |
parent | a3b0a3aeb8061fc65951dd540bc92b94a96b4f2b (diff) |
Add SelfParam to code_model
Diffstat (limited to 'crates/hir/src/code_model.rs')
-rw-r--r-- | crates/hir/src/code_model.rs | 53 |
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. | ||
690 | pub enum Access { | ||
691 | Shared, | ||
692 | Exclusive, | ||
693 | Owned, | ||
694 | } | ||
695 | |||
696 | impl 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)] | ||
706 | pub struct SelfParam { | ||
707 | func: FunctionId, | ||
708 | } | ||
709 | |||
710 | impl 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 | |||
701 | impl HasVisibility for Function { | 724 | impl 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); |