Skip to content

Commit c1e2956

Browse files
committed
Implement glob imports from enums
1 parent 35cfb41 commit c1e2956

File tree

2 files changed

+37
-6
lines changed

2 files changed

+37
-6
lines changed

crates/ra_hir/src/code_model_api.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ impl Enum {
327327
db.enum_data(*self).name.clone()
328328
}
329329

330-
pub fn variants(&self, db: &impl HirDatabase) -> Vec<EnumVariant> {
330+
pub fn variants(&self, db: &impl PersistentHirDatabase) -> Vec<EnumVariant> {
331331
db.enum_data(*self)
332332
.variants
333333
.iter()
@@ -389,7 +389,7 @@ impl EnumVariant {
389389
self.parent
390390
}
391391

392-
pub fn name(&self, db: &impl HirDatabase) -> Option<Name> {
392+
pub fn name(&self, db: &impl PersistentHirDatabase) -> Option<Name> {
393393
db.enum_data(self.parent).variants[self.id].name.clone()
394394
}
395395

crates/ra_hir/src/nameres.rs

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -264,14 +264,45 @@ where
264264
import: &ImportData,
265265
) -> ReachedFixedPoint {
266266
log::debug!("resolving import: {:?}", import);
267-
if import.is_glob {
268-
return ReachedFixedPoint::Yes;
269-
};
270267
let original_module = Module { krate: self.krate, module_id };
271268
let (def, reached_fixedpoint) =
272269
self.result.resolve_path_fp(self.db, original_module, &import.path);
273270

274-
if reached_fixedpoint == ReachedFixedPoint::Yes {
271+
if reached_fixedpoint != ReachedFixedPoint::Yes {
272+
return reached_fixedpoint;
273+
}
274+
275+
if import.is_glob {
276+
log::debug!("glob import: {:?}", import);
277+
match def.take_types() {
278+
Some(ModuleDef::Module(m)) => {
279+
// TODO
280+
}
281+
Some(ModuleDef::Enum(e)) => {
282+
tested_by!(glob_enum);
283+
let variants = e.variants(self.db);
284+
let resolutions = variants.into_iter()
285+
.filter_map(|variant| {
286+
let res = Resolution {
287+
def: PerNs::both(variant.into(), e.into()),
288+
import: Some(import_id),
289+
};
290+
let name = variant.name(self.db)?;
291+
Some((name, res))
292+
})
293+
.collect::<Vec<_>>();
294+
self.update(module_id, |items| {
295+
items.items.extend(resolutions);
296+
});
297+
}
298+
Some(d) => {
299+
log::debug!("glob import {:?} from non-module/enum {:?}", import, d);
300+
}
301+
None => {
302+
log::debug!("glob import {:?} didn't resolve as type", import);
303+
}
304+
}
305+
} else {
275306
let last_segment = import.path.segments.last().unwrap();
276307
let name = import.alias.clone().unwrap_or_else(|| last_segment.name.clone());
277308
log::debug!("resolved import {:?} ({:?}) to {:?}", name, import, def);

0 commit comments

Comments
 (0)