Skip to content

Commit 3bb0ff3

Browse files
committed
Add GenericDefId::StaticId
1 parent 55d1d5d commit 3bb0ff3

File tree

13 files changed

+46
-24
lines changed

13 files changed

+46
-24
lines changed

crates/hir-def/src/generics.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ impl GenericParams {
433433
GenericDefId::TraitAliasId(id) => id_to_generics(db, id, enabled_params),
434434
GenericDefId::TypeAliasId(id) => id_to_generics(db, id, enabled_params),
435435
GenericDefId::ImplId(id) => id_to_generics(db, id, enabled_params),
436-
GenericDefId::ConstId(_) => (
436+
GenericDefId::ConstId(_) | GenericDefId::StaticId(_) => (
437437
Arc::new(GenericParams {
438438
type_or_consts: Default::default(),
439439
lifetimes: Default::default(),

crates/hir-def/src/lib.rs

+17-8
Original file line numberDiff line numberDiff line change
@@ -693,6 +693,7 @@ impl TypeOwnerId {
693693
Some(match self {
694694
TypeOwnerId::FunctionId(it) => GenericDefId::FunctionId(it),
695695
TypeOwnerId::ConstId(it) => GenericDefId::ConstId(it),
696+
TypeOwnerId::StaticId(it) => GenericDefId::StaticId(it),
696697
TypeOwnerId::AdtId(it) => GenericDefId::AdtId(it),
697698
TypeOwnerId::TraitId(it) => GenericDefId::TraitId(it),
698699
TypeOwnerId::TraitAliasId(it) => GenericDefId::TraitAliasId(it),
@@ -701,7 +702,7 @@ impl TypeOwnerId {
701702
TypeOwnerId::EnumVariantId(it) => {
702703
GenericDefId::AdtId(AdtId::EnumId(it.lookup(db).parent))
703704
}
704-
TypeOwnerId::InTypeConstId(_) | TypeOwnerId::StaticId(_) => return None,
705+
TypeOwnerId::InTypeConstId(_) => return None,
705706
})
706707
}
707708
}
@@ -743,6 +744,7 @@ impl From<GenericDefId> for TypeOwnerId {
743744
GenericDefId::TypeAliasId(it) => it.into(),
744745
GenericDefId::ImplId(it) => it.into(),
745746
GenericDefId::ConstId(it) => it.into(),
747+
GenericDefId::StaticId(it) => it.into(),
746748
}
747749
}
748750
}
@@ -851,7 +853,7 @@ impl GeneralConstId {
851853
pub fn generic_def(self, db: &dyn DefDatabase) -> Option<GenericDefId> {
852854
match self {
853855
GeneralConstId::ConstId(it) => Some(it.into()),
854-
GeneralConstId::StaticId(_) => None,
856+
GeneralConstId::StaticId(it) => Some(it.into()),
855857
GeneralConstId::ConstBlockId(it) => it.lookup(db).parent.as_generic_def_id(db),
856858
GeneralConstId::InTypeConstId(it) => it.lookup(db).owner.as_generic_def_id(db),
857859
}
@@ -897,7 +899,7 @@ impl DefWithBodyId {
897899
pub fn as_generic_def_id(self, db: &dyn DefDatabase) -> Option<GenericDefId> {
898900
match self {
899901
DefWithBodyId::FunctionId(f) => Some(f.into()),
900-
DefWithBodyId::StaticId(_) => None,
902+
DefWithBodyId::StaticId(s) => Some(s.into()),
901903
DefWithBodyId::ConstId(c) => Some(c.into()),
902904
DefWithBodyId::VariantId(c) => Some(c.lookup(db).parent.into()),
903905
// FIXME: stable rust doesn't allow generics in constants, but we should
@@ -927,18 +929,23 @@ pub enum GenericDefId {
927929
ConstId(ConstId),
928930
FunctionId(FunctionId),
929931
ImplId(ImplId),
932+
// can't actually have generics currently, but they might in the future
933+
// More importantly, this completes the set of items that contain type references
934+
// which is to be used by the signature expression store in the future.
935+
StaticId(StaticId),
930936
TraitAliasId(TraitAliasId),
931937
TraitId(TraitId),
932938
TypeAliasId(TypeAliasId),
933939
}
934940
impl_from!(
935-
FunctionId,
936941
AdtId(StructId, EnumId, UnionId),
937-
TraitId,
938-
TraitAliasId,
939-
TypeAliasId,
942+
ConstId,
943+
FunctionId,
940944
ImplId,
941-
ConstId
945+
StaticId,
946+
TraitAliasId,
947+
TraitId,
948+
TypeAliasId
942949
for GenericDefId
943950
);
944951

@@ -969,6 +976,7 @@ impl GenericDefId {
969976
GenericDefId::TraitAliasId(it) => file_id_and_params_of_item_loc(db, it),
970977
GenericDefId::ImplId(it) => file_id_and_params_of_item_loc(db, it),
971978
GenericDefId::ConstId(it) => (it.lookup(db).id.file_id(), None),
979+
GenericDefId::StaticId(it) => (it.lookup(db).id.file_id(), None),
972980
}
973981
}
974982

@@ -1350,6 +1358,7 @@ impl HasModule for GenericDefId {
13501358
GenericDefId::TypeAliasId(it) => it.module(db),
13511359
GenericDefId::ImplId(it) => it.module(db),
13521360
GenericDefId::ConstId(it) => it.module(db),
1361+
GenericDefId::StaticId(it) => it.module(db),
13531362
}
13541363
}
13551364
}

crates/hir-def/src/resolver.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1264,6 +1264,7 @@ impl HasResolver for GenericDefId {
12641264
GenericDefId::TypeAliasId(inner) => inner.resolver(db),
12651265
GenericDefId::ImplId(inner) => inner.resolver(db),
12661266
GenericDefId::ConstId(inner) => inner.resolver(db),
1267+
GenericDefId::StaticId(inner) => inner.resolver(db),
12671268
}
12681269
}
12691270
}

crates/hir-ty/src/generics.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -262,7 +262,8 @@ fn parent_generic_def(db: &dyn DefDatabase, def: GenericDefId) -> Option<Generic
262262
GenericDefId::FunctionId(it) => it.lookup(db).container,
263263
GenericDefId::TypeAliasId(it) => it.lookup(db).container,
264264
GenericDefId::ConstId(it) => it.lookup(db).container,
265-
GenericDefId::AdtId(_)
265+
GenericDefId::StaticId(_)
266+
| GenericDefId::AdtId(_)
266267
| GenericDefId::TraitId(_)
267268
| GenericDefId::ImplId(_)
268269
| GenericDefId::TraitAliasId(_) => return None,

crates/hir-ty/src/infer/path.rs

+4-5
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,9 @@ impl InferenceContext<'_> {
8686
}
8787
};
8888

89-
let generic_def_id = value_def.to_generic_def_id(self.db);
90-
let Some(generic_def) = generic_def_id else {
91-
// `value_def` is the kind of item that can never be generic (i.e. statics, at least
92-
// currently). We can just skip the binders to get its type.
89+
let generic_def = value_def.to_generic_def_id(self.db);
90+
if let GenericDefId::StaticId(_) = generic_def {
91+
// `Static` is the kind of item that can never be generic currently. We can just skip the binders to get its type.
9392
let (ty, binders) = self.db.value_ty(value_def)?.into_value_and_skipped_binders();
9493
stdx::always!(binders.is_empty(Interner), "non-empty binders for non-generic def",);
9594
return Some(ValuePathResolution::NonGeneric(ty));
@@ -122,7 +121,7 @@ impl InferenceContext<'_> {
122121
}
123122

124123
let parent_substs = self_subst.or_else(|| {
125-
let generics = generics(self.db.upcast(), generic_def_id?);
124+
let generics = generics(self.db.upcast(), generic_def);
126125
let parent_params_len = generics.parent_generics()?.len();
127126
let parent_args = &substs[substs.len() - parent_params_len..];
128127
Some(Substitution::from_iter(Interner, parent_args))

crates/hir-ty/src/lower.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -2471,14 +2471,14 @@ pub enum ValueTyDefId {
24712471
impl_from!(FunctionId, StructId, UnionId, EnumVariantId, ConstId, StaticId for ValueTyDefId);
24722472

24732473
impl ValueTyDefId {
2474-
pub(crate) fn to_generic_def_id(self, db: &dyn HirDatabase) -> Option<GenericDefId> {
2474+
pub(crate) fn to_generic_def_id(self, db: &dyn HirDatabase) -> GenericDefId {
24752475
match self {
2476-
Self::FunctionId(id) => Some(id.into()),
2477-
Self::StructId(id) => Some(id.into()),
2478-
Self::UnionId(id) => Some(id.into()),
2479-
Self::EnumVariantId(var) => Some(var.lookup(db.upcast()).parent.into()),
2480-
Self::ConstId(id) => Some(id.into()),
2481-
Self::StaticId(_) => None,
2476+
Self::FunctionId(id) => id.into(),
2477+
Self::StructId(id) => id.into(),
2478+
Self::UnionId(id) => id.into(),
2479+
Self::EnumVariantId(var) => var.lookup(db.upcast()).parent.into(),
2480+
Self::ConstId(id) => id.into(),
2481+
Self::StaticId(id) => id.into(),
24822482
}
24832483
}
24842484
}

crates/hir-ty/src/variance.rs

+1
Original file line numberDiff line numberDiff line change
@@ -1028,6 +1028,7 @@ struct FixedPoint<T, U, V>(&'static FixedPoint<(), T, U>, V);
10281028
}
10291029
GenericDefId::ImplId(_) => return None,
10301030
GenericDefId::ConstId(_) => return None,
1031+
GenericDefId::StaticId(_) => return None,
10311032
},
10321033
))
10331034
})

crates/hir/src/from_id.rs

+2
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ impl From<GenericDef> for GenericDefId {
183183
GenericDef::TypeAlias(it) => GenericDefId::TypeAliasId(it.id),
184184
GenericDef::Impl(it) => GenericDefId::ImplId(it.id),
185185
GenericDef::Const(it) => GenericDefId::ConstId(it.id),
186+
GenericDef::Static(it) => GenericDefId::StaticId(it.id),
186187
}
187188
}
188189
}
@@ -197,6 +198,7 @@ impl From<GenericDefId> for GenericDef {
197198
GenericDefId::TypeAliasId(it) => GenericDef::TypeAlias(it.into()),
198199
GenericDefId::ImplId(it) => GenericDef::Impl(it.into()),
199200
GenericDefId::ConstId(it) => GenericDef::Const(it.into()),
201+
GenericDefId::StaticId(it) => GenericDef::Static(it.into()),
200202
}
201203
}
202204
}

