Use Name::missing consistently

This commit is contained in:
Aleksey Kladov 2019-11-27 23:22:20 +03:00
parent c0bb667a7d
commit 1d14fd1737
7 changed files with 33 additions and 52 deletions

View file

@ -330,7 +330,7 @@ impl Struct {
Some(self.module(db).krate()) Some(self.module(db).krate())
} }
pub fn name(self, db: &impl DefDatabase) -> Option<Name> { pub fn name(self, db: &impl DefDatabase) -> Name {
db.struct_data(self.id.into()).name.clone() db.struct_data(self.id.into()).name.clone()
} }
@ -371,7 +371,7 @@ pub struct Union {
} }
impl Union { impl Union {
pub fn name(self, db: &impl DefDatabase) -> Option<Name> { pub fn name(self, db: &impl DefDatabase) -> Name {
db.union_data(self.id).name.clone() db.union_data(self.id).name.clone()
} }
@ -420,7 +420,7 @@ impl Enum {
Some(self.module(db).krate()) Some(self.module(db).krate())
} }
pub fn name(self, db: &impl DefDatabase) -> Option<Name> { pub fn name(self, db: &impl DefDatabase) -> Name {
db.enum_data(self.id).name.clone() db.enum_data(self.id).name.clone()
} }
@ -433,11 +433,8 @@ impl Enum {
} }
pub fn variant(self, db: &impl DefDatabase, name: &Name) -> Option<EnumVariant> { pub fn variant(self, db: &impl DefDatabase, name: &Name) -> Option<EnumVariant> {
db.enum_data(self.id) let id = db.enum_data(self.id).variant(name)?;
.variants Some(EnumVariant { parent: self, id })
.iter()
.find(|(_id, data)| data.name.as_ref() == Some(name))
.map(|(id, _)| EnumVariant { parent: self, id })
} }
pub fn ty(self, db: &impl HirDatabase) -> Type { pub fn ty(self, db: &impl HirDatabase) -> Type {
@ -459,7 +456,7 @@ impl EnumVariant {
self.parent self.parent
} }
pub fn name(self, db: &impl DefDatabase) -> Option<Name> { pub fn name(self, db: &impl DefDatabase) -> Name {
db.enum_data(self.parent.id).variants[self.id].name.clone() db.enum_data(self.parent.id).variants[self.id].name.clone()
} }
@ -720,7 +717,7 @@ impl Trait {
Module { id: self.id.module(db) } Module { id: self.id.module(db) }
} }
pub fn name(self, db: &impl DefDatabase) -> Option<Name> { pub fn name(self, db: &impl DefDatabase) -> Name {
db.trait_data(self.id).name.clone() db.trait_data(self.id).name.clone()
} }

View file

