Skip to content

Commit 0777e89

Browse files
Merge #7644
7644: Primitive completion r=jonas-schievink a=jonas-schievink Fixes #7642 Co-authored-by: Jonas Schievink <[email protected]>
2 parents e0fc2af + e938d76 commit 0777e89

File tree

10 files changed

+89
-29
lines changed

10 files changed

+89
-29
lines changed

crates/completion/src/completions/qualified_path.rs

+33-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ pub(crate) fn complete_qualified_path(acc: &mut Completions, ctx: &CompletionCon
5050
}
5151
}
5252
PathResolution::Def(def @ hir::ModuleDef::Adt(_))
53-
| PathResolution::Def(def @ hir::ModuleDef::TypeAlias(_)) => {
53+
| PathResolution::Def(def @ hir::ModuleDef::TypeAlias(_))
54+
| PathResolution::Def(def @ hir::ModuleDef::BuiltinType(_)) => {
5455
if let hir::ModuleDef::Adt(Adt::Enum(e)) = def {
5556
for variant in e.variants(ctx.db) {
5657
acc.add_enum_variant(ctx, variant, None);
@@ -59,6 +60,13 @@ pub(crate) fn complete_qualified_path(acc: &mut Completions, ctx: &CompletionCon
5960
let ty = match def {
6061
hir::ModuleDef::Adt(adt) => adt.ty(ctx.db),
6162
hir::ModuleDef::TypeAlias(a) => a.ty(ctx.db),
63+
hir::ModuleDef::BuiltinType(builtin) => {
64+
let module = match ctx.scope.module() {
65+
Some(it) => it,
66+
None => return,
67+
};
68+
builtin.ty(ctx.db, module)
69+
}
6270
_ => unreachable!(),
6371
};
6472

@@ -780,4 +788,28 @@ impl Foo {
780788
"#]],
781789
);
782790
}
791+
792+
#[test]
793+
fn completes_primitive_assoc_const() {
794+
check(
795+
r#"
796+
//- /lib.rs crate:lib deps:core
797+
fn f() {
798+
u8::$0
799+
}
800+
801+
//- /core.rs crate:core
802+
#[lang = "u8"]
803+
impl u8 {
804+
pub const MAX: Self = 255;
805+
806+
pub fn func(self) {}
807+
}
808+
"#,
809+
expect![[r#"
810+
ct MAX pub const MAX: Self = 255;
811+
me func(…) -> ()
812+
"#]],
813+
);
814+
}
783815
}

crates/hir/src/code_model.rs

+18-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use base_db::{CrateDisplayName, CrateId, Edition, FileId};
66
use either::Either;
77
use hir_def::{
88
adt::{ReprKind, StructKind, VariantData},
9-
builtin_type::BuiltinType,
109
expr::{BindingAnnotation, LabelId, Pat, PatId},
1110
import_map,
1211
item_tree::ItemTreeNode,
@@ -245,7 +244,7 @@ impl ModuleDef {
245244
ModuleDef::Const(it) => it.name(db),
246245
ModuleDef::Static(it) => it.name(db),
247246

248-
ModuleDef::BuiltinType(it) => Some(it.as_name()),
247+
ModuleDef::BuiltinType(it) => Some(it.name()),
249248
}
250249
}
251250

@@ -994,6 +993,23 @@ impl HasVisibility for TypeAlias {
994993
}
995994
}
996995

996+
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
997+
pub struct BuiltinType {
998+
pub(crate) inner: hir_def::builtin_type::BuiltinType,
999+
}
1000+
1001+
impl BuiltinType {
1002+
pub fn ty(self, db: &dyn HirDatabase, module: Module) -> Type {
1003+
let resolver = module.id.resolver(db.upcast());
1004+
Type::new_with_resolver(db, &resolver, Ty::builtin(self.inner))
1005+
.expect("crate not present in resolver")
1006+
}
1007+
1008+
pub fn name(self) -> Name {
1009+
self.inner.as_name()
1010+
}
1011+
}
1012+
9971013
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
9981014
pub struct MacroDef {
9991015
pub(crate) id: MacroDefId,

crates/hir/src/from_id.rs

+17-4
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ use hir_def::{
1111
};
1212

1313
use crate::{
14-
code_model::GenericParam, Adt, AssocItem, DefWithBody, Field, GenericDef, Label, Local,
15-
MacroDef, ModuleDef, Variant, VariantDef,
14+
code_model::{BuiltinType, GenericParam},
15+
Adt, AssocItem, DefWithBody, Field, GenericDef, Label, Local, MacroDef, ModuleDef, Variant,
16+
VariantDef,
1617
};
1718

1819
macro_rules! from_id {
@@ -111,7 +112,7 @@ impl From<ModuleDefId> for ModuleDef {
111112
ModuleDefId::StaticId(it) => ModuleDef::Static(it.into()),
112113
ModuleDefId::TraitId(it) => ModuleDef::Trait(it.into()),
113114
ModuleDefId::TypeAliasId(it) => ModuleDef::TypeAlias(it.into()),
114-
ModuleDefId::BuiltinType(it) => ModuleDef::BuiltinType(it),
115+
ModuleDefId::BuiltinType(it) => ModuleDef::BuiltinType(it.into()),
115116
}
116117
}
117118
}
@@ -127,7 +128,7 @@ impl From<ModuleDef> for ModuleDefId {
127128
ModuleDef::Static(it) => ModuleDefId::StaticId(it.into()),
128129
ModuleDef::Trait(it) => ModuleDefId::TraitId(it.into()),
129130
ModuleDef::TypeAlias(it) => ModuleDefId::TypeAliasId(it.into()),
130-
ModuleDef::BuiltinType(it) => ModuleDefId::BuiltinType(it),
131+
ModuleDef::BuiltinType(it) => ModuleDefId::BuiltinType(it.into()),
131132
}
132133
}
133134
}
@@ -274,3 +275,15 @@ impl From<ModuleDef> for ItemInNs {
274275
}
275276
}
276277
}
278+
279+
impl From<hir_def::builtin_type::BuiltinType> for BuiltinType {
280+
fn from(inner: hir_def::builtin_type::BuiltinType) -> Self {
281+
Self { inner }
282+
}
283+
}
284+
285+
impl From<BuiltinType> for hir_def::builtin_type::BuiltinType {
286+
fn from(it: BuiltinType) -> Self {
287+
it.inner
288+
}
289+
}