crates/hir/src/lib.rs

+5-1
Original file line numberDiff line numberDiff line change
@@ -3455,6 +3455,7 @@ pub enum GenericDef {
34553455
Impl(Impl),
34563456
// consts can have type parameters from their parents (i.e. associated consts of traits)
34573457
Const(Const),
3458+
Static(Static),
34583459
}
34593460
impl_from!(
34603461
Function,
@@ -3463,7 +3464,8 @@ impl_from!(
34633464
TraitAlias,
34643465
TypeAlias,
34653466
Impl,
3466-
Const
3467+
Const,
3468+
Static
34673469
for GenericDef
34683470
);
34693471

@@ -3513,6 +3515,7 @@ impl GenericDef {
35133515
GenericDef::TypeAlias(it) => it.id.into(),
35143516
GenericDef::Impl(it) => it.id.into(),
35153517
GenericDef::Const(it) => it.id.into(),
3518+
GenericDef::Static(it) => it.id.into(),
35163519
}
35173520
}
35183521

@@ -3570,6 +3573,7 @@ impl GenericDef {
35703573
item_tree_source_maps.impl_(id.value).generics()
35713574
}
35723575
GenericDefId::ConstId(_) => return,
3576+
GenericDefId::StaticId(_) => return,
35733577
},
35743578
};
35753579