@ -18,19 +18,19 @@ use crate::{
/// Note that we use `StructData` for unions as well! /// Note that we use `StructData` for unions as well!
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]
pub struct StructData { pub struct StructData {
pub name: Option<Name>, pub name: Name,
pub variant_data: Arc<VariantData>, pub variant_data: Arc<VariantData>,
} }
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]
pub struct EnumData { pub struct EnumData {
pub name: Option<Name>, pub name: Name,
pub variants: Arena<LocalEnumVariantId, EnumVariantData>, pub variants: Arena<LocalEnumVariantId, EnumVariantData>,
} }
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]
pub struct EnumVariantData { pub struct EnumVariantData {
pub name: Option<Name>, pub name: Name,
pub variant_data: Arc<VariantData>, pub variant_data: Arc<VariantData>,
} }
@ -51,14 +51,14 @@ pub struct StructFieldData {
impl StructData { impl StructData {
pub(crate) fn struct_data_query(db: &impl DefDatabase, id: StructId) -> Arc<StructData> { pub(crate) fn struct_data_query(db: &impl DefDatabase, id: StructId) -> Arc<StructData> {
let src = id.source(db); let src = id.source(db);
let name = src.value.name().map(|n| n.as_name()); let name = src.value.name().map_or_else(Name::missing, |n| n.as_name());
let variant_data = VariantData::new(src.value.kind()); let variant_data = VariantData::new(src.value.kind());
let variant_data = Arc::new(variant_data); let variant_data = Arc::new(variant_data);
Arc::new(StructData { name, variant_data }) Arc::new(StructData { name, variant_data })
} }
pub(crate) fn union_data_query(db: &impl DefDatabase, id: UnionId) -> Arc<StructData> { pub(crate) fn union_data_query(db: &impl DefDatabase, id: UnionId) -> Arc<StructData> {
let src = id.source(db); let src = id.source(db);
let name = src.value.name().map(|n| n.as_name()); let name = src.value.name().map_or_else(Name::missing, |n| n.as_name());
let variant_data = VariantData::new( let variant_data = VariantData::new(
src.value src.value
.record_field_def_list() .record_field_def_list()
@ -73,14 +73,14 @@ impl StructData {
impl EnumData { impl EnumData {
pub(crate) fn enum_data_query(db: &impl DefDatabase, e: EnumId) -> Arc<EnumData> { pub(crate) fn enum_data_query(db: &impl DefDatabase, e: EnumId) -> Arc<EnumData> {
let src = e.source(db); let src = e.source(db);
let name = src.value.name().map(|n| n.as_name()); let name = src.value.name().map_or_else(Name::missing, |n| n.as_name());
let mut trace = Trace::new_for_arena(); let mut trace = Trace::new_for_arena();
lower_enum(&mut trace, &src.value); lower_enum(&mut trace, &src.value);
Arc::new(EnumData { name, variants: trace.into_arena() }) Arc::new(EnumData { name, variants: trace.into_arena() })
} }
pub(crate) fn variant(&self, name: &Name) -> Option<LocalEnumVariantId> { pub fn variant(&self, name: &Name) -> Option<LocalEnumVariantId> {
let (id, _) = self.variants.iter().find(|(_id, data)| data.name.as_ref() == Some(name))?; let (id, _) = self.variants.iter().find(|(_id, data)| &data.name == name)?;
Some(id) Some(id)
} }
} }
@ -104,7 +104,7 @@ fn lower_enum(
trace.alloc( trace.alloc(
|| var.clone(), || var.clone(),
|| EnumVariantData { || EnumVariantData {
name: var.name().map(|it| it.as_name()), name: var.name().map_or_else(Name::missing, |it| it.as_name()),
variant_data: Arc::new(VariantData::new(var.kind())), variant_data: Arc::new(VariantData::new(var.kind())),
}, },
); );

View file

@ -86,7 +86,7 @@ impl TypeAliasData {
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]
pub struct TraitData { pub struct TraitData {
pub name: Option<Name>, pub name: Name,
pub items: Vec<(Name, AssocItemId)>, pub items: Vec<(Name, AssocItemId)>,
pub auto: bool, pub auto: bool,
} }
@ -94,7 +94,7 @@ pub struct TraitData {
impl TraitData { impl TraitData {
pub(crate) fn trait_data_query(db: &impl DefDatabase, tr: TraitId) -> Arc<TraitData> { pub(crate) fn trait_data_query(db: &impl DefDatabase, tr: TraitId) -> Arc<TraitData> {
let src = tr.source(db); let src = tr.source(db);
let name = src.value.name().map(|n| n.as_name()); let name = src.value.name().map_or_else(Name::missing, |n| n.as_name());
let auto = src.value.is_auto(); let auto = src.value.is_auto();
let ast_id_map = db.ast_id_map(src.file_id); let ast_id_map = db.ast_id_map(src.file_id);
@ -104,7 +104,7 @@ impl TraitData {
.impl_items() .impl_items()
.map(|item_node| match item_node { .map(|item_node| match item_node {
ast::ImplItem::FnDef(it) => { ast::ImplItem::FnDef(it) => {
let name = it.name().map(|it| it.as_name()).unwrap_or_else(Name::missing); let name = it.name().map_or_else(Name::missing, |it| it.as_name());
let def = FunctionLoc { let def = FunctionLoc {
container, container,
ast_id: AstId::new(src.file_id, ast_id_map.ast_id(&it)), ast_id: AstId::new(src.file_id, ast_id_map.ast_id(&it)),
@ -114,7 +114,7 @@ impl TraitData {
(name, def) (name, def)
} }
ast::ImplItem::ConstDef(it) => { ast::ImplItem::ConstDef(it) => {
let name = it.name().map(|it| it.as_name()).unwrap_or_else(Name::missing); let name = it.name().map_or_else(Name::missing, |it| it.as_name());
let def = ConstLoc { let def = ConstLoc {
container, container,
ast_id: AstId::new(src.file_id, ast_id_map.ast_id(&it)), ast_id: AstId::new(src.file_id, ast_id_map.ast_id(&it)),
@ -124,7 +124,7 @@ impl TraitData {
(name, def) (name, def)
} }
ast::ImplItem::TypeAliasDef(it) => { ast::ImplItem::TypeAliasDef(it) => {
let name = it.name().map(|it| it.as_name()).unwrap_or_else(Name::missing); let name = it.name().map_or_else(Name::missing, |it| it.as_name());
let def = TypeAliasLoc { let def = TypeAliasLoc {
container, container,
ast_id: AstId::new(src.file_id, ast_id_map.ast_id(&it)), ast_id: AstId::new(src.file_id, ast_id_map.ast_id(&it)),
@ -214,6 +214,7 @@ impl ImplData {
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]
pub struct ConstData { pub struct ConstData {
/// const _: () = ();
pub name: Option<Name>, pub name: Option<Name>,
pub type_ref: TypeRef, pub type_ref: TypeRef,
} }

View file

@ -362,7 +362,7 @@ where
.variants .variants
.iter() .iter()
.filter_map(|(local_id, variant_data)| { .filter_map(|(local_id, variant_data)| {
let name = variant_data.name.clone()?; let name = variant_data.name.clone();
let variant = EnumVariantId { parent: e, local_id }; let variant = EnumVariantId { parent: e, local_id };
let res = Resolution { let res = Resolution {
def: PerNs::both(variant.into(), variant.into()), def: PerNs::both(variant.into(), variant.into()),

View file

@ -901,12 +901,10 @@ impl HirDisplay for ApplicationTy {
let sig = f.db.callable_item_signature(def); let sig = f.db.callable_item_signature(def);
let name = match def { let name = match def {
CallableDef::FunctionId(ff) => f.db.function_data(ff).name.clone(), CallableDef::FunctionId(ff) => f.db.function_data(ff).name.clone(),
CallableDef::StructId(s) => { CallableDef::StructId(s) => f.db.struct_data(s).name.clone(),
f.db.struct_data(s).name.clone().unwrap_or_else(Name::missing)
}
CallableDef::EnumVariantId(e) => { CallableDef::EnumVariantId(e) => {
let enum_data = f.db.enum_data(e.parent); let enum_data = f.db.enum_data(e.parent);
enum_data.variants[e.local_id].name.clone().unwrap_or_else(Name::missing) enum_data.variants[e.local_id].name.clone()
} }
}; };
match def { match def {
@ -929,8 +927,7 @@ impl HirDisplay for ApplicationTy {
AdtId::StructId(it) => f.db.struct_data(it).name.clone(), AdtId::StructId(it) => f.db.struct_data(it).name.clone(),
AdtId::UnionId(it) => f.db.union_data(it).name.clone(), AdtId::UnionId(it) => f.db.union_data(it).name.clone(),
AdtId::EnumId(it) => f.db.enum_data(it).name.clone(), AdtId::EnumId(it) => f.db.enum_data(it).name.clone(),
} };
.unwrap_or_else(Name::missing);
write!(f, "{}", name)?; write!(f, "{}", name)?;
if self.parameters.len() > 0 { if self.parameters.len() > 0 {
write!(f, "<")?; write!(f, "<")?;
@ -943,7 +940,7 @@ impl HirDisplay for ApplicationTy {
ContainerId::TraitId(it) => it, ContainerId::TraitId(it) => it,
_ => panic!("not an associated type"), _ => panic!("not an associated type"),
}; };
let trait_name = f.db.trait_data(trait_).name.clone().unwrap_or_else(Name::missing); let trait_name = f.db.trait_data(trait_).name.clone();
let name = f.db.type_alias_data(type_alias).name.clone(); let name = f.db.type_alias_data(type_alias).name.clone();
write!(f, "{}::{}", trait_name, name)?; write!(f, "{}::{}", trait_name, name)?;
if self.parameters.len() > 0 { if self.parameters.len() > 0 {
@ -971,8 +968,7 @@ impl HirDisplay for ProjectionTy {
return write!(f, ""); return write!(f, "");
} }
let trait_name = let trait_name = f.db.trait_data(self.trait_(f.db)).name.clone();
f.db.trait_data(self.trait_(f.db)).name.clone().unwrap_or_else(Name::missing);
write!(f, "<{} as {}", self.parameters[0].display(f.db), trait_name,)?; write!(f, "<{} as {}", self.parameters[0].display(f.db), trait_name,)?;
if self.parameters.len() > 1 { if self.parameters.len() > 1 {
write!(f, "<")?; write!(f, "<")?;
@ -1021,14 +1017,7 @@ impl HirDisplay for Ty {
// We assume that the self type is $0 (i.e. the // We assume that the self type is $0 (i.e. the
// existential) here, which is the only thing that's // existential) here, which is the only thing that's
// possible in actual Rust, and hence don't print it // possible in actual Rust, and hence don't print it
write!( write!(f, "{}", f.db.trait_data(trait_ref.trait_).name.clone())?;
f,
"{}",
f.db.trait_data(trait_ref.trait_)
.name
.clone()
.unwrap_or_else(Name::missing)
)?;
if trait_ref.substs.len() > 1 { if trait_ref.substs.len() > 1 {
write!(f, "<")?; write!(f, "<")?;
f.write_joined(&trait_ref.substs[1..], ", ")?; f.write_joined(&trait_ref.substs[1..], ", ")?;
@ -1088,7 +1077,7 @@ impl TraitRef {
} else { } else {
write!(f, ": ")?; write!(f, ": ")?;
} }
write!(f, "{}", f.db.trait_data(self.trait_).name.clone().unwrap_or_else(Name::missing))?; write!(f, "{}", f.db.trait_data(self.trait_).name.clone())?;
if self.substs.len() > 1 { if self.substs.len() > 1 {
write!(f, "<")?; write!(f, "<")?;
f.write_joined(&self.substs[1..], ", ")?; f.write_joined(&self.substs[1..], ", ")?;

View file

@ -267,10 +267,7 @@ impl Completions {
pub(crate) fn add_enum_variant(&mut self, ctx: &CompletionContext, variant: hir::EnumVariant) { pub(crate) fn add_enum_variant(&mut self, ctx: &CompletionContext, variant: hir::EnumVariant) {
let is_deprecated = is_deprecated(variant, ctx.db); let is_deprecated = is_deprecated(variant, ctx.db);
let name = match variant.name(ctx.db) { let name = variant.name(ctx.db);
Some(it) => it,
None => return,
};
let detail_types = variant.fields(ctx.db).into_iter().map(|field| field.ty(ctx.db)); let detail_types = variant.fields(ctx.db).into_iter().map(|field| field.ty(ctx.db));
let detail = join(detail_types.map(|t| t.display(ctx.db).to_string())) let detail = join(detail_types.map(|t| t.display(ctx.db).to_string()))
.separator(", ") .separator(", ")

View file

@ -93,12 +93,9 @@ impl FunctionSignature {
_ => (), _ => (),
}; };
let parent_name = match variant.parent_enum(db).name(db) { let parent_name = variant.parent_enum(db).name(db).to_string();
Some(name) => name.to_string(),
None => "missing".into(),
};
let name = format!("{}::{}", parent_name, variant.name(db).unwrap()); let name = format!("{}::{}", parent_name, variant.name(db));
let params = variant let params = variant
.fields(db) .fields(db)