Merge #11566
11566: minor: Make hir::Local::name infallible r=Veykril a=Veykril bors r+ Co-authored-by: Lukas Wirth <lukastw97@gmail.com>
This commit is contained in:
commit
a153b18d6d
|
@ -2047,10 +2047,13 @@ impl Local {
|
||||||
pub fn is_param(self, db: &dyn HirDatabase) -> bool {
|
pub fn is_param(self, db: &dyn HirDatabase) -> bool {
|
||||||
let src = self.source(db);
|
let src = self.source(db);
|
||||||
match src.value {
|
match src.value {
|
||||||
Either::Left(bind_pat) => {
|
Either::Left(pat) => pat
|
||||||
bind_pat.syntax().ancestors().any(|it| ast::Param::can_cast(it.kind()))
|
.syntax()
|
||||||
}
|
.ancestors()
|
||||||
Either::Right(_self_param) => true,
|
.map(|it| it.kind())
|
||||||
|
.take_while(|&kind| ast::Pat::can_cast(kind) || ast::Param::can_cast(kind))
|
||||||
|
.any(ast::Param::can_cast),
|
||||||
|
Either::Right(_) => true,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2061,17 +2064,19 @@ impl Local {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: why is this an option? It shouldn't be?
|
pub fn name(self, db: &dyn HirDatabase) -> Name {
|
||||||
pub fn name(self, db: &dyn HirDatabase) -> Option<Name> {
|
|
||||||
let body = db.body(self.parent);
|
let body = db.body(self.parent);
|
||||||
match &body[self.pat_id] {
|
match &body[self.pat_id] {
|
||||||
Pat::Bind { name, .. } => Some(name.clone()),
|
Pat::Bind { name, .. } => name.clone(),
|
||||||
_ => None,
|
_ => {
|
||||||
|
stdx::never!("hir::Local is missing a name!");
|
||||||
|
Name::missing()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_self(self, db: &dyn HirDatabase) -> bool {
|
pub fn is_self(self, db: &dyn HirDatabase) -> bool {
|
||||||
self.name(db) == Some(name![self])
|
self.name(db) == name![self]
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_mut(self, db: &dyn HirDatabase) -> bool {
|
pub fn is_mut(self, db: &dyn HirDatabase) -> bool {
|
||||||
|
|
|
@ -480,7 +480,7 @@ fn local(db: &RootDatabase, it: hir::Local) -> Option<Markup> {
|
||||||
let is_mut = if it.is_mut(db) { "mut " } else { "" };
|
let is_mut = if it.is_mut(db) { "mut " } else { "" };
|
||||||
let desc = match it.source(db).value {
|
let desc = match it.source(db).value {
|
||||||
Either::Left(ident) => {
|
Either::Left(ident) => {
|
||||||
let name = it.name(db).unwrap();
|
let name = it.name(db);
|
||||||
let let_kw = if ident
|
let let_kw = if ident
|
||||||
.syntax()
|
.syntax()
|
||||||
.parent()
|
.parent()
|
||||||
|
|
|
@ -390,10 +390,7 @@ impl ToNav for hir::Local {
|
||||||
let FileRange { file_id, range: full_range } =
|
let FileRange { file_id, range: full_range } =
|
||||||
InFile::new(file_id, node).original_file_range(db);
|
InFile::new(file_id, node).original_file_range(db);
|
||||||
|
|
||||||
let name = match self.name(db) {
|
let name = self.name(db).to_smol_str();
|
||||||
Some(it) => it.to_smol_str(),
|
|
||||||
None => "".into(),
|
|
||||||
};
|
|
||||||
let kind = if self.is_self(db) {
|
let kind = if self.is_self(db) {
|
||||||
SymbolKind::SelfParam
|
SymbolKind::SelfParam
|
||||||
} else if self.is_param(db) {
|
} else if self.is_param(db) {
|
||||||
|
|
|
@ -235,10 +235,9 @@ fn highlight_name_ref(
|
||||||
let mut h = match name_class {
|
let mut h = match name_class {
|
||||||
NameRefClass::Definition(def) => {
|
NameRefClass::Definition(def) => {
|
||||||
if let Definition::Local(local) = &def {
|
if let Definition::Local(local) = &def {
|
||||||
if let Some(name) = local.name(db) {
|
let name = local.name(db);
|
||||||
let shadow_count = bindings_shadow_count.entry(name.clone()).or_default();
|
let shadow_count = bindings_shadow_count.entry(name.clone()).or_default();
|
||||||
*binding_hash = Some(calc_binding_hash(&name, *shadow_count))
|
*binding_hash = Some(calc_binding_hash(&name, *shadow_count))
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut h = highlight_def(sema, krate, def);
|
let mut h = highlight_def(sema, krate, def);
|
||||||
|
@ -288,11 +287,10 @@ fn highlight_name(
|
||||||
) -> Highlight {
|
) -> Highlight {
|
||||||
let name_kind = NameClass::classify(sema, &name);
|
let name_kind = NameClass::classify(sema, &name);
|
||||||
if let Some(NameClass::Definition(Definition::Local(local))) = &name_kind {
|
if let Some(NameClass::Definition(Definition::Local(local))) = &name_kind {
|
||||||
if let Some(name) = local.name(sema.db) {
|
let name = local.name(sema.db);
|
||||||
let shadow_count = bindings_shadow_count.entry(name.clone()).or_default();
|
let shadow_count = bindings_shadow_count.entry(name.clone()).or_default();
|
||||||
*shadow_count += 1;
|
*shadow_count += 1;
|
||||||
*binding_hash = Some(calc_binding_hash(&name, *shadow_count))
|
*binding_hash = Some(calc_binding_hash(&name, *shadow_count))
|
||||||
}
|
|
||||||
};
|
};
|
||||||
match name_kind {
|
match name_kind {
|
||||||
Some(NameClass::Definition(def)) => {
|
Some(NameClass::Definition(def)) => {
|
||||||
|
|
|
@ -393,7 +393,7 @@ impl Param {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn to_param(&self, ctx: &AssistContext, module: hir::Module) -> ast::Param {
|
fn to_param(&self, ctx: &AssistContext, module: hir::Module) -> ast::Param {
|
||||||
let var = self.var.name(ctx.db()).unwrap().to_string();
|
let var = self.var.name(ctx.db()).to_string();
|
||||||
let var_name = make::name(&var);
|
let var_name = make::name(&var);
|
||||||
let pat = match self.kind() {
|
let pat = match self.kind() {
|
||||||
ParamKind::MutValue => make::ident_pat(false, true, var_name),
|
ParamKind::MutValue => make::ident_pat(false, true, var_name),
|
||||||
|
@ -1144,12 +1144,12 @@ fn make_call(ctx: &AssistContext, fun: &Function, indent: IndentLevel) -> String
|
||||||
match fun.outliving_locals.as_slice() {
|
match fun.outliving_locals.as_slice() {
|
||||||
[] => {}
|
[] => {}
|
||||||
[var] => {
|
[var] => {
|
||||||
format_to!(buf, "let {}{} = ", mut_modifier(var), var.local.name(ctx.db()).unwrap())
|
format_to!(buf, "let {}{} = ", mut_modifier(var), var.local.name(ctx.db()))
|
||||||
}
|
}
|
||||||
vars => {
|
vars => {
|
||||||
buf.push_str("let (");
|
buf.push_str("let (");
|
||||||
let bindings = vars.iter().format_with(", ", |local, f| {
|
let bindings = vars.iter().format_with(", ", |local, f| {
|
||||||
f(&format_args!("{}{}", mut_modifier(local), local.local.name(ctx.db()).unwrap()))
|
f(&format_args!("{}{}", mut_modifier(local), local.local.name(ctx.db())))
|
||||||
});
|
});
|
||||||
format_to!(buf, "{}", bindings);
|
format_to!(buf, "{}", bindings);
|
||||||
buf.push_str(") = ");
|
buf.push_str(") = ");
|
||||||
|
@ -1288,7 +1288,7 @@ impl FlowHandler {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn path_expr_from_local(ctx: &AssistContext, var: Local) -> ast::Expr {
|
fn path_expr_from_local(ctx: &AssistContext, var: Local) -> ast::Expr {
|
||||||
let name = var.name(ctx.db()).unwrap().to_string();
|
let name = var.name(ctx.db()).to_string();
|
||||||
make::expr_path(make::ext::ident_path(&name))
|
make::expr_path(make::ext::ident_path(&name))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -106,7 +106,7 @@ impl Definition {
|
||||||
Definition::TypeAlias(it) => it.name(db),
|
Definition::TypeAlias(it) => it.name(db),
|
||||||
Definition::BuiltinType(it) => it.name(),
|
Definition::BuiltinType(it) => it.name(),
|
||||||
Definition::SelfType(_) => return None,
|
Definition::SelfType(_) => return None,
|
||||||
Definition::Local(it) => it.name(db)?,
|
Definition::Local(it) => it.name(db),
|
||||||
Definition::GenericParam(it) => it.name(db),
|
Definition::GenericParam(it) => it.name(db),
|
||||||
Definition::Label(it) => it.name(db),
|
Definition::Label(it) => it.name(db),
|
||||||
Definition::BuiltinAttr(_) => return None, // FIXME
|
Definition::BuiltinAttr(_) => return None, // FIXME
|
||||||
|
|
Loading…
Reference in a new issue