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.rs33
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
+}