diff options
author | Aleksey Kladov <[email protected]> | 2020-08-19 16:02:50 +0100 |
---|---|---|
committer | Aleksey Kladov <[email protected]> | 2020-08-19 16:02:50 +0100 |
commit | 61754678fb4923738c91f2702bba6628230dff6e (patch) | |
tree | 1affb36a509f8f6460bf35a53a7f7937338ae805 /crates/hir/src/semantics.rs | |
parent | 73f4fcbd0fa033947421f827e073bceee86e6447 (diff) |
Better API factoring around self access modes
Diffstat (limited to 'crates/hir/src/semantics.rs')
-rw-r--r-- | crates/hir/src/semantics.rs | 46 |
1 files changed, 2 insertions, 44 deletions
diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs index cabeaaf98..8c5f2ff98 100644 --- a/crates/hir/src/semantics.rs +++ b/crates/hir/src/semantics.rs | |||
@@ -6,10 +6,8 @@ use std::{cell::RefCell, fmt, iter::successors}; | |||
6 | 6 | ||
7 | use base_db::{FileId, FileRange}; | 7 | use base_db::{FileId, FileRange}; |
8 | use hir_def::{ | 8 | use hir_def::{ |
9 | lang_item::LangItemTarget, | ||
10 | resolver::{self, HasResolver, Resolver, TypeNs}, | 9 | resolver::{self, HasResolver, Resolver, TypeNs}, |
11 | src::HasSource, | 10 | AsMacroCall, FunctionId, TraitId, VariantId, |
12 | AsMacroCall, FunctionId, Lookup, TraitId, VariantId, | ||
13 | }; | 11 | }; |
14 | use hir_expand::{hygiene::Hygiene, name::AsName, ExpansionInfo}; | 12 | use hir_expand::{hygiene::Hygiene, name::AsName, ExpansionInfo}; |
15 | use hir_ty::associated_type_shorthand_candidates; | 13 | use hir_ty::associated_type_shorthand_candidates; |
@@ -17,7 +15,7 @@ use itertools::Itertools; | |||
17 | use rustc_hash::{FxHashMap, FxHashSet}; | 15 | use rustc_hash::{FxHashMap, FxHashSet}; |
18 | use syntax::{ | 16 | use syntax::{ |
19 | algo::{find_node_at_offset, skip_trivia_token}, | 17 | algo::{find_node_at_offset, skip_trivia_token}, |
20 | ast, AstNode, Direction, SmolStr, SyntaxNode, SyntaxToken, TextRange, TextSize, | 18 | ast, AstNode, Direction, SyntaxNode, SyntaxToken, TextRange, TextSize, |
21 | }; | 19 | }; |
22 | 20 | ||
23 | use crate::{ | 21 | use crate::{ |
@@ -81,13 +79,6 @@ impl PathResolution { | |||
81 | } | 79 | } |
82 | } | 80 | } |
83 | 81 | ||
84 | pub enum SelfKind { | ||
85 | Shared, | ||
86 | Mutable, | ||
87 | Consuming, | ||
88 | Copied, | ||
89 | } | ||
90 | |||
91 | /// Primary API to get semantic information, like types, from syntax trees. | 82 | /// Primary API to get semantic information, like types, from syntax trees. |
92 | pub struct Semantics<'db, DB> { | 83 | pub struct Semantics<'db, DB> { |
93 | pub db: &'db DB, | 84 | pub db: &'db DB, |
@@ -197,10 +188,6 @@ impl<'db, DB: HirDatabase> Semantics<'db, DB> { | |||
197 | self.imp.type_of_self(param) | 188 | self.imp.type_of_self(param) |
198 | } | 189 | } |
199 | 190 | ||
200 | pub fn method_reciever_kind(&self, call: &ast::MethodCallExpr) -> Option<SelfKind> { | ||
201 | self.imp.method_receiver_kind(call) | ||
202 | } | ||
203 | |||
204 | pub fn resolve_method_call(&self, call: &ast::MethodCallExpr) -> Option<Function> { | 191 | pub fn resolve_method_call(&self, call: &ast::MethodCallExpr) -> Option<Function> { |
205 | self.imp.resolve_method_call(call).map(Function::from) | 192 | self.imp.resolve_method_call(call).map(Function::from) |
206 | } | 193 | } |
@@ -423,35 +410,6 @@ impl<'db> SemanticsImpl<'db> { | |||
423 | self.analyze(param.syntax()).type_of_self(self.db, ¶m) | 410 | self.analyze(param.syntax()).type_of_self(self.db, ¶m) |
424 | } | 411 | } |
425 | 412 | ||
426 | fn method_receiver_kind(&self, call: &ast::MethodCallExpr) -> Option<SelfKind> { | ||
427 | self.resolve_method_call(call).and_then(|func| { | ||
428 | let lookup = func.lookup(self.db.upcast()); | ||
429 | let src = lookup.source(self.db.upcast()); | ||
430 | let param_list = src.value.param_list()?; | ||
431 | let self_param = param_list.self_param()?; | ||
432 | if self_param.amp_token().is_some() { | ||
433 | return Some(if self_param.mut_token().is_some() { | ||
434 | SelfKind::Mutable | ||
435 | } else { | ||
436 | SelfKind::Shared | ||
437 | }); | ||
438 | } | ||
439 | |||
440 | let ty = self.type_of_expr(&call.expr()?)?; | ||
441 | let krate = Function::from(func).krate(self.db)?; | ||
442 | let lang_item = self.db.lang_item(krate.id, SmolStr::new("copy")); | ||
443 | let copy_trait = match lang_item? { | ||
444 | LangItemTarget::TraitId(copy_trait) => Trait::from(copy_trait), | ||
445 | _ => return None, | ||
446 | }; | ||
447 | Some(if ty.impls_trait(self.db, copy_trait, &[]) { | ||
448 | SelfKind::Copied | ||
449 | } else { | ||
450 | SelfKind::Consuming | ||
451 | }) | ||
452 | }) | ||
453 | } | ||
454 | |||
455 | fn resolve_method_call(&self, call: &ast::MethodCallExpr) -> Option<FunctionId> { | 413 | fn resolve_method_call(&self, call: &ast::MethodCallExpr) -> Option<FunctionId> { |
456 | self.analyze(call.syntax()).resolve_method_call(self.db, call) | 414 | self.analyze(call.syntax()).resolve_method_call(self.db, call) |
457 | } | 415 | } |