crates/ide-db/src/defs.rs

+1
Original file line numberDiff line numberDiff line change
@@ -986,6 +986,7 @@ impl From<GenericDef> for Definition {
986986
GenericDef::TypeAlias(it) => it.into(),
987987
GenericDef::Impl(it) => it.into(),
988988
GenericDef::Const(it) => it.into(),
989+
GenericDef::Static(it) => it.into(),
989990
}
990991
}
991992
}

crates/ide-db/src/search.rs

+1
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,7 @@ impl Definition {
354354
hir::GenericDef::TypeAlias(it) => it.source(db).map(|src| src.syntax().cloned()),
355355
hir::GenericDef::Impl(it) => it.source(db).map(|src| src.syntax().cloned()),
356356
hir::GenericDef::Const(it) => it.source(db).map(|src| src.syntax().cloned()),
357+
hir::GenericDef::Static(it) => it.source(db).map(|src| src.syntax().cloned()),
357358
};
358359
return match def {
359360
Some(def) => SearchScope::file_range(

crates/ide/src/hover/render.rs

+1
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,7 @@ fn definition_owner_name(db: &RootDatabase, def: Definition, edition: Edition) -
434434
None => it.name(db),
435435
}
436436
}
437+
hir::GenericDef::Static(it) => Some(it.name(db)),
437438
},
438439
Definition::DeriveHelper(derive_helper) => Some(derive_helper.derive().name(db)),
439440
d => {

crates/ide/src/signature_help.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,9 @@ fn signature_help_for_generics(
321321
format_to!(res.signature, "type {}", it.name(db).display(db, edition));
322322
}
323323
// These don't have generic args that can be specified
324-
hir::GenericDef::Impl(_) | hir::GenericDef::Const(_) => return None,
324+
hir::GenericDef::Impl(_) | hir::GenericDef::Const(_) | hir::GenericDef::Static(_) => {
325+
return None
326+
}
325327
}
326328

327329
let params = generics_def.params(sema.db);

0 commit comments

Comments
 (0)