Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-db/src/use_trivial_constructor.rs')
| -rw-r--r-- | crates/ide-db/src/use_trivial_constructor.rs | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/crates/ide-db/src/use_trivial_constructor.rs b/crates/ide-db/src/use_trivial_constructor.rs index a91d436afc..0b94a1fa5a 100644 --- a/crates/ide-db/src/use_trivial_constructor.rs +++ b/crates/ide-db/src/use_trivial_constructor.rs @@ -4,7 +4,7 @@ use hir::StructKind; use span::Edition; use syntax::{ ToSmolStr, - ast::{Expr, Path, make}, + ast::{Expr, Path, make, syntax_factory::SyntaxFactory}, }; /// given a type return the trivial constructor (if one exists) @@ -37,3 +37,34 @@ pub fn use_trivial_constructor( None } + +pub fn use_trivial_constructor_with_factory( + make: &SyntaxFactory, + db: &crate::RootDatabase, + path: Path, + ty: &hir::Type<'_>, + edition: Edition, +) -> Option<Expr> { + match ty.as_adt() { + Some(hir::Adt::Enum(x)) => { + if let &[variant] = &*x.variants(db) + && variant.kind(db) == hir::StructKind::Unit + { + let path = make.path_qualified( + path, + make.path_segment( + make.name_ref(&variant.name(db).display_no_db(edition).to_smolstr()), + ), + ); + + return Some(make.expr_path(path)); + } + } + Some(hir::Adt::Struct(x)) if x.kind(db) == StructKind::Unit => { + return Some(make.expr_path(path)); + } + _ => {} + } + + None +} |