Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/source_analyzer.rs')
-rw-r--r--crates/hir/src/source_analyzer.rs22
1 files changed, 22 insertions, 0 deletions
diff --git a/crates/hir/src/source_analyzer.rs b/crates/hir/src/source_analyzer.rs
index be0116862b..f6f1da1b7d 100644
--- a/crates/hir/src/source_analyzer.rs
+++ b/crates/hir/src/source_analyzer.rs
@@ -904,6 +904,20 @@ impl SourceAnalyzer {
})
}
+ pub(crate) fn resolve_offset_in_asm_template(
+ &self,
+ asm: InFile<&ast::AsmExpr>,
+ offset: TextSize,
+ ) -> Option<(DefWithBodyId, (ExprId, TextRange, usize))> {
+ let (def, _, body_source_map) = self.def.as_ref()?;
+ let (expr, args) = body_source_map.asm_template_args(asm)?;
+ Some(*def).zip(
+ args.iter()
+ .find(|(range, _)| range.contains_inclusive(offset))
+ .map(|(range, idx)| (expr, *range, *idx)),
+ )
+ }
+
pub(crate) fn as_format_args_parts<'a>(
&'a self,
db: &'a dyn HirDatabase,
@@ -927,6 +941,14 @@ impl SourceAnalyzer {
))
}
+ pub(crate) fn as_asm_parts(
+ &self,
+ asm: InFile<&ast::AsmExpr>,
+ ) -> Option<(DefWithBodyId, (ExprId, &[(TextRange, usize)]))> {
+ let (def, _, body_source_map) = self.def.as_ref()?;
+ Some(*def).zip(body_source_map.asm_template_args(asm))
+ }
+
fn resolve_impl_method_or_trait_def(
&self,
db: &dyn HirDatabase,