diff options
Diffstat (limited to 'crates')
-rw-r--r-- | crates/ra_hir/src/generics.rs | 11 | ||||
-rw-r--r-- | crates/ra_hir/src/ty/lower.rs | 4 | ||||
-rw-r--r-- | crates/ra_hir/src/ty/tests.rs | 24 | ||||
-rw-r--r-- | crates/ra_syntax/src/ast/generated.rs | 7 | ||||
-rw-r--r-- | crates/ra_syntax/src/ast/traits.rs | 6 | ||||
-rw-r--r-- | crates/ra_syntax/src/grammar.ron | 5 |
6 files changed, 38 insertions, 19 deletions
diff --git a/crates/ra_hir/src/generics.rs b/crates/ra_hir/src/generics.rs index 8925ba3a9..78fab1a13 100644 --- a/crates/ra_hir/src/generics.rs +++ b/crates/ra_hir/src/generics.rs | |||
@@ -5,12 +5,9 @@ | |||
5 | 5 | ||
6 | use std::sync::Arc; | 6 | use std::sync::Arc; |
7 | 7 | ||
8 | use hir_def::{ | 8 | use hir_def::type_ref::{TypeBound, TypeRef}; |
9 | path::Path, | ||
10 | type_ref::{TypeBound, TypeRef}, | ||
11 | }; | ||
12 | use hir_expand::name::{self, AsName}; | 9 | use hir_expand::name::{self, AsName}; |
13 | use ra_syntax::ast::{self, DefaultTypeParamOwner, NameOwner, TypeBoundsOwner, TypeParamsOwner}; | 10 | use ra_syntax::ast::{self, NameOwner, TypeBoundsOwner, TypeParamsOwner}; |
14 | 11 | ||
15 | use crate::{ | 12 | use crate::{ |
16 | db::{AstDatabase, DefDatabase, HirDatabase}, | 13 | db::{AstDatabase, DefDatabase, HirDatabase}, |
@@ -24,7 +21,7 @@ pub struct GenericParam { | |||
24 | // FIXME: give generic params proper IDs | 21 | // FIXME: give generic params proper IDs |
25 | pub idx: u32, | 22 | pub idx: u32, |
26 | pub name: Name, | 23 | pub name: Name, |
27 | pub default: Option<Path>, | 24 | pub default: Option<TypeRef>, |
28 | } | 25 | } |
29 | 26 | ||
30 | /// Data about the generic parameters of a function, struct, impl, etc. | 27 | /// Data about the generic parameters of a function, struct, impl, etc. |
@@ -140,7 +137,7 @@ impl GenericParams { | |||
140 | for (idx, type_param) in params.type_params().enumerate() { | 137 | for (idx, type_param) in params.type_params().enumerate() { |
141 | let name = type_param.name().map_or_else(Name::missing, |it| it.as_name()); | 138 | let name = type_param.name().map_or_else(Name::missing, |it| it.as_name()); |
142 | // FIXME: Use `Path::from_src` | 139 | // FIXME: Use `Path::from_src` |
143 | let default = type_param.default_type().and_then(|t| t.path()).and_then(Path::from_ast); | 140 | let default = type_param.default_type().map(TypeRef::from_ast); |
144 | 141 | ||
145 | let param = GenericParam { idx: idx as u32 + start, name: name.clone(), default }; | 142 | let param = GenericParam { idx: idx as u32 + start, name: name.clone(), default }; |
146 | self.params.push(param); | 143 | self.params.push(param); |
diff --git a/crates/ra_hir/src/ty/lower.rs b/crates/ra_hir/src/ty/lower.rs index de3c56097..03db38605 100644 --- a/crates/ra_hir/src/ty/lower.rs +++ b/crates/ra_hir/src/ty/lower.rs | |||
@@ -611,9 +611,7 @@ pub(crate) fn generic_defaults_query(db: &impl HirDatabase, def: GenericDef) -> | |||
611 | let defaults = generic_params | 611 | let defaults = generic_params |
612 | .params_including_parent() | 612 | .params_including_parent() |
613 | .into_iter() | 613 | .into_iter() |
614 | .map(|p| { | 614 | .map(|p| p.default.as_ref().map_or(Ty::Unknown, |t| Ty::from_hir(db, &resolver, t))) |
615 | p.default.as_ref().map_or(Ty::Unknown, |path| Ty::from_hir_path(db, &resolver, path)) | ||
616 | }) | ||
617 | .collect(); | 615 | .collect(); |
618 | 616 | ||
619 | Substs(defaults) | 617 | Substs(defaults) |
diff --git a/crates/ra_hir/src/ty/tests.rs b/crates/ra_hir/src/ty/tests.rs index c1024d03c..abfaffb5e 100644 --- a/crates/ra_hir/src/ty/tests.rs +++ b/crates/ra_hir/src/ty/tests.rs | |||
@@ -1980,6 +1980,30 @@ fn test() { | |||
1980 | } | 1980 | } |
1981 | 1981 | ||
1982 | #[test] | 1982 | #[test] |
1983 | fn infer_associated_method_generics_with_default_tuple_param() { | ||
1984 | let t = type_at( | ||
1985 | r#" | ||
1986 | //- /main.rs | ||
1987 | struct Gen<T=()> { | ||
1988 | val: T | ||
1989 | } | ||
1990 | |||
1991 | impl<T> Gen<T> { | ||
1992 | pub fn make() -> Gen<T> { | ||
1993 | loop { } | ||
1994 | } | ||
1995 | } | ||
1996 | |||
1997 | fn test() { | ||
1998 | let a = Gen::make(); | ||
1999 | a.val<|>; | ||
2000 | } | ||
2001 | "#, | ||
2002 | ); | ||
2003 | assert_eq!(t, "()"); | ||
2004 | } | ||
2005 | |||
2006 | #[test] | ||
1983 | fn infer_associated_method_generics_without_args() { | 2007 | fn infer_associated_method_generics_without_args() { |
1984 | assert_snapshot!( | 2008 | assert_snapshot!( |
1985 | infer(r#" | 2009 | infer(r#" |
diff --git a/crates/ra_syntax/src/ast/generated.rs b/crates/ra_syntax/src/ast/generated.rs index 2b381dcdb..de506d7cd 100644 --- a/crates/ra_syntax/src/ast/generated.rs +++ b/crates/ra_syntax/src/ast/generated.rs | |||
@@ -3625,8 +3625,11 @@ impl AstNode for TypeParam { | |||
3625 | impl ast::NameOwner for TypeParam {} | 3625 | impl ast::NameOwner for TypeParam {} |
3626 | impl ast::AttrsOwner for TypeParam {} | 3626 | impl ast::AttrsOwner for TypeParam {} |
3627 | impl ast::TypeBoundsOwner for TypeParam {} | 3627 | impl ast::TypeBoundsOwner for TypeParam {} |
3628 | impl ast::DefaultTypeParamOwner for TypeParam {} | 3628 | impl TypeParam { |
3629 | impl TypeParam {} | 3629 | pub fn default_type(&self) -> Option<TypeRef> { |
3630 | AstChildren::new(&self.syntax).next() | ||
3631 | } | ||
3632 | } | ||
3630 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] | 3633 | #[derive(Debug, Clone, PartialEq, Eq, Hash)] |
3631 | pub struct TypeParamList { | 3634 | pub struct TypeParamList { |
3632 | pub(crate) syntax: SyntaxNode, | 3635 | pub(crate) syntax: SyntaxNode, |
diff --git a/crates/ra_syntax/src/ast/traits.rs b/crates/ra_syntax/src/ast/traits.rs index c2b005886..f99984fe0 100644 --- a/crates/ra_syntax/src/ast/traits.rs +++ b/crates/ra_syntax/src/ast/traits.rs | |||
@@ -163,9 +163,3 @@ impl Iterator for CommentIter { | |||
163 | self.iter.by_ref().find_map(|el| el.into_token().and_then(ast::Comment::cast)) | 163 | self.iter.by_ref().find_map(|el| el.into_token().and_then(ast::Comment::cast)) |
164 | } | 164 | } |
165 | } | 165 | } |
166 | |||
167 | pub trait DefaultTypeParamOwner: AstNode { | ||
168 | fn default_type(&self) -> Option<ast::PathType> { | ||
169 | child_opt(self) | ||
170 | } | ||
171 | } | ||
diff --git a/crates/ra_syntax/src/grammar.ron b/crates/ra_syntax/src/grammar.ron index 70d85a8e6..88d1dc109 100644 --- a/crates/ra_syntax/src/grammar.ron +++ b/crates/ra_syntax/src/grammar.ron | |||
@@ -587,7 +587,10 @@ Grammar( | |||
587 | ("lifetime_params", "LifetimeParam" ), | 587 | ("lifetime_params", "LifetimeParam" ), |
588 | ] | 588 | ] |
589 | ), | 589 | ), |
590 | "TypeParam": ( traits: ["NameOwner", "AttrsOwner", "TypeBoundsOwner", "DefaultTypeParamOwner"] ), | 590 | "TypeParam": ( |
591 | options: [("default_type", "TypeRef")], | ||
592 | traits: ["NameOwner", "AttrsOwner", "TypeBoundsOwner"], | ||
593 | ), | ||
591 | "LifetimeParam": ( | 594 | "LifetimeParam": ( |
592 | traits: ["AttrsOwner"], | 595 | traits: ["AttrsOwner"], |
593 | ), | 596 | ), |