aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/ra_hir/src/code_model.rs3
-rw-r--r--crates/ra_hir/src/db.rs4
-rw-r--r--crates/ra_hir/src/lang_item.rs54
-rw-r--r--crates/ra_hir/src/ty.rs1
-rw-r--r--crates/ra_hir/src/ty/autoderef.rs4
-rw-r--r--crates/ra_hir/src/ty/tests.rs1
-rw-r--r--crates/ra_hir/src/ty/traits.rs2
7 files changed, 31 insertions, 38 deletions
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index 4fbb1fc8f..6602d1220 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -788,8 +788,7 @@ impl Trait {
788 TraitItem::TypeAlias(t) => Some(*t), 788 TraitItem::TypeAlias(t) => Some(*t),
789 _ => None, 789 _ => None,
790 }) 790 })
791 .filter(|t| t.name(db) == name) 791 .find(|t| t.name(db) == name)
792 .next()
793 } 792 }
794 793
795 pub(crate) fn trait_data(self, db: &impl DefDatabase) -> Arc<TraitData> { 794 pub(crate) fn trait_data(self, db: &impl DefDatabase) -> Arc<TraitData> {
diff --git a/crates/ra_hir/src/db.rs b/crates/ra_hir/src/db.rs
index 651f0d4ca..c4dd54596 100644
--- a/crates/ra_hir/src/db.rs
+++ b/crates/ra_hir/src/db.rs
@@ -185,11 +185,11 @@ pub trait HirDatabase: DefDatabase + AstDatabase {
185 goal: crate::ty::Canonical<crate::ty::TraitRef>, 185 goal: crate::ty::Canonical<crate::ty::TraitRef>,
186 ) -> Option<crate::ty::traits::Solution>; 186 ) -> Option<crate::ty::traits::Solution>;
187 187
188 #[salsa::invoke(crate::ty::traits::normalize)] 188 #[salsa::invoke(crate::ty::traits::normalize_query)]
189 fn normalize( 189 fn normalize(
190 &self, 190 &self,
191 krate: Crate, 191 krate: Crate,
192 goal: crate::ty::Canonical<crate::ty::traits::ProjectionPredicate>, 192 goal: crate::ty::Canonical<crate::ty::ProjectionPredicate>,
193 ) -> Option<crate::ty::traits::Solution>; 193 ) -> Option<crate::ty::traits::Solution>;
194} 194}
195 195
diff --git a/crates/ra_hir/src/lang_item.rs b/crates/ra_hir/src/lang_item.rs
index ada8aeb5b..18ac0fcf9 100644
--- a/crates/ra_hir/src/lang_item.rs
+++ b/crates/ra_hir/src/lang_item.rs
@@ -1,10 +1,11 @@
1use std::sync::Arc; 1use std::sync::Arc;
2use rustc_hash::FxHashMap; 2use rustc_hash::FxHashMap;
3 3
4use ra_syntax::{SmolStr, ast::AttrsOwner}; 4use ra_syntax::{SmolStr, TreeArc, ast::AttrsOwner};
5 5
6use crate::{ 6use crate::{
7 Crate, DefDatabase, Enum, Function, HirDatabase, ImplBlock, Module, Static, Struct, Trait, ModuleDef, AstDatabase, HasSource 7 Crate, DefDatabase, Enum, Function, HirDatabase, ImplBlock, Module,
8 Static, Struct, Trait, ModuleDef, AstDatabase, HasSource
8}; 9};
9 10
10#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] 11#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
@@ -93,39 +94,15 @@ impl LangItems {
93 } 94 }
94 } 95 }
95 96
96 // FIXME make this nicer
97 for def in module.declarations(db) { 97 for def in module.declarations(db) {
98 match def { 98 match def {
99 ModuleDef::Trait(trait_) => { 99 ModuleDef::Trait(trait_) => {
100 let node = trait_.source(db).ast; 100 self.collect_lang_item(db, trait_, LangItemTarget::Trait)
101 if let Some(lang_item_name) = lang_item_name(&*node) {
102 self.items.entry(lang_item_name).or_insert(LangItemTarget::Trait(trait_));
103 }
104 }
105 ModuleDef::Enum(e) => {
106 let node = e.source(db).ast;
107 if let Some(lang_item_name) = lang_item_name(&*node) {
108 self.items.entry(lang_item_name).or_insert(LangItemTarget::Enum(e));
109 }
110 }
111 ModuleDef::Struct(s) => {
112 let node = s.source(db).ast;
113 if let Some(lang_item_name) = lang_item_name(&*node) {
114 self.items.entry(lang_item_name).or_insert(LangItemTarget::Struct(s));
115 }
116 }
117 ModuleDef::Function(f) => {
118 let node = f.source(db).ast;
119 if let Some(lang_item_name) = lang_item_name(&*node) {
120 self.items.entry(lang_item_name).or_insert(LangItemTarget::Function(f));
121 }
122 }
123 ModuleDef::Static(s) => {
124 let node = s.source(db).ast;
125 if let Some(lang_item_name) = lang_item_name(&*node) {
126 self.items.entry(lang_item_name).or_insert(LangItemTarget::Static(s));
127 }
128 } 101 }
102 ModuleDef::Enum(e) => self.collect_lang_item(db, e, LangItemTarget::Enum),
103 ModuleDef::Struct(s) => self.collect_lang_item(db, s, LangItemTarget::Struct),
104 ModuleDef::Function(f) => self.collect_lang_item(db, f, LangItemTarget::Function),
105 ModuleDef::Static(s) => self.collect_lang_item(db, s, LangItemTarget::Static),
129 _ => {} 106 _ => {}
130 } 107 }
131 } 108 }
@@ -135,6 +112,21 @@ impl LangItems {
135 self.collect_lang_items_recursive(db, &child); 112 self.collect_lang_items_recursive(db, &child);
136 } 113 }
137 } 114 }
115
116 fn collect_lang_item<T, N>(
117 &mut self,
118 db: &(impl DefDatabase + AstDatabase),
119 item: T,
120 constructor: fn(T) -> LangItemTarget,
121 ) where
122 T: Copy + HasSource<Ast = TreeArc<N>>,
123 N: AttrsOwner,
124 {
125 let node = item.source(db).ast;
126 if let Some(lang_item_name) = lang_item_name(&*node) {
127 self.items.entry(lang_item_name).or_insert(constructor(item));
128 }
129 }
138} 130}
139 131
140fn lang_item_name<T: AttrsOwner>(node: &T) -> Option<SmolStr> { 132fn lang_item_name<T: AttrsOwner>(node: &T) -> Option<SmolStr> {
diff --git a/crates/ra_hir/src/ty.rs b/crates/ra_hir/src/ty.rs
index 4ed19f860..842d49e1f 100644
--- a/crates/ra_hir/src/ty.rs
+++ b/crates/ra_hir/src/ty.rs
@@ -23,6 +23,7 @@ pub(crate) use lower::{TypableDef, type_for_def, type_for_field, callable_item_s
23pub(crate) use infer::{infer_query, InferenceResult, InferTy}; 23pub(crate) use infer::{infer_query, InferenceResult, InferTy};
24pub use lower::CallableDef; 24pub use lower::CallableDef;
25pub(crate) use autoderef::autoderef; 25pub(crate) use autoderef::autoderef;
26pub(crate) use traits::ProjectionPredicate;
26 27
27/// A type constructor or type name: this might be something like the primitive 28/// A type constructor or type name: this might be something like the primitive
28/// type `bool`, a struct like `Vec`, or things like function pointers or 29/// type `bool`, a struct like `Vec`, or things like function pointers or
diff --git a/crates/ra_hir/src/ty/autoderef.rs b/crates/ra_hir/src/ty/autoderef.rs
index e85e558b2..1f443d49b 100644
--- a/crates/ra_hir/src/ty/autoderef.rs
+++ b/crates/ra_hir/src/ty/autoderef.rs
@@ -10,12 +10,14 @@ use log::{info, warn};
10use crate::{HirDatabase, Name, Resolver, HasGenericParams}; 10use crate::{HirDatabase, Name, Resolver, HasGenericParams};
11use super::{traits::Solution, Ty, Canonical}; 11use super::{traits::Solution, Ty, Canonical};
12 12
13const AUTODEREF_RECURSION_LIMIT: usize = 10;
14
13pub(crate) fn autoderef<'a>( 15pub(crate) fn autoderef<'a>(
14 db: &'a impl HirDatabase, 16 db: &'a impl HirDatabase,
15 resolver: &'a Resolver, 17 resolver: &'a Resolver,
16 ty: Canonical<Ty>, 18 ty: Canonical<Ty>,
17) -> impl Iterator<Item = Canonical<Ty>> + 'a { 19) -> impl Iterator<Item = Canonical<Ty>> + 'a {
18 successors(Some(ty), move |ty| deref(db, resolver, ty)) 20 successors(Some(ty), move |ty| deref(db, resolver, ty)).take(AUTODEREF_RECURSION_LIMIT)
19} 21}
20 22
21pub(crate) fn deref( 23pub(crate) fn deref(
diff --git a/crates/ra_hir/src/ty/tests.rs b/crates/ra_hir/src/ty/tests.rs
index 059a73900..7a101d981 100644
--- a/crates/ra_hir/src/ty/tests.rs
+++ b/crates/ra_hir/src/ty/tests.rs
@@ -2768,7 +2768,6 @@ fn test(s: Arc<S>) {
2768 2768
2769#[test] 2769#[test]
2770fn deref_trait_with_inference_var() { 2770fn deref_trait_with_inference_var() {
2771 // std::env::set_var("RUST_BACKTRACE", "1");
2772 let t = type_at( 2771 let t = type_at(
2773 r#" 2772 r#"
2774//- /main.rs 2773//- /main.rs
diff --git a/crates/ra_hir/src/ty/traits.rs b/crates/ra_hir/src/ty/traits.rs
index 6cf3dd70a..9a6349d4b 100644
--- a/crates/ra_hir/src/ty/traits.rs
+++ b/crates/ra_hir/src/ty/traits.rs
@@ -105,7 +105,7 @@ pub(crate) fn implements_query(
105 solution.map(|solution| solution_from_chalk(db, solution)) 105 solution.map(|solution| solution_from_chalk(db, solution))
106} 106}
107 107
108pub(crate) fn normalize( 108pub(crate) fn normalize_query(
109 db: &impl HirDatabase, 109 db: &impl HirDatabase,
110 krate: Crate, 110 krate: Crate,
111 projection: Canonical<ProjectionPredicate>, 111 projection: Canonical<ProjectionPredicate>,