crates/hir/src/semantics.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ impl PathResolution {
4949
match self {
5050
PathResolution::Def(ModuleDef::Adt(adt)) => Some(TypeNs::AdtId((*adt).into())),
5151
PathResolution::Def(ModuleDef::BuiltinType(builtin)) => {
52-
Some(TypeNs::BuiltinType(*builtin))
52+
Some(TypeNs::BuiltinType((*builtin).into()))
5353
}
5454
PathResolution::Def(ModuleDef::Const(_))
5555
| PathResolution::Def(ModuleDef::Variant(_))

crates/hir/src/source_analyzer.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,9 @@ use syntax::{
2828
};
2929

3030
use crate::{
31-
db::HirDatabase, semantics::PathResolution, Adt, Const, Field, Function, Local, MacroDef,
32-
ModuleDef, Static, Struct, Trait, Type, TypeAlias, TypeParam, Variant,
31+
code_model::BuiltinType, db::HirDatabase, semantics::PathResolution, Adt, Const, Field,
32+
Function, Local, MacroDef, ModuleDef, Static, Struct, Trait, Type, TypeAlias, TypeParam,
33+
Variant,
3334
};
3435
use base_db::CrateId;
3536

@@ -479,7 +480,7 @@ fn resolve_hir_path_(
479480
}
480481
TypeNs::EnumVariantId(it) => PathResolution::Def(Variant::from(it).into()),
481482
TypeNs::TypeAliasId(it) => PathResolution::Def(TypeAlias::from(it).into()),
482-
TypeNs::BuiltinType(it) => PathResolution::Def(it.into()),
483+
TypeNs::BuiltinType(it) => PathResolution::Def(BuiltinType::from(it).into()),
483484
TypeNs::TraitId(it) => PathResolution::Def(Trait::from(it).into()),
484485
})
485486
};
@@ -555,7 +556,7 @@ fn resolve_hir_path_qualifier(
555556
TypeNs::AdtSelfType(it) | TypeNs::AdtId(it) => PathResolution::Def(Adt::from(it).into()),
556557
TypeNs::EnumVariantId(it) => PathResolution::Def(Variant::from(it).into()),
557558
TypeNs::TypeAliasId(it) => PathResolution::Def(TypeAlias::from(it).into()),
558-
TypeNs::BuiltinType(it) => PathResolution::Def(it.into()),
559+
TypeNs::BuiltinType(it) => PathResolution::Def(BuiltinType::from(it).into()),
559560
TypeNs::TraitId(it) => PathResolution::Def(Trait::from(it).into()),
560561
})
561562
}

crates/hir_def/src/resolver.rs

+1
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,7 @@ impl Resolver {
361361
}
362362

363363
pub fn krate(&self) -> Option<CrateId> {
364+
// FIXME: can this ever be `None`?
364365
self.module_scope().map(|t| t.0.krate())
365366
}
366367

crates/hir_ty/src/lib.rs

+10
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ use std::{iter, mem, ops::Deref, sync::Arc};
2727

