mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-09-27 20:42:04 +00:00
When resolving labels in break
and continue
for the IDE, do not resolve them textually, instead reuse the results of HIR lowering
This fixes a bug where labels inside macros were not resolved, but more importantly this prepares us to a future where we have hygiene, and textual equivalence isn't enough to resolve identifiers.
This commit is contained in:
parent
9798cf81de
commit
cd7cbddaf6
3 changed files with 40 additions and 24 deletions
|
@ -92,7 +92,7 @@ use hir_def::{
|
|||
keys::{self, Key},
|
||||
DynMap,
|
||||
},
|
||||
hir::{BindingId, LabelId},
|
||||
hir::{BindingId, Expr, LabelId},
|
||||
AdtId, BlockId, ConstId, ConstParamId, DefWithBodyId, EnumId, EnumVariantId, ExternCrateId,
|
||||
FieldId, FunctionId, GenericDefId, GenericParamId, ImplId, LifetimeParamId, Lookup, MacroId,
|
||||
ModuleId, StaticId, StructId, TraitAliasId, TraitId, TypeAliasId, TypeParamId, UnionId, UseId,
|
||||
|
@ -343,6 +343,20 @@ impl SourceToDefCtx<'_, '_> {
|
|||
Some((container, label_id))
|
||||
}
|
||||
|
||||
pub(super) fn label_ref_to_def(
|
||||
&mut self,
|
||||
src: InFile<&ast::Lifetime>,
|
||||
) -> Option<(DefWithBodyId, LabelId)> {
|
||||
let break_or_continue = ast::Expr::cast(src.value.syntax().parent()?)?;
|
||||
let container = self.find_pat_or_label_container(src.syntax_ref())?;
|
||||
let (body, source_map) = self.db.body_with_source_map(container);
|
||||
let break_or_continue = source_map.node_expr(src.with_value(&break_or_continue))?;
|
||||
let (Expr::Break { label, .. } | Expr::Continue { label }) = body[break_or_continue] else {
|
||||
return None;
|
||||
};
|
||||
Some((container, label?))
|
||||
}
|
||||
|
||||
pub(super) fn item_to_macro_call(&mut self, src: InFile<&ast::Item>) -> Option<MacroCallId> {
|
||||
let map = self.dyn_map(src)?;
|
||||
map[keys::ATTR_MACRO_CALL].get(&AstPtr::new(src.value)).copied()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue