diff --git a/src/tools/rust-analyzer/crates/ide-db/src/defs.rs b/src/tools/rust-analyzer/crates/ide-db/src/defs.rs
index 3d372bab274..469f83644fc 100644
--- a/src/tools/rust-analyzer/crates/ide-db/src/defs.rs
+++ b/src/tools/rust-analyzer/crates/ide-db/src/defs.rs
@@ -51,6 +51,7 @@ pub enum Definition {
ToolModule(ToolModule),
ExternCrateDecl(ExternCrateDecl),
InlineAsmRegOrRegClass(()),
+ InlineAsmRegOperand(()),
}
impl Definition {
@@ -89,7 +90,8 @@ impl Definition {
| Definition::BuiltinLifetime(_)
| Definition::TupleField(_)
| Definition::ToolModule(_)
- | Definition::InlineAsmRegOrRegClass(_) => return None,
+ | Definition::InlineAsmRegOrRegClass(_)
+ | Definition::InlineAsmRegOperand(_) => return None,
};
Some(module)
}
@@ -124,7 +126,8 @@ impl Definition {
| Definition::GenericParam(_)
| Definition::Label(_)
| Definition::DeriveHelper(_)
- | Definition::InlineAsmRegOrRegClass(_) => return None,
+ | Definition::InlineAsmRegOrRegClass(_)
+ | Definition::InlineAsmRegOperand(_) => return None,
};
Some(vis)
}
@@ -153,7 +156,9 @@ impl Definition {
Definition::ToolModule(_) => return None, // FIXME
Definition::DeriveHelper(it) => it.name(db),
Definition::ExternCrateDecl(it) => return it.alias_or_name(db),
- Definition::InlineAsmRegOrRegClass(_) => return None, // FIXME
+ Definition::InlineAsmRegOrRegClass(_) | Definition::InlineAsmRegOperand(_) => {
+ return None
+ } // FIXME
};
Some(name)
}
@@ -216,7 +221,7 @@ impl Definition {
Definition::ToolModule(_) => None,
Definition::DeriveHelper(_) => None,
Definition::TupleField(_) => None,
- Definition::InlineAsmRegOrRegClass(_) => None,
+ Definition::InlineAsmRegOrRegClass(_) | Definition::InlineAsmRegOperand(_) => None,
};
docs.or_else(|| {
@@ -275,6 +280,7 @@ impl Definition {
}
// FIXME
Definition::InlineAsmRegOrRegClass(_) => "inline_asm_reg_or_reg_class".to_owned(),
+ Definition::InlineAsmRegOperand(_) => "inline_asm_reg_operand".to_owned(),
}
}
}
@@ -706,6 +712,9 @@ impl NameRefClass {
NameRefClass::ExternCrateShorthand { krate, decl: extern_crate }
})
},
+ ast::AsmRegSpec(_) => {
+ Some(NameRefClass::Definition(Definition::InlineAsmRegOrRegClass(())))
+ },
_ => None
}
}
diff --git a/src/tools/rust-analyzer/crates/ide-db/src/rename.rs b/src/tools/rust-analyzer/crates/ide-db/src/rename.rs
index 3a1a9aba855..e8299a4a463 100644
--- a/src/tools/rust-analyzer/crates/ide-db/src/rename.rs
+++ b/src/tools/rust-analyzer/crates/ide-db/src/rename.rs
@@ -207,6 +207,8 @@ impl Definition {
| Definition::ToolModule(_)
| Definition::TupleField(_)
| Definition::InlineAsmRegOrRegClass(_) => return None,
+ // FIXME:
+ Definition::InlineAsmRegOperand(_) => return None,
// FIXME: This should be doable in theory
Definition::DeriveHelper(_) => return None,
};
diff --git a/src/tools/rust-analyzer/crates/ide/src/doc_links.rs b/src/tools/rust-analyzer/crates/ide/src/doc_links.rs
index aa632ab12f7..184486ec0a1 100644
--- a/src/tools/rust-analyzer/crates/ide/src/doc_links.rs
+++ b/src/tools/rust-analyzer/crates/ide/src/doc_links.rs
@@ -220,7 +220,8 @@ pub(crate) fn resolve_doc_path_for_def(
| Definition::GenericParam(_)
| Definition::Label(_)
| Definition::DeriveHelper(_)
- | Definition::InlineAsmRegOrRegClass(_) => None,
+ | Definition::InlineAsmRegOrRegClass(_)
+ | Definition::InlineAsmRegOperand(_) => None,
}
.map(Definition::from)
}
@@ -674,7 +675,8 @@ fn filename_and_frag_for_def(
| Definition::BuiltinLifetime(_)
| Definition::ToolModule(_)
| Definition::DeriveHelper(_)
- | Definition::InlineAsmRegOrRegClass(_) => return None,
+ | Definition::InlineAsmRegOrRegClass(_)
+ | Definition::InlineAsmRegOperand(_) => return None,
};
Some((def, res, None))
diff --git a/src/tools/rust-analyzer/crates/ide/src/moniker.rs b/src/tools/rust-analyzer/crates/ide/src/moniker.rs
index 69c94bc3578..1f996f716d0 100644
--- a/src/tools/rust-analyzer/crates/ide/src/moniker.rs
+++ b/src/tools/rust-analyzer/crates/ide/src/moniker.rs
@@ -223,7 +223,7 @@ pub(crate) fn def_to_kind(db: &RootDatabase, def: Definition) -> SymbolInformati
Variable
}
}
- Definition::Label(..) => Variable, // For lack of a better variant
+ Definition::Label(..) | Definition::InlineAsmRegOperand(_) => Variable, // For lack of a better variant
Definition::DeriveHelper(..) => Attribute,
Definition::BuiltinAttr(..) => Attribute,
Definition::ToolModule(..) => Module,
@@ -322,7 +322,8 @@ pub(crate) fn def_to_moniker(
| Definition::BuiltinLifetime(_)
| Definition::BuiltinAttr(_)
| Definition::ToolModule(_)
- | Definition::InlineAsmRegOrRegClass(_) => return None,
+ | Definition::InlineAsmRegOrRegClass(_)
+ | Definition::InlineAsmRegOperand(_) => return None,
Definition::Local(local) => {
if !local.is_param(db) {
diff --git a/src/tools/rust-analyzer/crates/ide/src/navigation_target.rs b/src/tools/rust-analyzer/crates/ide/src/navigation_target.rs
index cf1412560dd..eb28b78e60c 100644
--- a/src/tools/rust-analyzer/crates/ide/src/navigation_target.rs
+++ b/src/tools/rust-analyzer/crates/ide/src/navigation_target.rs
@@ -244,6 +244,8 @@ impl TryToNav for Definition {
| Definition::ToolModule(_)
| Definition::InlineAsmRegOrRegClass(_)
| Definition::BuiltinAttr(_) => None,
+ // FIXME
+ Definition::InlineAsmRegOperand(_) => None,
// FIXME: The focus range should be set to the helper declaration
Definition::DeriveHelper(it) => it.derive().try_to_nav(db),
}
diff --git a/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/highlight.rs b/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/highlight.rs
index 2894cb9cf6d..fe1d0b452ae 100644
--- a/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/highlight.rs
+++ b/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/highlight.rs
@@ -537,6 +537,7 @@ pub(super) fn highlight_def(
Definition::InlineAsmRegOrRegClass(_) => {
Highlight::new(HlTag::Symbol(SymbolKind::InlineAsmRegOrRegClass))
}
+ Definition::InlineAsmRegOperand(_) => Highlight::new(HlTag::Symbol(SymbolKind::Local)),
};
let def_crate = def.krate(db);
diff --git a/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/inject.rs b/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/inject.rs
index e2b32c17d66..bff52943afd 100644
--- a/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/inject.rs
+++ b/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/inject.rs
@@ -316,6 +316,7 @@ fn module_def_to_hl_tag(def: Definition) -> HlTag {
Definition::ToolModule(_) => SymbolKind::ToolModule,
Definition::DeriveHelper(_) => SymbolKind::DeriveHelper,
Definition::InlineAsmRegOrRegClass(_) => SymbolKind::InlineAsmRegOrRegClass,
+ Definition::InlineAsmRegOperand(_) => SymbolKind::Local,
};
HlTag::Symbol(symbol)
}
diff --git a/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/test_data/highlight_asm.html b/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/test_data/highlight_asm.html
index 1280d78cc81..9cedf012f7f 100644
--- a/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/test_data/highlight_asm.html
+++ b/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/test_data/highlight_asm.html
@@ -51,18 +51,17 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
let mut o = 0;
core::arch::asm!(
"%input = OpLoad _ {0}",
- concat!("%result = ", bar, " _ %input"),
+ concat!("%result = ", "bar", " _ %input"),
"OpStore {1} %result",
- in(reg) &foo,
- in(reg) &mut o,
+ in(reg) &foo,
+ in(reg) &mut o,
);
- o
let thread_id: usize;
core::arch::asm!("
mov {0}, gs:[0x30]
mov {0}, [{0}+0x48]
- ", out(reg) thread_id, options(pure, readonly, nostack));
+ ", out(reg) thread_id, options(pure, readonly, nostack));
static UNMAP_BASE: usize;
const MEM_RELEASE: usize;
diff --git a/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/test_data/highlight_strings.html b/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/test_data/highlight_strings.html
index ced522e7ebb..b387808b297 100644
--- a/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/test_data/highlight_strings.html
+++ b/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/test_data/highlight_strings.html
@@ -168,8 +168,8 @@ pre { color: #DCDCCC; background: #3F3F3F; font-size: 22px; padd
core::arch::asm!(
"mov {0}, {1}",
"add {0}, 5",
- out(reg) o,
- in(reg) i,
+ out(reg) o,
+ in(reg) i,
);
const CONSTANT: () = ():
diff --git a/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/tests.rs b/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/tests.rs
index dbe8de8f91f..f47b2115bfc 100644
--- a/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/tests.rs
+++ b/src/tools/rust-analyzer/crates/ide/src/syntax_highlighting/tests.rs
@@ -1287,12 +1287,11 @@ fn main() {
let mut o = 0;
core::arch::asm!(
"%input = OpLoad _ {0}",
- concat!("%result = ", bar, " _ %input"),
+ concat!("%result = ", "bar", " _ %input"),
"OpStore {1} %result",
in(reg) &foo,
in(reg) &mut o,
);
- o
let thread_id: usize;
core::arch::asm!("
diff --git a/src/tools/rust-analyzer/crates/parser/src/grammar/expressions/atom.rs b/src/tools/rust-analyzer/crates/parser/src/grammar/expressions/atom.rs
index f98ca5f4032..d6ccf38e743 100644
--- a/src/tools/rust-analyzer/crates/parser/src/grammar/expressions/atom.rs
+++ b/src/tools/rust-analyzer/crates/parser/src/grammar/expressions/atom.rs
@@ -453,9 +453,13 @@ fn parse_clobber_abi(p: &mut Parser<'_>) {
fn parse_reg(p: &mut Parser<'_>) {
p.expect(T!['(']);
if p.at(T![ident]) {
- name_ref(p)
+ let m = p.start();
+ name_ref(p);
+ m.complete(p, ASM_REG_SPEC);
} else if p.at(T![string]) {
- p.bump_any()
+ let m = p.start();
+ p.bump_any();
+ m.complete(p, ASM_REG_SPEC);
} else {
p.err_and_bump("expected register name");
}
diff --git a/src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/asm_expr.rast b/src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/asm_expr.rast
index f4d53fa9ae6..2360135db7c 100644
--- a/src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/asm_expr.rast
+++ b/src/tools/rust-analyzer/crates/parser/test_data/parser/inline/ok/asm_expr.rast
@@ -35,16 +35,18 @@ SOURCE_FILE
STRING "\"add {x}, {tmp}\""
COMMA ","
WHITESPACE "\n "
- NAME
- IDENT "x"
- WHITESPACE " "
- EQ "="
- WHITESPACE " "
ASM_REG_OPERAND
- INOUT_KW "inout"
+ NAME
+ IDENT "x"
+ WHITESPACE " "
+ EQ "="
+ WHITESPACE " "
+ ASM_DIR_SPEC
+ INOUT_KW "inout"
L_PAREN "("
- NAME_REF
- IDENT "reg"
+ ASM_REG_SPEC
+ NAME_REF
+ IDENT "reg"
R_PAREN ")"
WHITESPACE " "
PATH_EXPR
@@ -54,16 +56,18 @@ SOURCE_FILE
IDENT "x"
COMMA ","
WHITESPACE "\n "
- NAME
- IDENT "tmp"
- WHITESPACE " "
- EQ "="
- WHITESPACE " "
ASM_REG_OPERAND
- OUT_KW "out"
+ NAME
+ IDENT "tmp"
+ WHITESPACE " "
+ EQ "="
+ WHITESPACE " "
+ ASM_DIR_SPEC
+ OUT_KW "out"
L_PAREN "("
- NAME_REF
- IDENT "reg"
+ ASM_REG_SPEC
+ NAME_REF
+ IDENT "reg"
R_PAREN ")"
WHITESPACE " "
UNDERSCORE_EXPR