diff --git a/crates/ide/src/static_index.rs b/crates/ide/src/static_index.rs index 052de0f38e7a..52b201df96cc 100644 --- a/crates/ide/src/static_index.rs +++ b/crates/ide/src/static_index.rs @@ -44,7 +44,15 @@ pub struct ReferenceData { pub struct TokenStaticData { pub documentation: Option, pub hover: Option, + /// The position of the token itself. + /// + /// For example, in `fn foo() {}` this is the position of `foo`. pub definition: Option, + /// The position of the entire definition that this token belongs to. + /// + /// For example, in `fn foo() {}` this is the position from `fn` + /// to the closing brace. + pub definition_body: Option, pub references: Vec, pub moniker: Option, pub display_name: Option, @@ -248,6 +256,10 @@ impl StaticIndex<'_> { definition: def.try_to_nav(&sema).map(UpmappingResult::call_site).map(|it| { FileRange { file_id: it.file_id, range: it.focus_or_full_range() } }), + definition_body: def + .try_to_nav(&sema) + .map(UpmappingResult::call_site) + .map(|it| FileRange { file_id: it.file_id, range: it.full_range }), references: vec![], moniker: current_crate.and_then(|cc| def_to_moniker(self.db, def, cc)), display_name: def diff --git a/crates/rust-analyzer/src/cli/scip.rs b/crates/rust-analyzer/src/cli/scip.rs index 37f83f6dee67..f822efb53d9d 100644 --- a/crates/rust-analyzer/src/cli/scip.rs +++ b/crates/rust-analyzer/src/cli/scip.rs @@ -189,6 +189,13 @@ impl flags::Scip { symbol_roles |= scip_types::SymbolRole::Definition as i32; } + let enclosing_range = match token.definition_body { + Some(def_body) if def_body.file_id == file_id => { + text_range_to_scip_range(&line_index, def_body.range) + } + _ => Vec::new(), + }; + occurrences.push(scip_types::Occurrence { range: text_range_to_scip_range(&line_index, text_range), symbol, @@ -197,7 +204,7 @@ impl flags::Scip { syntax_kind: Default::default(), diagnostics: Vec::new(), special_fields: Default::default(), - enclosing_range: Vec::new(), + enclosing_range, }); } @@ -508,6 +515,7 @@ fn moniker_descriptors(identifier: &MonikerIdentifier) -> Vec