2828
use base_db::{salsa, CrateId};
2929
use hir_def::{
30+
builtin_type::BuiltinType,
3031
expr::ExprId,
3132
type_ref::{Mutability, Rawness},
3233
AdtId, AssocContainerId, DefWithBodyId, FunctionId, GenericDefId, HasModule, LifetimeParamId,
@@ -738,6 +739,15 @@ impl Ty {
738739
Substs(sig.params_and_return),
739740
)
740741
}
742+
pub fn builtin(builtin: BuiltinType) -> Self {
743+
Ty::simple(match builtin {
744+
BuiltinType::Char => TypeCtor::Char,
745+
BuiltinType::Bool => TypeCtor::Bool,
746+
BuiltinType::Str => TypeCtor::Str,
747+
BuiltinType::Int(t) => TypeCtor::Int(IntTy::from(t).into()),
748+
BuiltinType::Float(t) => TypeCtor::Float(FloatTy::from(t).into()),
749+
})
750+
}
741751

742752
pub fn as_reference(&self) -> Option<(&Ty, Mutability)> {
743753
match self {

crates/hir_ty/src/lower.rs

+1-13
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ use test_utils::mark;
2727

2828
use crate::{
2929
db::HirDatabase,
30-
primitive::{FloatTy, IntTy},
3130
utils::{
3231
all_super_trait_refs, associated_type_by_name_including_super_traits, generics,
3332
make_mut_slice, variant_data,
@@ -1051,17 +1050,6 @@ fn type_for_static(db: &dyn HirDatabase, def: StaticId) -> Binders<Ty> {
10511050
Binders::new(0, Ty::from_hir(&ctx, &data.type_ref))
10521051
}
10531052

1054-
/// Build the declared type of a static.
1055-
fn type_for_builtin(def: BuiltinType) -> Ty {
1056-
Ty::simple(match def {
1057-
BuiltinType::Char => TypeCtor::Char,
1058-
BuiltinType::Bool => TypeCtor::Bool,
1059-
BuiltinType::Str => TypeCtor::Str,
1060-
BuiltinType::Int(t) => TypeCtor::Int(IntTy::from(t).into()),
1061-
BuiltinType::Float(t) => TypeCtor::Float(FloatTy::from(t).into()),
1062-
})
1063-
}
1064-
10651053
fn fn_sig_for_struct_constructor(db: &dyn HirDatabase, def: StructId) -> PolyFnSig {
10661054
let struct_data = db.struct_data(def);
10671055
let fields = struct_data.variant_data.fields();
@@ -1186,7 +1174,7 @@ impl_from!(FunctionId, StructId, UnionId, EnumVariantId, ConstId, StaticId for V
11861174
/// namespace.
11871175
pub(crate) fn ty_query(db: &dyn HirDatabase, def: TyDefId) -> Binders<Ty> {
11881176
match def {
1189-
TyDefId::BuiltinType(it) => Binders::new(0, type_for_builtin(it)),
1177+
TyDefId::BuiltinType(it) => Binders::new(0, Ty::builtin(it)),
11901178
TyDefId::AdtId(it) => type_for_adt(db, it),
11911179
TyDefId::TypeAliasId(it) => type_for_type_alias(db, it),
11921180
}

crates/ide/src/doc_links.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,7 @@ use url::Url;
99

1010
use hir::{
1111
db::{DefDatabase, HirDatabase},
12-
Adt, AsAssocItem, AsName, AssocItem, AssocItemContainer, Crate, Field, HasAttrs, ItemInNs,
13-
ModuleDef,
12+
Adt, AsAssocItem, AssocItem, AssocItemContainer, Crate, Field, HasAttrs, ItemInNs, ModuleDef,
1413
};
1514
use ide_db::{
1615
defs::{Definition, NameClass, NameRefClass},
@@ -429,7 +428,7 @@ fn get_symbol_filename(db: &dyn HirDatabase, definition: &ModuleDef) -> Option<S
429428
ModuleDef::Module(_) => "index.html".to_string(),
430429
ModuleDef::Trait(t) => format!("trait.{}.html", t.name(db)),
431430
ModuleDef::TypeAlias(t) => format!("type.{}.html", t.name(db)),
432-
ModuleDef::BuiltinType(t) => format!("primitive.{}.html", t.as_name()),
431+
ModuleDef::BuiltinType(t) => format!("primitive.{}.html", t.name()),
433432
ModuleDef::Function(f) => format!("fn.{}.html", f.name(db)),
434433
ModuleDef::Variant(ev) => {
435434
format!("enum.{}.html#variant.{}", ev.parent_enum(db).name(db), ev.name(db))

crates/ide/src/hover.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ fn hover_for_definition(db: &RootDatabase, def: Definition) -> Option<Markup> {
334334
ModuleDef::Static(it) => from_def_source(db, it, mod_path),
335335
ModuleDef::Trait(it) => from_def_source(db, it, mod_path),
336336
ModuleDef::TypeAlias(it) => from_def_source(db, it, mod_path),
337-
ModuleDef::BuiltinType(it) => Some(Markup::fenced_block(&it)),
337+
ModuleDef::BuiltinType(it) => Some(Markup::fenced_block(&it.name())),
338338
},
339339
Definition::Local(it) => Some(Markup::fenced_block(&it.ty(db).display(db))),
340340
Definition::SelfType(impl_def) => {

0 commit comments

Comments
 (0)