Skip to main content

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, syntax_factory::SyntaxFactory},
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}
40
41pub fn use_trivial_constructor_with_factory(
42    make: &SyntaxFactory,
43    db: &crate::RootDatabase,
44    path: Path,
45    ty: &hir::Type<'_>,
46    edition: Edition,
47) -> Option<Expr> {
48    match ty.as_adt() {
49        Some(hir::Adt::Enum(x)) => {
50            if let &[variant] = &*x.variants(db)
51                && variant.kind(db) == hir::StructKind::Unit
52            {
53                let path = make.path_qualified(
54                    path,
55                    make.path_segment(
56                        make.name_ref(&variant.name(db).display_no_db(edition).to_smolstr()),
57                    ),
58                );
59
60                return Some(make.expr_path(path));
61            }
62        }
63        Some(hir::Adt::Struct(x)) if x.kind(db) == StructKind::Unit => {
64            return Some(make.expr_path(path));
65        }
66        _ => {}
67    }
68
69    None
70}