Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir/src/has_source.rs')
-rw-r--r--crates/hir/src/has_source.rs27
1 files changed, 25 insertions, 2 deletions
diff --git a/crates/hir/src/has_source.rs b/crates/hir/src/has_source.rs
index 7d52a28b91..82c90ac301 100644
--- a/crates/hir/src/has_source.rs
+++ b/crates/hir/src/has_source.rs
@@ -14,8 +14,8 @@ use tt::TextRange;
use crate::{
db::HirDatabase, Adt, Callee, Const, Enum, ExternCrateDecl, Field, FieldSource, Function, Impl,
- Label, LifetimeParam, LocalSource, Macro, Module, Param, SelfParam, Static, Struct, Trait,
- TraitAlias, TypeAlias, TypeOrConstParam, Union, Variant,
+ InlineAsmOperand, Label, LifetimeParam, LocalSource, Macro, Module, Param, SelfParam, Static,
+ Struct, Trait, TraitAlias, TypeAlias, TypeOrConstParam, Union, Variant,
};
pub trait HasSource {
@@ -292,3 +292,26 @@ impl HasSource for ExternCrateDecl {
Some(self.id.lookup(db.upcast()).source(db.upcast()))
}
}
+
+impl HasSource for InlineAsmOperand {
+ type Ast = ast::AsmOperandNamed;
+ fn source(self, db: &dyn HirDatabase) -> Option<InFile<Self::Ast>> {
+ let (_body, source_map) = db.body_with_source_map(self.owner);
+ if let Ok(src) = source_map.expr_syntax(self.expr) {
+ let root = src.file_syntax(db.upcast());
+ return src
+ .map(|ast| match ast.to_node(&root) {
+ ast::Expr::AsmExpr(asm) => asm
+ .asm_pieces()
+ .filter_map(|it| match it {
+ ast::AsmPiece::AsmOperandNamed(it) => Some(it),
+ _ => None,
+ })
+ .nth(self.index),
+ _ => None,
+ })
+ .transpose();
+ }
+ None
+ }
+}