Skip to content

Commit 653afb9

Browse files
committed
TypeNs contain module
Signed-off-by: Hayashi Mikihiro <[email protected]>
1 parent e3e3b1f commit 653afb9

File tree

5 files changed

+71
-88
lines changed

5 files changed

+71
-88
lines changed

crates/hir-def/src/resolver.rs

+30-45
Original file line numberDiff line numberDiff line change
@@ -102,15 +102,8 @@ pub enum TypeNs {
102102
BuiltinType(BuiltinType),
103103
TraitId(TraitId),
104104
TraitAliasId(TraitAliasId),
105-
// Module belong to type ns, but the resolver is used when all module paths
106-
// are fully resolved.
107-
// ModuleId(ModuleId)
108-
}
109105

110-
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
111-
pub enum ModuleOrTypeNs {
112-
ModuleNs(ModuleId),
113-
TypeNs(TypeNs),
106+
ModuleId(ModuleId),
114107
}
115108

116109
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
@@ -173,7 +166,7 @@ impl Resolver {
173166
&self,
174167
db: &dyn DefDatabase,
175168
path: &Path,
176-
) -> Option<(ModuleOrTypeNs, Option<usize>, Option<ImportOrExternCrate>)> {
169+
) -> Option<(TypeNs, Option<usize>, Option<ImportOrExternCrate>)> {
177170
self.resolve_path_in_type_ns_with_prefix_info(db, path).map(
178171
|(resolution, remaining_segments, import, _)| (resolution, remaining_segments, import),
179172
)
@@ -183,12 +176,8 @@ impl Resolver {
183176
&self,
184177
db: &dyn DefDatabase,
185178
path: &Path,
186-
) -> Option<(
187-
ModuleOrTypeNs,
188-
Option<usize>,
189-
Option<ImportOrExternCrate>,
190-
ResolvePathResultPrefixInfo,
191-
)> {
179+
) -> Option<(TypeNs, Option<usize>, Option<ImportOrExternCrate>, ResolvePathResultPrefixInfo)>
180+
{
192181
let path = match path {
193182
Path::BarePath(mod_path) => mod_path,
194183
Path::Normal(it) => &it.mod_path,
@@ -205,7 +194,7 @@ impl Resolver {
205194
| LangItemTarget::Static(_) => return None,
206195
};
207196
return Some((
208-
ModuleOrTypeNs::TypeNs(type_ns),
197+
type_ns,
209198
seg.as_ref().map(|_| 1),
210199
None,
211200
ResolvePathResultPrefixInfo::default(),
@@ -215,7 +204,7 @@ impl Resolver {
215204
let first_name = path.segments().first()?;
216205
let skip_to_mod = path.kind != PathKind::Plain;
217206
if skip_to_mod {
218-
return self.module_scope.resolve_path_in_module_or_type_ns(db, path);
207+
return self.module_scope.resolve_path_in_type_ns(db, path);
219208
}
220209

221210
let remaining_idx = || {
@@ -228,7 +217,7 @@ impl Resolver {
228217
Scope::GenericParams { params, def } => {
229218
if let Some(id) = params.find_type_by_name(first_name, *def) {
230219
return Some((
231-
ModuleOrTypeNs::TypeNs(TypeNs::GenericParam(id)),
220+
TypeNs::GenericParam(id),
232221
remaining_idx(),
233222
None,
234223
ResolvePathResultPrefixInfo::default(),
@@ -238,7 +227,7 @@ impl Resolver {
238227
&Scope::ImplDefScope(impl_) => {
239228
if *first_name == sym::Self_.clone() {
240229
return Some((
241-
ModuleOrTypeNs::TypeNs(TypeNs::SelfType(impl_)),
230+
TypeNs::SelfType(impl_),
242231
remaining_idx(),
243232
None,
244233
ResolvePathResultPrefixInfo::default(),
@@ -248,24 +237,23 @@ impl Resolver {
248237
&Scope::AdtScope(adt) => {
249238
if *first_name == sym::Self_.clone() {
250239
return Some((
251-
ModuleOrTypeNs::TypeNs(TypeNs::AdtSelfType(adt)),
240+
TypeNs::AdtSelfType(adt),
252241
remaining_idx(),
253242
None,
254243
ResolvePathResultPrefixInfo::default(),
255244
));
256245
}
257246
}
258247
Scope::BlockScope(m) => {
259-
if let Some(res) = m.resolve_path_in_module_or_type_ns(db, path) {
248+
if let Some(res) = m.resolve_path_in_type_ns(db, path) {
260249
let res = match res.0 {
261-
ModuleOrTypeNs::TypeNs(_) => res,
262-
ModuleOrTypeNs::ModuleNs(_) => {
250+
TypeNs::ModuleId(_) => {
263251
if let Some(ModuleDefId::BuiltinType(builtin)) = BUILTIN_SCOPE
264252
.get(first_name)
265253
.and_then(|builtin| builtin.take_types())
266254
{
267255
(
268-
ModuleOrTypeNs::TypeNs(TypeNs::BuiltinType(builtin)),
256+
TypeNs::BuiltinType(builtin),
269257
remaining_idx(),
270258
None,
271259
ResolvePathResultPrefixInfo::default(),
@@ -274,25 +262,26 @@ impl Resolver {
274262
res
275263
}
276264
}
265+
_ => res,
277266
};
278267
return Some(res);
279268
}
280269
}
281270
}
282271
}
283-
self.module_scope.resolve_path_in_module_or_type_ns(db, path)
272+
self.module_scope.resolve_path_in_type_ns(db, path)
284273
}
285274

286275
pub fn resolve_path_in_type_ns_fully(
287276
&self,
288277
db: &dyn DefDatabase,
289278
path: &Path,
290279
) -> Option<TypeNs> {
291-
if let (ModuleOrTypeNs::TypeNs(res), None, _) = self.resolve_path_in_type_ns(db, path)? {
292-
Some(res)
293-
} else {
294-
None
280+
let (res, unresolved, _) = self.resolve_path_in_type_ns(db, path)?;
281+
if unresolved.is_some() {
282+
return None;
295283
}
284+
Some(res)
296285
}
297286

298287
pub fn resolve_visibility(
@@ -1182,24 +1171,20 @@ impl ModuleItemMap {
11821171
}
11831172
}
11841173

1185-
fn resolve_path_in_module_or_type_ns(
1174+
fn resolve_path_in_type_ns(
11861175
&self,
11871176
db: &dyn DefDatabase,
11881177
path: &ModPath,
1189-
) -> Option<(
1190-
ModuleOrTypeNs,
1191-
Option<usize>,
1192-
Option<ImportOrExternCrate>,
1193-
ResolvePathResultPrefixInfo,
1194-
)> {
1178+
) -> Option<(TypeNs, Option<usize>, Option<ImportOrExternCrate>, ResolvePathResultPrefixInfo)>
1179+
{
11951180
let (module_def, idx, prefix_info) = self.def_map.resolve_path_locally(
11961181
&self.local_def_map,
11971182
db,
11981183
self.module_id,
11991184
path,
12001185
BuiltinShadowMode::Other,
12011186
);
1202-
let (res, import) = to_module_or_type_ns(module_def)?;
1187+
let (res, import) = to_type_ns(module_def)?;
12031188
Some((res, idx, import, prefix_info))
12041189
}
12051190
}
@@ -1224,19 +1209,19 @@ fn to_value_ns(per_ns: PerNs) -> Option<(ValueNs, Option<ImportOrGlob>)> {
12241209
Some((res, import))
12251210
}
12261211

1227-
fn to_module_or_type_ns(per_ns: PerNs) -> Option<(ModuleOrTypeNs, Option<ImportOrExternCrate>)> {
1212+
fn to_type_ns(per_ns: PerNs) -> Option<(TypeNs, Option<ImportOrExternCrate>)> {
12281213
let def = per_ns.take_types_full()?;
12291214
let res = match def.def {
1230-
ModuleDefId::AdtId(it) => ModuleOrTypeNs::TypeNs(TypeNs::AdtId(it)),
1231-
ModuleDefId::EnumVariantId(it) => ModuleOrTypeNs::TypeNs(TypeNs::EnumVariantId(it)),
1215+
ModuleDefId::AdtId(it) => TypeNs::AdtId(it),
1216+
ModuleDefId::EnumVariantId(it) => TypeNs::EnumVariantId(it),
12321217

1233-
ModuleDefId::TypeAliasId(it) => ModuleOrTypeNs::TypeNs(TypeNs::TypeAliasId(it)),
1234-
ModuleDefId::BuiltinType(it) => ModuleOrTypeNs::TypeNs(TypeNs::BuiltinType(it)),
1218+
ModuleDefId::TypeAliasId(it) => TypeNs::TypeAliasId(it),
1219+
ModuleDefId::BuiltinType(it) => TypeNs::BuiltinType(it),
12351220

1236-
ModuleDefId::TraitId(it) => ModuleOrTypeNs::TypeNs(TypeNs::TraitId(it)),
1237-
ModuleDefId::TraitAliasId(it) => ModuleOrTypeNs::TypeNs(TypeNs::TraitAliasId(it)),
1221+
ModuleDefId::TraitId(it) => TypeNs::TraitId(it),
1222+
ModuleDefId::TraitAliasId(it) => TypeNs::TraitAliasId(it),
12381223

1239-
ModuleDefId::ModuleId(it) => ModuleOrTypeNs::ModuleNs(it),
1224+
ModuleDefId::ModuleId(it) => TypeNs::ModuleId(it),
12401225

12411226
ModuleDefId::FunctionId(_)
12421227
| ModuleDefId::ConstId(_)

crates/hir-ty/src/infer.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -1648,7 +1648,8 @@ impl<'a> InferenceContext<'a> {
16481648
TypeNs::AdtId(AdtId::EnumId(_))
16491649
| TypeNs::BuiltinType(_)
16501650
| TypeNs::TraitId(_)
1651-
| TypeNs::TraitAliasId(_) => {
1651+
| TypeNs::TraitAliasId(_)
1652+
| TypeNs::ModuleId(_) => {
16521653
// FIXME diagnostic
16531654
(self.err_ty(), None)
16541655
}

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

+7-6
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use hir_def::{
1010
expr_store::HygieneId,
1111
generics::{TypeParamProvenance, WherePredicate, WherePredicateTypeTarget},
1212
path::{GenericArg, GenericArgs, GenericArgsParentheses, Path, PathSegment, PathSegments},
13-
resolver::{ModuleOrTypeNs, ResolveValueResult, TypeNs, ValueNs},
13+
resolver::{ResolveValueResult, TypeNs, ValueNs},
1414
type_ref::{TypeBound, TypeRef, TypesMap},
1515
};
1616
use smallvec::SmallVec;
@@ -285,7 +285,9 @@ impl<'a, 'b> PathLoweringContext<'a, 'b> {
285285
TypeNs::BuiltinType(it) => self.lower_path_inner(it.into(), infer_args),
286286
TypeNs::TypeAliasId(it) => self.lower_path_inner(it.into(), infer_args),
287287
// FIXME: report error
288-
TypeNs::EnumVariantId(_) => return (TyKind::Error.intern(Interner), None),
288+
TypeNs::EnumVariantId(_) | TypeNs::ModuleId(_) => {
289+
return (TyKind::Error.intern(Interner), None);
290+
}
289291
};
290292

291293
self.skip_resolved_segment();
@@ -316,6 +318,9 @@ impl<'a, 'b> PathLoweringContext<'a, 'b> {
316318
TypeNs::BuiltinType(_) => {
317319
prohibit_generics_on_resolved(GenericArgsProhibitedReason::PrimitiveTy)
318320
}
321+
TypeNs::ModuleId(_) => {
322+
prohibit_generics_on_resolved(GenericArgsProhibitedReason::Module)
323+
}
319324
TypeNs::AdtId(_)
320325
| TypeNs::EnumVariantId(_)
321326
| TypeNs::TypeAliasId(_)
@@ -338,10 +343,6 @@ impl<'a, 'b> PathLoweringContext<'a, 'b> {
338343
.resolver
339344
.resolve_path_in_type_ns_with_prefix_info(self.ctx.db.upcast(), self.path)?;
340345

341-
let ModuleOrTypeNs::TypeNs(resolution) = resolution else {
342-
return None;
343-
};
344-
345346
let segments = self.segments;
346347
if segments.is_empty() || matches!(self.path, Path::LangItem(..)) {
347348
// `segments.is_empty()` can occur with `self`.

crates/hir/src/attrs.rs

+3
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,9 @@ fn resolve_assoc_or_field(
207207
// XXX: Do these get resolved?
208208
return None;
209209
}
210+
TypeNs::ModuleId(_) => {
211+
return None;
212+
}
210213
};
211214

212215
// Resolve inherent items first, then trait items, then fields.

crates/hir/src/source_analyzer.rs

+29-36
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use hir_def::{
2525
lower::LowerCtx,
2626
nameres::MacroSubNs,
2727
path::{ModPath, Path, PathKind},
28-
resolver::{ModuleOrTypeNs, Resolver, TypeNs, ValueNs, resolver_for_scope},
28+
resolver::{Resolver, TypeNs, ValueNs, resolver_for_scope},
2929
type_ref::{Mutability, TypesMap, TypesSourceMap},
3030
};
3131
use hir_expand::{
@@ -1384,7 +1384,7 @@ fn resolve_hir_path_(
13841384
resolver.type_owner(),
13851385
)
13861386
.lower_ty_ext(type_ref);
1387-
res.map(|ty_ns| (ModuleOrTypeNs::TypeNs(ty_ns), path.segments().first()))
1387+
res.map(|ty_ns| (ty_ns, path.segments().first()))
13881388
}
13891389
None => {
13901390
let (ty, remaining_idx, _) = resolver.resolve_path_in_type_ns(db.upcast(), path)?;
@@ -1403,30 +1403,26 @@ fn resolve_hir_path_(
14031403

14041404
// If we are in a TypeNs for a Trait, and we have an unresolved name, try to resolve it as a type
14051405
// within the trait's associated types.
1406-
if let (Some(unresolved), ModuleOrTypeNs::TypeNs(TypeNs::TraitId(trait_id))) =
1407-
(&unresolved, &ty)
1408-
{
1406+
if let (Some(unresolved), &TypeNs::TraitId(trait_id)) = (&unresolved, &ty) {
14091407
if let Some(type_alias_id) =
1410-
db.trait_items(*trait_id).associated_type_by_name(unresolved.name)
1408+
db.trait_items(trait_id).associated_type_by_name(unresolved.name)
14111409
{
14121410
return Some(PathResolution::Def(ModuleDefId::from(type_alias_id).into()));
14131411
}
14141412
}
14151413

14161414
let res = match ty {
1417-
ModuleOrTypeNs::TypeNs(ty) => match ty {
1418-
TypeNs::SelfType(it) => PathResolution::SelfType(it.into()),
1419-
TypeNs::GenericParam(id) => PathResolution::TypeParam(id.into()),
1420-
TypeNs::AdtSelfType(it) | TypeNs::AdtId(it) => {
1421-
PathResolution::Def(Adt::from(it).into())
1422-
}
1423-
TypeNs::EnumVariantId(it) => PathResolution::Def(Variant::from(it).into()),
1424-
TypeNs::TypeAliasId(it) => PathResolution::Def(TypeAlias::from(it).into()),
1425-
TypeNs::BuiltinType(it) => PathResolution::Def(BuiltinType::from(it).into()),
1426-
TypeNs::TraitId(it) => PathResolution::Def(Trait::from(it).into()),
1427-
TypeNs::TraitAliasId(it) => PathResolution::Def(TraitAlias::from(it).into()),
1428-
},
1429-
ModuleOrTypeNs::ModuleNs(it) => PathResolution::Def(ModuleDef::Module(it.into())),
1415+
TypeNs::SelfType(it) => PathResolution::SelfType(it.into()),
1416+
TypeNs::GenericParam(id) => PathResolution::TypeParam(id.into()),
1417+
TypeNs::AdtSelfType(it) | TypeNs::AdtId(it) => {
1418+
PathResolution::Def(Adt::from(it).into())
1419+
}
1420+
TypeNs::EnumVariantId(it) => PathResolution::Def(Variant::from(it).into()),
1421+
TypeNs::TypeAliasId(it) => PathResolution::Def(TypeAlias::from(it).into()),
1422+
TypeNs::BuiltinType(it) => PathResolution::Def(BuiltinType::from(it).into()),
1423+
TypeNs::TraitId(it) => PathResolution::Def(Trait::from(it).into()),
1424+
TypeNs::TraitAliasId(it) => PathResolution::Def(TraitAlias::from(it).into()),
1425+
TypeNs::ModuleId(it) => PathResolution::Def(ModuleDef::Module(it.into())),
14301426
};
14311427
match unresolved {
14321428
Some(unresolved) => resolver
@@ -1522,7 +1518,7 @@ fn resolve_hir_path_qualifier(
15221518
resolver.type_owner(),
15231519
)
15241520
.lower_ty_ext(type_ref);
1525-
res.map(|ty_ns| (ModuleOrTypeNs::TypeNs(ty_ns), path.segments().first()))
1521+
res.map(|ty_ns| (ty_ns, path.segments().first()))
15261522
}
15271523
None => {
15281524
let (ty, remaining_idx, _) = resolver.resolve_path_in_type_ns(db.upcast(), path)?;
@@ -1541,29 +1537,26 @@ fn resolve_hir_path_qualifier(
15411537

15421538
// If we are in a TypeNs for a Trait, and we have an unresolved name, try to resolve it as a type
15431539
// within the trait's associated types.
1544-
if let (Some(unresolved), &ModuleOrTypeNs::TypeNs(TypeNs::TraitId(trait_id))) =
1545-
(&unresolved, &ty)
1546-
{
1540+
if let (Some(unresolved), &TypeNs::TraitId(trait_id)) = (&unresolved, &ty) {
15471541
if let Some(type_alias_id) =
15481542
db.trait_items(trait_id).associated_type_by_name(unresolved.name)
15491543
{
15501544
return Some(PathResolution::Def(ModuleDefId::from(type_alias_id).into()));
15511545
}
15521546
}
1547+
15531548
let res = match ty {
1554-
ModuleOrTypeNs::TypeNs(ty) => match ty {
1555-
TypeNs::SelfType(it) => PathResolution::SelfType(it.into()),
1556-
TypeNs::GenericParam(id) => PathResolution::TypeParam(id.into()),
1557-
TypeNs::AdtSelfType(it) | TypeNs::AdtId(it) => {
1558-
PathResolution::Def(Adt::from(it).into())
1559-
}
1560-
TypeNs::EnumVariantId(it) => PathResolution::Def(Variant::from(it).into()),
1561-
TypeNs::TypeAliasId(it) => PathResolution::Def(TypeAlias::from(it).into()),
1562-
TypeNs::BuiltinType(it) => PathResolution::Def(BuiltinType::from(it).into()),
1563-
TypeNs::TraitId(it) => PathResolution::Def(Trait::from(it).into()),
1564-
TypeNs::TraitAliasId(it) => PathResolution::Def(TraitAlias::from(it).into()),
1565-
},
1566-
ModuleOrTypeNs::ModuleNs(it) => PathResolution::Def(ModuleDef::Module(it.into())),
1549+
TypeNs::SelfType(it) => PathResolution::SelfType(it.into()),
1550+
TypeNs::GenericParam(id) => PathResolution::TypeParam(id.into()),
1551+
TypeNs::AdtSelfType(it) | TypeNs::AdtId(it) => {
1552+
PathResolution::Def(Adt::from(it).into())
1553+
}
1554+
TypeNs::EnumVariantId(it) => PathResolution::Def(Variant::from(it).into()),
1555+
TypeNs::TypeAliasId(it) => PathResolution::Def(TypeAlias::from(it).into()),
1556+
TypeNs::BuiltinType(it) => PathResolution::Def(BuiltinType::from(it).into()),
1557+
TypeNs::TraitId(it) => PathResolution::Def(Trait::from(it).into()),
1558+
TypeNs::TraitAliasId(it) => PathResolution::Def(TraitAlias::from(it).into()),
1559+
TypeNs::ModuleId(it) => PathResolution::Def(ModuleDef::Module(it.into())),
15671560
};
15681561
match unresolved {
15691562
Some(unresolved) => resolver

0 commit comments

Comments
 (0)