From e74d8f148b805f9f6cb1331d1a96f680948da399 Mon Sep 17 00:00:00 2001 From: Edwin Cheng Date: Sun, 19 May 2019 17:44:29 +0800 Subject: Add default type to GenericParam --- crates/ra_hir/src/generics.rs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/crates/ra_hir/src/generics.rs b/crates/ra_hir/src/generics.rs index c29b96f50..a635c7184 100644 --- a/crates/ra_hir/src/generics.rs +++ b/crates/ra_hir/src/generics.rs @@ -5,7 +5,7 @@ use std::sync::Arc; -use ra_syntax::ast::{self, NameOwner, TypeParamsOwner, TypeBoundsOwner}; +use ra_syntax::ast::{self, NameOwner, TypeParamsOwner, TypeBoundsOwner, DefaultTypeParamOwner}; use crate::{ db::{ HirDatabase, DefDatabase}, @@ -18,6 +18,7 @@ pub struct GenericParam { // FIXME: give generic params proper IDs pub(crate) idx: u32, pub(crate) name: Name, + pub(crate) default: Option, } /// Data about the generic parameters of a function, struct, impl, etc. @@ -68,7 +69,11 @@ impl GenericParams { GenericDef::Enum(it) => generics.fill(&*it.source(db).1, start), GenericDef::Trait(it) => { // traits get the Self type as an implicit first type parameter - generics.params.push(GenericParam { idx: start, name: Name::self_type() }); + generics.params.push(GenericParam { + idx: start, + name: Name::self_type(), + default: None, + }); generics.fill(&*it.source(db).1, start + 1); } GenericDef::TypeAlias(it) => generics.fill(&*it.source(db).1, start), @@ -90,7 +95,9 @@ impl GenericParams { fn fill_params(&mut self, params: &ast::TypeParamList, start: u32) { for (idx, type_param) in params.type_params().enumerate() { let name = type_param.name().map(AsName::as_name).unwrap_or_else(Name::missing); - let param = GenericParam { idx: idx as u32 + start, name: name.clone() }; + let default = type_param.default_type().and_then(|t| t.path()).and_then(Path::from_ast); + + let param = GenericParam { idx: idx as u32 + start, name: name.clone(), default }; self.params.push(param); let type_ref = TypeRef::Path(name.into()); -- cgit v1.2.3