From a600e1df736a323b127d02c63704fc2e5de1e63f Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Thu, 5 Sep 2024 10:53:07 +0200 Subject: [PATCH] Add Definition kind for asm register operand --- crates/ide-db/src/defs.rs | 17 ++++++--- crates/ide-db/src/rename.rs | 2 ++ crates/ide/src/doc_links.rs | 6 ++-- crates/ide/src/moniker.rs | 5 +-- crates/ide/src/navigation_target.rs | 2 ++ .../ide/src/syntax_highlighting/highlight.rs | 1 + crates/ide/src/syntax_highlighting/inject.rs | 1 + .../test_data/highlight_asm.html | 9 +++-- .../test_data/highlight_strings.html | 4 +-- crates/ide/src/syntax_highlighting/tests.rs | 3 +- crates/parser/src/grammar/expressions/atom.rs | 8 +++-- .../test_data/parser/inline/ok/asm_expr.rast | 36 ++++++++++--------- 12 files changed, 59 insertions(+), 35 deletions(-) diff --git a/crates/ide-db/src/defs.rs b/crates/ide-db/src/defs.rs index 3d372bab27..469f83644f 100644 --- a/crates/ide-db/src/defs.rs +++ b/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/crates/ide-db/src/rename.rs b/crates/ide-db/src/rename.rs index 3a1a9aba85..e8299a4a46 100644 --- a/crates/ide-db/src/rename.rs +++ b/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/crates/ide/src/doc_links.rs b/crates/ide/src/doc_links.rs index aa632ab12f..184486ec0a 100644 --- a/crates/ide/src/doc_links.rs +++ b/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/crates/ide/src/moniker.rs b/crates/ide/src/moniker.rs index 69c94bc357..1f996f716d 100644 --- a/crates/ide/src/moniker.rs +++ b/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/crates/ide/src/navigation_target.rs b/crates/ide/src/navigation_target.rs index cf1412560d..eb28b78e60 100644 --- a/crates/ide/src/navigation_target.rs +++ b/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/crates/ide/src/syntax_highlighting/highlight.rs b/crates/ide/src/syntax_highlighting/highlight.rs index 2894cb9cf6..fe1d0b452a 100644 --- a/crates/ide/src/syntax_highlighting/highlight.rs +++ b/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/crates/ide/src/syntax_highlighting/inject.rs b/crates/ide/src/syntax_highlighting/inject.rs index e2b32c17d6..bff52943af 100644 --- a/crates/ide/src/syntax_highlighting/inject.rs +++ b/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/crates/ide/src/syntax_highlighting/test_data/highlight_asm.html b/crates/ide/src/syntax_highlighting/test_data/highlight_asm.html index 1280d78cc8..9cedf012f7 100644 --- a/crates/ide/src/syntax_highlighting/test_data/highlight_asm.html +++ b/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/crates/ide/src/syntax_highlighting/test_data/highlight_strings.html b/crates/ide/src/syntax_highlighting/test_data/highlight_strings.html index ced522e7eb..b387808b29 100644 --- a/crates/ide/src/syntax_highlighting/test_data/highlight_strings.html +++ b/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/crates/ide/src/syntax_highlighting/tests.rs b/crates/ide/src/syntax_highlighting/tests.rs index dbe8de8f91..f47b2115bf 100644 --- a/crates/ide/src/syntax_highlighting/tests.rs +++ b/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/crates/parser/src/grammar/expressions/atom.rs b/crates/parser/src/grammar/expressions/atom.rs index f98ca5f403..d6ccf38e74 100644 --- a/crates/parser/src/grammar/expressions/atom.rs +++ b/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/crates/parser/test_data/parser/inline/ok/asm_expr.rast b/crates/parser/test_data/parser/inline/ok/asm_expr.rast index f4d53fa9ae..2360135db7 100644 --- a/crates/parser/test_data/parser/inline/ok/asm_expr.rast +++ b/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