ide_db/
use_trivial_constructor.rs

1//! Functionality for generating trivial constructors
2
3use hir::StructKind;
4use span::Edition;
5use syntax::{
6    ToSmolStr,
7    ast::{Expr, Path, make},
8};
9
10/// given a type return the trivial constructor (if one exists)
11pub fn use_trivial_constructor(
12    db: &crate::RootDatabase,
13    path: Path,
14    ty: &hir::Type<'_>,
15    edition: Edition,
16) -> Option<Expr> {
17    match ty.as_adt() {
18        Some(hir::Adt::Enum(x)) => {
19            if let &[variant] = &*x.variants(db)
20                && variant.kind(db) == hir::StructKind::Unit
21            {
22                let path = make::path_qualified(
23                    path,
24                    make::path_segment(make::name_ref(
25                        &variant.name(db).display_no_db(edition).to_smolstr(),
26                    )),
27                );
28
29                return Some(make::expr_path(path));
30            }
31        }
32        Some(hir::Adt::Struct(x)) if x.kind(db) == StructKind::Unit => {
33            return Some(make::expr_path(path));
34        }
35        _ => {}
36    }
37
38    None
39}