aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/ra_hir/src/code_model.rs23
-rw-r--r--crates/ra_hir/src/impl_block.rs8
-rw-r--r--crates/ra_hir/src/resolve.rs39
-rw-r--r--crates/ra_hir_def/src/generics.rs3
4 files changed, 34 insertions, 39 deletions
diff --git a/crates/ra_hir/src/code_model.rs b/crates/ra_hir/src/code_model.rs
index 920899dce..e2638cf92 100644
--- a/crates/ra_hir/src/code_model.rs
+++ b/crates/ra_hir/src/code_model.rs
@@ -322,9 +322,7 @@ impl Struct {
322 // take the outer scope... 322 // take the outer scope...
323 let r = self.module(db).resolver(db); 323 let r = self.module(db).resolver(db);
324 // ...and add generic params, if present 324 // ...and add generic params, if present
325 let p = self.generic_params(db); 325 r.push_generic_params_scope(db, self.into())
326 let r = if !p.params.is_empty() { r.push_generic_params_scope(p) } else { r };
327 r
328 } 326 }
329} 327}
330 328
@@ -352,9 +350,7 @@ impl Union {
352 // take the outer scope... 350 // take the outer scope...
353 let r = self.module(db).resolver(db); 351 let r = self.module(db).resolver(db);
354 // ...and add generic params, if present 352 // ...and add generic params, if present
355 let p = self.generic_params(db); 353 r.push_generic_params_scope(db, self.into())
356 let r = if !p.params.is_empty() { r.push_generic_params_scope(p) } else { r };
357 r
358 } 354 }
359} 355}
360 356
@@ -402,8 +398,7 @@ impl Enum {
402 // take the outer scope... 398 // take the outer scope...
403 let r = self.module(db).resolver(db); 399 let r = self.module(db).resolver(db);
404 // ...and add generic params, if present 400 // ...and add generic params, if present
405 let p = self.generic_params(db); 401 let r = r.push_generic_params_scope(db, self.into());
406 let r = if !p.params.is_empty() { r.push_generic_params_scope(p) } else { r };
407 r.push_scope(Scope::AdtScope(self.into())) 402 r.push_scope(Scope::AdtScope(self.into()))
408 } 403 }
409} 404}
@@ -709,9 +704,7 @@ impl Function {
709 // take the outer scope... 704 // take the outer scope...
710 let r = self.container(db).map_or_else(|| self.module(db).resolver(db), |c| c.resolver(db)); 705 let r = self.container(db).map_or_else(|| self.module(db).resolver(db), |c| c.resolver(db));
711 // ...and add generic params, if present 706 // ...and add generic params, if present
712 let p = self.generic_params(db); 707 r.push_generic_params_scope(db, self.into())
713 let r = if !p.params.is_empty() { r.push_generic_params_scope(p) } else { r };
714 r
715 } 708 }
716 709
717 pub fn diagnostics(self, db: &impl HirDatabase, sink: &mut DiagnosticSink) { 710 pub fn diagnostics(self, db: &impl HirDatabase, sink: &mut DiagnosticSink) {
@@ -946,9 +939,7 @@ impl Trait {
946 pub(crate) fn resolver(self, db: &impl DefDatabase) -> Resolver { 939 pub(crate) fn resolver(self, db: &impl DefDatabase) -> Resolver {
947 let r = self.module(db).resolver(db); 940 let r = self.module(db).resolver(db);
948 // add generic params, if present 941 // add generic params, if present
949 let p = self.generic_params(db); 942 r.push_generic_params_scope(db, self.into())
950 let r = if !p.params.is_empty() { r.push_generic_params_scope(p) } else { r };
951 r
952 } 943 }
953} 944}
954 945
@@ -1010,9 +1001,7 @@ impl TypeAlias {
1010 .map(|ib| ib.resolver(db)) 1001 .map(|ib| ib.resolver(db))
1011 .unwrap_or_else(|| self.module(db).resolver(db)); 1002 .unwrap_or_else(|| self.module(db).resolver(db));
1012 // ...and add generic params, if present 1003 // ...and add generic params, if present
1013 let p = self.generic_params(db); 1004 r.push_generic_params_scope(db, self.into())
1014 let r = if !p.params.is_empty() { r.push_generic_params_scope(p) } else { r };
1015 r
1016 } 1005 }
1017} 1006}
1018 1007
diff --git a/crates/ra_hir/src/impl_block.rs b/crates/ra_hir/src/impl_block.rs
index 0513f28a9..492d964a4 100644
--- a/crates/ra_hir/src/impl_block.rs
+++ b/crates/ra_hir/src/impl_block.rs
@@ -5,7 +5,6 @@ use ra_syntax::ast::{self};
5 5
6use crate::{ 6use crate::{
7 db::{AstDatabase, DefDatabase, HirDatabase}, 7 db::{AstDatabase, DefDatabase, HirDatabase},
8 generics::HasGenericParams,
9 resolve::Resolver, 8 resolve::Resolver,
10 ty::Ty, 9 ty::Ty,
11 AssocItem, Crate, HasSource, ImplBlock, Module, Source, TraitRef, 10 AssocItem, Crate, HasSource, ImplBlock, Module, Source, TraitRef,
@@ -52,12 +51,11 @@ impl ImplBlock {
52 Crate { crate_id: self.module(db).id.krate } 51 Crate { crate_id: self.module(db).id.krate }
53 } 52 }
54 53
55 pub(crate) fn resolver(&self, db: &impl DefDatabase) -> Resolver { 54 pub(crate) fn resolver(self, db: &impl DefDatabase) -> Resolver {
56 let r = self.module(db).resolver(db); 55 let r = self.module(db).resolver(db);
57 // add generic params, if present 56 // add generic params, if present
58 let p = self.generic_params(db); 57 let r = r.push_generic_params_scope(db, self.into());
59 let r = if !p.params.is_empty() { r.push_generic_params_scope(p) } else { r }; 58 let r = r.push_impl_block_scope(self);
60 let r = r.push_impl_block_scope(self.clone());
61 r 59 r
62 } 60 }
63} 61}
diff --git a/crates/ra_hir/src/resolve.rs b/crates/ra_hir/src/resolve.rs
index a2fa0bb79..e5e768be9 100644
--- a/crates/ra_hir/src/resolve.rs
+++ b/crates/ra_hir/src/resolve.rs
@@ -14,9 +14,9 @@ use crate::{
14 code_model::Crate, 14 code_model::Crate,
15 db::{DefDatabase, HirDatabase}, 15 db::{DefDatabase, HirDatabase},
16 expr::{ExprScopes, PatId, ScopeId}, 16 expr::{ExprScopes, PatId, ScopeId},
17 generics::GenericParams, 17 generics::{GenericParams, HasGenericParams},
18 Adt, Const, DefWithBody, Enum, EnumVariant, Function, ImplBlock, Local, MacroDef, ModuleDef, 18 Adt, Const, DefWithBody, Enum, EnumVariant, Function, GenericDef, ImplBlock, Local, MacroDef,
19 PerNs, Static, Struct, Trait, TypeAlias, 19 ModuleDef, PerNs, Static, Struct, Trait, TypeAlias,
20}; 20};
21 21
22#[derive(Debug, Clone, Default)] 22#[derive(Debug, Clone, Default)]
@@ -43,7 +43,7 @@ pub(crate) enum Scope {
43 /// All the items and imported names of a module 43 /// All the items and imported names of a module
44 ModuleScope(ModuleItemMap), 44 ModuleScope(ModuleItemMap),
45 /// Brings the generic parameters of an item into scope 45 /// Brings the generic parameters of an item into scope
46 GenericParams(Arc<GenericParams>), 46 GenericParams { def: GenericDef, params: Arc<GenericParams> },
47 /// Brings `Self` in `impl` block into scope 47 /// Brings `Self` in `impl` block into scope
48 ImplBlockScope(ImplBlock), 48 ImplBlockScope(ImplBlock),
49 /// Brings `Self` in enum, struct and union definitions into scope 49 /// Brings `Self` in enum, struct and union definitions into scope
@@ -141,9 +141,9 @@ impl Resolver {
141 for scope in self.scopes.iter().rev() { 141 for scope in self.scopes.iter().rev() {
142 match scope { 142 match scope {
143 Scope::ExprScope(_) => continue, 143 Scope::ExprScope(_) => continue,
144 Scope::GenericParams(_) | Scope::ImplBlockScope(_) if skip_to_mod => continue, 144 Scope::GenericParams { .. } | Scope::ImplBlockScope(_) if skip_to_mod => continue,
145 145
146 Scope::GenericParams(params) => { 146 Scope::GenericParams { params, .. } => {
147 if let Some(param) = params.find_by_name(first_name) { 147 if let Some(param) = params.find_by_name(first_name) {
148 let idx = if path.segments.len() == 1 { None } else { Some(1) }; 148 let idx = if path.segments.len() == 1 { None } else { Some(1) };
149 return Some((TypeNs::GenericParam(param.idx), idx)); 149 return Some((TypeNs::GenericParam(param.idx), idx));
@@ -212,7 +212,7 @@ impl Resolver {
212 match scope { 212 match scope {
213 Scope::AdtScope(_) 213 Scope::AdtScope(_)
214 | Scope::ExprScope(_) 214 | Scope::ExprScope(_)
215 | Scope::GenericParams(_) 215 | Scope::GenericParams { .. }
216 | Scope::ImplBlockScope(_) 216 | Scope::ImplBlockScope(_)
217 if skip_to_mod => 217 if skip_to_mod =>
218 { 218 {
@@ -232,13 +232,13 @@ impl Resolver {
232 } 232 }
233 Scope::ExprScope(_) => continue, 233 Scope::ExprScope(_) => continue,
234 234
235 Scope::GenericParams(params) if n_segments > 1 => { 235 Scope::GenericParams { params, .. } if n_segments > 1 => {
236 if let Some(param) = params.find_by_name(first_name) { 236 if let Some(param) = params.find_by_name(first_name) {
237 let ty = TypeNs::GenericParam(param.idx); 237 let ty = TypeNs::GenericParam(param.idx);
238 return Some(ResolveValueResult::Partial(ty, 1)); 238 return Some(ResolveValueResult::Partial(ty, 1));
239 } 239 }
240 } 240 }
241 Scope::GenericParams(_) => continue, 241 Scope::GenericParams { .. } => continue,
242 242
243 Scope::ImplBlockScope(impl_) if n_segments > 1 => { 243 Scope::ImplBlockScope(impl_) if n_segments > 1 => {
244 if first_name == &name::SELF_TYPE { 244 if first_name == &name::SELF_TYPE {
@@ -361,7 +361,7 @@ impl Resolver {
361 self.scopes 361 self.scopes
362 .iter() 362 .iter()
363 .filter_map(|scope| match scope { 363 .filter_map(|scope| match scope {
364 Scope::GenericParams(params) => Some(params), 364 Scope::GenericParams { params, .. } => Some(params),
365 _ => None, 365 _ => None,
366 }) 366 })
367 .flat_map(|params| params.where_predicates.iter()) 367 .flat_map(|params| params.where_predicates.iter())
@@ -369,7 +369,7 @@ impl Resolver {
369 369
370 pub(crate) fn generic_def(&self) -> Option<crate::generics::GenericDef> { 370 pub(crate) fn generic_def(&self) -> Option<crate::generics::GenericDef> {
371 self.scopes.iter().find_map(|scope| match scope { 371 self.scopes.iter().find_map(|scope| match scope {
372 Scope::GenericParams(params) => Some(params.def.into()), 372 Scope::GenericParams { def, .. } => Some(*def),
373 _ => None, 373 _ => None,
374 }) 374 })
375 } 375 }
@@ -381,8 +381,17 @@ impl Resolver {
381 self 381 self
382 } 382 }
383 383
384 pub(crate) fn push_generic_params_scope(self, params: Arc<GenericParams>) -> Resolver { 384 pub(crate) fn push_generic_params_scope(
385 self.push_scope(Scope::GenericParams(params)) 385 self,
386 db: &impl DefDatabase,
387 def: GenericDef,
388 ) -> Resolver {
389 let params = def.generic_params(db);
390 if params.params.is_empty() {
391 self
392 } else {
393 self.push_scope(Scope::GenericParams { def, params })
394 }
386 } 395 }
387 396
388 pub(crate) fn push_impl_block_scope(self, impl_block: ImplBlock) -> Resolver { 397 pub(crate) fn push_impl_block_scope(self, impl_block: ImplBlock) -> Resolver {
@@ -457,8 +466,8 @@ impl Scope {
457 }); 466 });
458 } 467 }
459 } 468 }
460 Scope::GenericParams(gp) => { 469 Scope::GenericParams { params, .. } => {
461 for param in &gp.params { 470 for param in params.params.iter() {
462 f(param.name.clone(), ScopeDef::GenericParam(param.idx)) 471 f(param.name.clone(), ScopeDef::GenericParam(param.idx))
463 } 472 }
464 } 473 }
diff --git a/crates/ra_hir_def/src/generics.rs b/crates/ra_hir_def/src/generics.rs
index f794eefbc..9e2e4c3cc 100644
--- a/crates/ra_hir_def/src/generics.rs
+++ b/crates/ra_hir_def/src/generics.rs
@@ -25,7 +25,6 @@ pub struct GenericParam {
25/// Data about the generic parameters of a function, struct, impl, etc. 25/// Data about the generic parameters of a function, struct, impl, etc.
26#[derive(Clone, PartialEq, Eq, Debug)] 26#[derive(Clone, PartialEq, Eq, Debug)]
27pub struct GenericParams { 27pub struct GenericParams {
28 pub def: GenericDefId,
29 pub parent_params: Option<Arc<GenericParams>>, 28 pub parent_params: Option<Arc<GenericParams>>,
30 pub params: Vec<GenericParam>, 29 pub params: Vec<GenericParam>,
31 pub where_predicates: Vec<WherePredicate>, 30 pub where_predicates: Vec<WherePredicate>,
@@ -56,7 +55,7 @@ impl GenericParams {
56 parent_params: Option<Arc<GenericParams>>, 55 parent_params: Option<Arc<GenericParams>>,
57 ) -> GenericParams { 56 ) -> GenericParams {
58 let mut generics = 57 let mut generics =
59 GenericParams { def, params: Vec::new(), parent_params, where_predicates: Vec::new() }; 58 GenericParams { params: Vec::new(), parent_params, where_predicates: Vec::new() };
60 let start = generics.parent_params.as_ref().map(|p| p.params.len()).unwrap_or(0) as u32; 59 let start = generics.parent_params.as_ref().map(|p| p.params.len()).unwrap_or(0) as u32;
61 // FIXME: add `: Sized` bound for everything except for `Self` in traits 60 // FIXME: add `: Sized` bound for everything except for `Self` in traits
62 match def { 61 match def {