From 4d650702af224205e2bc8f70330b798c76a061ce Mon Sep 17 00:00:00 2001 From: David Richey Date: Thu, 6 Feb 2025 12:22:58 -0600 Subject: [PATCH] fix: Don't emit empty scip occurrence for builtins --- crates/rust-analyzer/src/cli/scip.rs | 65 +++++++++++++--------------- 1 file changed, 31 insertions(+), 34 deletions(-) diff --git a/crates/rust-analyzer/src/cli/scip.rs b/crates/rust-analyzer/src/cli/scip.rs index ee7b6989751e..fe75872105ae 100644 --- a/crates/rust-analyzer/src/cli/scip.rs +++ b/crates/rust-analyzer/src/cli/scip.rs @@ -139,45 +139,42 @@ impl flags::Scip { let mut occurrences = Vec::new(); let mut symbols = Vec::new(); - tokens.into_iter().for_each(|(text_range, id)| { + for (text_range, id) in tokens.into_iter() { let token = si.tokens.get(id).unwrap(); - let (symbol, enclosing_symbol, is_inherent_impl) = - if let Some(TokenSymbols { symbol, enclosing_symbol, is_inherent_impl }) = - symbol_generator.token_symbols(id, token) - { - (symbol, enclosing_symbol, is_inherent_impl) - } else { - ("".to_owned(), None, false) - }; + let Some(TokenSymbols { symbol, enclosing_symbol, is_inherent_impl }) = + symbol_generator.token_symbols(id, token) + else { + // token did not have a moniker, so there is no reasonable occurrence to emit + // see ide::moniker::def_to_moniker + continue; + }; - if !symbol.is_empty() { - let is_defined_in_this_document = match token.definition { - Some(def) => def.file_id == file_id, - _ => false, - }; - if is_defined_in_this_document { - if token_ids_emitted.insert(id) { - // token_ids_emitted does deduplication. This checks that this results - // in unique emitted symbols, as otherwise references are ambiguous. - let should_emit = record_error_if_symbol_already_used( + let is_defined_in_this_document = match token.definition { + Some(def) => def.file_id == file_id, + _ => false, + }; + if is_defined_in_this_document { + if token_ids_emitted.insert(id) { + // token_ids_emitted does deduplication. This checks that this results + // in unique emitted symbols, as otherwise references are ambiguous. + let should_emit = record_error_if_symbol_already_used( + symbol.clone(), + is_inherent_impl, + relative_path.as_str(), + &line_index, + text_range, + ); + if should_emit { + symbols.push(compute_symbol_info( symbol.clone(), - is_inherent_impl, - relative_path.as_str(), - &line_index, - text_range, - ); - if should_emit { - symbols.push(compute_symbol_info( - symbol.clone(), - enclosing_symbol, - token, - )); - } + enclosing_symbol, + token, + )); } - } else { - token_ids_referenced.insert(id); } + } else { + token_ids_referenced.insert(id); } // If the range of the def and the range of the token are the same, this must be the definition. @@ -202,7 +199,7 @@ impl flags::Scip { special_fields: Default::default(), enclosing_range: Vec::new(), }); - }); + } if occurrences.is_empty() { continue;